こんにちは、あるデバイスからオーディオ/ビデオを記録し、NSStream を使用して別のデバイスに送信しようとしています。avcapturesession を作成し、オーディオ/ビデオ データを生成しました。ビデオ データは正常に別のデバイスに送信され、正しく表示されますが、オーディオ データは非常にロボット的でスキップするように歪んでいます。cmsamplebufferref から audiobufferlist を取得し、2048 バイトのデータを別のデバイスに送信しました
CMBlockBufferRef blockBuffer;
CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(sampleBuffer, NULL, ¤tInputAudioBufferList, sizeof(currentInputAudioBufferList), NULL, NULL, 0, &blockBuffer);
if( captureOutput == _captureAudioOutput ){
for (int y = 0; y < currentInputAudioBufferList.mNumberBuffers; y++) {
AudioBuffer audioBuffer = currentInputAudioBufferList.mBuffers[y];
Float32 *frame = (Float32*)audioBuffer.mData;
[audiodata appendBytes:frame length:audioBuffer.mDataByteSize];
}
[self sendMIxedData:audioData]; // for sending audiodata
}
else {
////// sample buffer to image to NSData
[self sendMIxedData:audioData:imageData]; // for sending images
}
反対側では、再びデータを audiobufferlist に変換し、AudioUnit Services で遊んでいます。
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[0];
UInt32 size = min(buffer.mDataByteSize, THIS->tempBuffer.mDataByteSize);
memcpy(buffer.mData, THIS->tempBuffer.mData, size);
buffer.mDataByteSize = size;
}
return noErr;
}
ここで tempbuffer は、 NSInputStream からの着信オーディオ データを保存する場所です。問題は、再生されるオーディオが非常に歪んでおり、ロボット的であることです。私はAudioUnitサービスと同時にオーディオを録音および再生する他のプロジェクトでaudiounitservicesをテストしましたが、そこではオーディオが非常にクリアです。しかし、ストリームを介して送信すると、次のようになります。歪んだ。
また、ストリームを介して音声データのみを送信すると、少し明確になりますが、avcapturesession デリゲートから受信した画像と音声データの両方を送信すると、音声が非常に歪んでしまいます。助けてください。私は何を間違っていますか?また、オーディオ/ビデオデータを別々の時間ではなく同時に送信し、反対側で抽出することはできますか?