您好,我正在尝试从一台设备录制音频/视频并使用 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
}
另一方面,我再次将数据转换为音频缓冲区列表并使用 AudioUnit 服务进行播放。
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 的传入音频数据的地方。问题是播放的音频非常失真和机械化。我已经在其他项目中测试了 audiounitservices,在该项目中我使用 AudioUnit 服务同时录制和播放音频,并且那里的音频非常清晰。但是通过流发送它就变成了。扭曲的。
此外,当我仅通过流发送音频数据时,它有点清晰,但是当我发送从 avcapturesession 委托接收的图像和音频数据时,音频非常失真。请帮帮我。我做错了什么?我也可以同时而不是在不同时间发送音频/视频数据并在另一边提取吗?