因此,我使用一个AVAssetReaderMixAudioOutput从一个快速文件中提取音频样本。在这种情况下,它是一个多声道的ProRes视频。
(4磁道,16位,交错样本littleEndian @ 48000)
我可以得到视频帧,但当我打电话给myAssetReaderAudioMixOutput copyNextSampleBuffer时,我遇到了一些奇怪的问题.似乎返回的音频都在第一频道?
使用单独的trackOutputReader,我获得了第一个帧的每个音轨的第一个音频示例:
620 B 700E 0000
但是当我使用AVAssetReaderMixAudioOutput的时候
D219 0000万
(注意到620 B+700 e= D219),所以看起来AVAssetReaderMixAudioOutput是在4个通道上对所有值进行求和,并给出了第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;if (audioBuffer) { CMBlockBufferRef audioBlockBuffer = CMSampleBufferGetDataBuffer(audioBuffer);
// 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。
谢谢你的帮助,这真是令人沮丧!
发布于 2015-07-02 06:45:16
是的,我终于找到了这个问题的答案,所以我想我应该用这个解决方案来更新我的Q。
所以问题在于我对AVAssetReaderMixAudioOutput到底做了什么的理解。
我以为我可以给我一个混合多个音频轨道,但它实际上是要混合在一个用户指定的方式,然后它返回一个正弦轨道的音频。(请记住,这里的“音轨”可能是单一的立体声音轨)
为了从文件中获取多声道声音,我需要为我想要提取的每一首曲目设置一个AVAssetReader。
希望有人觉得这有帮助
https://stackoverflow.com/questions/25234151
复制相似问题