首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CMSampleBufferRef、AVAssetReaderMixAudioOutput和PCM问题

CMSampleBufferRef、AVAssetReaderMixAudioOutput和PCM问题
EN

Stack Overflow用户
提问于 2014-08-10 23:55:34
回答 1查看 699关注 0票数 0

因此,我使用一个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的字典.

代码语言:javascript
运行
复制
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);

代码语言:javascript
运行
复制
// 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。

谢谢你的帮助,这真是令人沮丧!

  • 詹姆斯
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-02 06:45:16

是的,我终于找到了这个问题的答案,所以我想我应该用这个解决方案来更新我的Q。

所以问题在于我对AVAssetReaderMixAudioOutput到底做了什么的理解。

我以为我可以给我一个混合多个音频轨道,但它实际上是要混合在一个用户指定的方式,然后它返回一个正弦轨道的音频。(请记住,这里的“音轨”可能是单一的立体声音轨)

为了从文件中获取多声道声音,我需要为我想要提取的每一首曲目设置一个AVAssetReader。

希望有人觉得这有帮助

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25234151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档