AudioQueue を使用したリアルタイム音声ストリーム再生の実装

AudioQueueを使用してリアルタイムに音声ストリーミングを再生する手順は次のとおりです。

  1. AudioQueueのインスタンスを作成する.
var queue: AudioQueueRef? = nil
let audioFormat = AudioStreamBasicDescription(
mSampleRate: 44100.0,
mFormatID: kAudioFormatLinearPCM,
mFormatFlags: kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked,
mBytesPerPacket: 2,
mFramesPerPacket: 1,
mBytesPerFrame: 2,
mChannelsPerFrame: 1,
mBitsPerChannel: 16,
mReserved: 0
)
let status = AudioQueueNewOutput(&audioFormat, outputCallback, nil, nil, nil, 0, &queue)

ここでオーディオストリームのフォーマットと出力コールバック関数outputCallbackを指定します。

  1. ネイティブの日本語で言い換えてください。 1 つのオプションのみが必要です:outputCallback
func outputCallback(userData: UnsafeMutableRawPointer?, queue: AudioQueueRef, buffer: AudioQueueBufferRef) {
// 从音频流中读取数据到buffer中
// 注意:这里需要保证读取的数据长度不超过buffer的大小,否则可能会导致播放出现问题
// 将buffer加入到queue中,让AudioQueue开始播放
AudioQueueEnqueueBuffer(queue, buffer, 0, nil)
}

AudioQueueが再生用のオーディオデータを取得する必要がある際に、このコールバック関数が呼び出されます。その際、コールバック関数からオーディオストリームからデータをよみとって提供されたバッファに格納し、AudioQueueEnqueueBufferを呼び出してバッファをキューに追加する必要があります。

  1. オーディオ データ バッファの連続的なセットを作成します。
for _ in 0..<kNumberBuffers {
var buffer: AudioQueueBufferRef? = nil
AudioQueueAllocateBuffer(queue, bufferSize, &buffer)
// 将buffer加入到queue中,让AudioQueue开始播放
AudioQueueEnqueueBuffer(queue, buffer, 0, nil)
}

ここでは、再生中に十分なオーディオデータ用バッファを確保するために、特定数のアウディデータバッファを作成する必要があります。

  1. 音声ストリームの再生を開始
AudioQueueStart(queue, nil)

AudioQueueStartメソッドを呼び出してAudioQueueをスタートさせ、オーディオストリームの再生を開始する。

  1. 必要なときは再生を止めてください。
AudioQueueStop(queue, true)

AudioQueueStopメソッドを呼び出して、AudioQueueの再生を停止できます。

以上の手順は、AudioQueueでオーディオストリーミングのリアルタイム再生を実装するための基本的なものです。実際使用するときには、エラー処理やメモリ管理など、他にも処理する必要のある細かい点がいくつかあることに注意してください。

bannerAds