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