所以我使用 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。
感谢您的帮助,这非常令人沮丧!
- 詹姆士