注意:以下の回答は、サーバーからPCMデータを受信した場合にのみ有効です。もちろんこれは決して起こりません。そのため、オーディオのレンダリングとデータの受信の間に、別のステップが必要です:データ変換。
フォーマットによっては、これは多かれ少なかれ難しいかもしれませんが、一般的にこのステップではAudio Converter Servicesを使用する必要があります。
-(void)connection:(NSURLConnection)connection didReceiveData:(NSData)data
は、サーバーからのデータをバッファに書き込む場合にのみ使用する必要があります。再生はこの方法とは関係ありません。
ここで、バッファに保存されたデータを再生するには、RemoteIOとオーディオユニットを使用する必要があります。 Here is a good, comprehensive tutorial。チュートリアルから「レコード」の部分を削除することができます。
あなたが見ることができるように、彼らは再生のためのコールバックを定義します。
callbackStruct.inputProc = playbackCallback;
callbackStruct.inputProcRefCon = self;
status = AudioUnitSetProperty(audioUnit,
kAudioUnitProperty_SetRenderCallback,
kAudioUnitScope_Global,
kOutputBus,
&callbackStruct,
sizeof(callbackStruct));
とplaybackCallback
機能は、次のようになります。
static OSStatus playbackCallback(void *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData) {
for (int i = 0 ; i < ioData->mNumberBuffers; i++){
AudioBuffer buffer = ioData->mBuffers[i];
unsigned char *frameBuffer = buffer.mData;
for (int j = 0; j < inNumberFrames*2; j++){
frameBuffer[j] = getNextPacket();//this here is a function you have to make to get the next chunk of bytes available in the stream buffer
}
}
return noErr;
}
は、基本的にはそれが何をするかとioData
バッファを埋めるためにあります次に再生する必要があるバイトの次のチャンク。新しいデータがない場合(ストリームバッファに十分なデータがない場合、プレイヤーは消音されています)、バッファーをゼロにしてください(沈黙させてください)。
また、alSourceQueueBuffers
とalSourceUnqueueBuffers
を使用してOpenALで同じことを達成することができます。
これだけです。ハッピーコーディング!
キャブあなたは、nsinputstreamに入ってくるバイトのような、来るバイトからausioを再生する方法を説明します。 – sajwan
@valentin Radu私はこのメソッドと別のものからデータを取得しています。 ?事前におかげで親切に役立つ! –