Macos CMSampleBufferRef和AVAssetReaderMixAudioOutput与PCM问题

Macos CMSampleBufferRef和AVAssetReaderMixAudioOutput与PCM问题,macos,cocoa,audio,avfoundation,avassetreader,Macos,Cocoa,Audio,Avfoundation,Avassetreader,因此,我使用AvasseTradermixaudioOutput从quicktime文件中提取音频样本。 在这种情况下,它是一个具有多个音频曲目的ProRes视频 4轨16位交错采样littleEndian@48000 我可以得到视频帧,好的, 但是当我调用[myAssetReaderAudioMixOutput copyNextSampleBuffer] 我遇到了一些奇怪的问题。。。。 返回的音频似乎都在第一个通道中 使用个人trackOutputReader的 第一帧的每个曲目的第一音频样本

因此,我使用AvasseTradermixaudioOutput从quicktime文件中提取音频样本。 在这种情况下,它是一个具有多个音频曲目的ProRes视频

4轨16位交错采样littleEndian@48000

我可以得到视频帧,好的, 但是当我调用[myAssetReaderAudioMixOutput copyNextSampleBuffer] 我遇到了一些奇怪的问题。。。。 返回的音频似乎都在第一个通道中

使用个人trackOutputReader的 第一帧的每个曲目的第一音频样本为:

620B 700E 0000 0000

但当我使用AvasseTradermixaudioOutput时

D219 0000

注意620B+700E=D219 所以看起来AvasseTradermixaudioOutput正在对所有值进行求和 4个频道,并在轨道1中给我结果

有人能解释为什么吗? 如何修复它? 我需要一个解决方案,该解决方案将为我提供quicktime文件中通道的1:1映射, 也就是说,它需要工作的文件,既有1个通道,也有16个通道的音频

我通过对每个音频通道/tack单独执行copyNextSampleBuffer,获得了第一个示例的正确值

这是我用来创建myAssetReaderAudioMixOutput的字典

NSDictionary *outputSettings =
[NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt:kAudioFormatLinearPCM], AVFormatIDKey,
[NSNumber numberWithFloat:48000], AVSampleRateKey,
[NSNumber numberWithInt:4], AVNumberOfChannelsKey,
[NSNumber numberWithInt:16], AVLinearPCMBitDepthKey,
[NSNumber numberWithBool:NO], AVLinearPCMIsNonInterleaved,
[NSNumber numberWithBool:NO], AVLinearPCMIsFloatKey,
[NSNumber numberWithBool:NO], AVLinearPCMIsBigEndianKey,
nil];

myAssetReaderAudioMixOutput = [AVAssetReaderAudioMixOutput assetReaderAudioMixOutputWithAudioTracks:audioTracks audioSettings: outputSettings];
我使用以下代码位从CMSampleBuffer读取实际音频样本/数据

enteraudioBuffer=[assetReaderAudioMixOutput copyNextSampleBuffer]; 中频音频缓冲器 { CMBlockBufferRef audioBlockBuffer=CMSampleBufferGetDataBufferaudioBuffer

// lets get some more info about our SampleBuffer, or at least sample size for sample 0!
CMTime sampleDuration = CMSampleBufferGetDuration(audioBuffer);
size_t sampleSize =  CMSampleBufferGetSampleSize(audioBuffer, 0);
CMItemCount numSamplesInBuffer = CMSampleBufferGetNumSamples(audioBuffer);

bfAudioBuffer* pbfBuffer = new bfAudioBuffer();
int samplesNeededForThisFrame = 1920;           // sample for FrameNo(frameNo, vidMode);
int sizeOfDataToBeCopied = samplesNeededForThisFrame * sampleSize
// Audio Samples for 1 frames worth of audio should be copied into pbfBuffer->pPcmBuffer
CMBlockBufferCopyDataBytes(audioBlockBuffer, 0, sizeOfDataToBeCopied, pbfBuffer->pPcmBuffer);
}

抱歉,当我粘贴代码时,它似乎弄乱了代码,不知道为什么,我尝试了一些不同的东西-抱歉

所以我认为我的问题要么是在建立字典,要么是在阅读样本。 我使用同一个系统来读取单轨的样本,所以我怀疑这是否正确? 我就是不明白为什么它给了我4首曲目的正确数量的数据/样本,而只是把信息放在第一首曲目中

最后,我在OSX上,不关心iOS

谢谢你的帮助, 这是非常令人沮丧的

詹姆斯
对,我终于找到了这个问题的答案,所以我想我会用这个解决方案更新我的问题

所以问题在于我对AvassetradermixaudioOutput实际功能的理解

我以为我可以给我一个多音轨的混合,但它实际上意味着以用户指定的方式混合音轨,然后它返回一个单一的音频轨道。请记住,这里的音轨可能是立体声的单音轨

为了从文件中获得多音轨声音,我需要为我想要提取的每个音轨配备Avassetrader

希望有人觉得这有帮助