0

所以我使用 AVAssetReaderMixAudioOutput 从 quicktime 文件中提取音频样本。在这种情况下,它是具有多个音频轨道的 ProRes 视频。

(4 轨,16 位,交错采样 littleEndian @ 48000)

我可以正常获取视频帧,但是当我调用 [myAssetReaderAudioMixOutput copyNextSampleBuffer] 时,我遇到了一些奇怪的问题....返回的音频似乎都在第一个通道中?

使用单独的 trackOutputReader,我得到第一帧每个轨道的第一个音频样本是:

620B 700E 0000 0000

但是当我使用 AVAssetReaderMixAudioOutput 我得到

D219 0000 0000 0000

(注意 620B + 700E = D219)所以看起来 AVAssetReaderMixAudioOutput 正在对 4 个通道中的所有值求和,并在轨道 1 中给出结果?

谁能解释为什么?以及如何解决?我需要一个解决方案,它会给我一个通道的 1:1 映射,因为它们在 quicktime 文件中,即。它需要适用于具有 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。

感谢您的帮助,这非常令人沮丧!

  • 詹姆士
4

1 回答 1

0

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

所以问题在于我对 AVAssetReaderMixAudioOutput 实际作用的理解。

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

为了从文件中获取多轨声音,我需要为我要提取的每条轨道安装一个 AVAssetReader。

希望有人觉得这有帮助

于 2015-07-02T06:45:16.643 回答