gpt4 book ai didi

macos - CMSampleBufferRef 和 A​​VAssetReaderMixAudioOutput 和 PCM 问题

转载 作者:行者123 更新时间:2023-12-03 02:09:47 25 4
gpt4 key购买 nike

所以我使用 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];

我正在使用以下代码从 CMSampleBuffer 中读取实际的音频样本/数据。

enteraudioBuffer = [assetReaderAudioMixOutput copyNextSampleBuffer];
如果(音频缓冲区)
{
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。

谢谢你的帮助,
这非常令人沮丧!
  • 詹姆斯
  • 最佳答案

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

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

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

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

    希望有人觉得这有帮助

    关于macos - CMSampleBufferRef 和 A​​VAssetReaderMixAudioOutput 和 PCM 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25234151/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com