- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我使用 AVAssetReaderMixAudioOutput 从 quicktime 文件中提取音频样本。
在这种情况下,它是具有多个音频轨道的 ProRes 视频。
(4 轨,16 位,交错采样 littleEndian @ 48000)
我可以得到视频帧,
但是当我调用 [myAssetReaderAudioMixOutput copyNextSampleBuffer]
我遇到了一些奇怪的问题......
返回的音频似乎都在第一个 channel 中?
使用我得到的个人 trackOutputReader
第一帧的每个轨道的第一个音频样本是:
620B 700E 0000 0000
但是当我使用 AVAssetReaderMixAudioOutput 我得到
D219 0000 0000 0000
(注意 620B + 700E = D219)
所以看起来 AVAssetReaderMixAudioOutput 正在汇总所有值
4 个 channel ,并在第 1 轨中给我结果??
谁能解释为什么?
以及如何解决?
我需要一个解决方案,它会给我一个 channel 的 1:1 映射,就像它们在 quicktime 文件中一样,
IE。它需要适用于具有 1 channel 和 16 channel 音频的文件。
我通过自己在每个音频 channel /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];
// 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);
最佳答案
是的,我终于找到了这个问题的答案,所以我想我会用解决方案更新 My Q.。
所以问题在于我对 AVAssetReaderMixAudioOutput 实际作用的理解。
我以为我可以混合多个音轨,但实际上是以用户指定的方式混合音轨,然后返回单个音轨。 (请记住,这里的“轨道”可能是单声道立体声)
为了从文件中获取多轨声音,我需要为我要提取的每条轨道安装一个 AVAssetReader。
希望有人觉得这有帮助
关于macos - CMSampleBufferRef 和 AVAssetReaderMixAudioOutput 和 PCM 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25234151/
我是一名优秀的程序员,十分优秀!