1

您好,我正在尝试从一台设备录制音频/视频并使用 NSStream 发送到另一台设备,我已经创建了 avcapturesession 并生成了音频/视频数据。视频数据可以很好地发送到另一台设备并正确显示,但音频数据非常扭曲,就像非常机器人和跳跃一样。我从 cmsamplebufferref 获得了 audiobufferlist,并将您重新发送的 2048 字节数据发送到另一台设备

    CMBlockBufferRef blockBuffer;
            CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(sampleBuffer, NULL, &currentInputAudioBufferList, 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 委托接收的图像和音频数据时,音频非常失真。请帮帮我。我做错了什么?我也可以同时而不是在不同时间发送音频/视频数据并在另一边提取吗?

4

0 回答 0