Core Audio 指定要解码的音轨

Posted

技术标签:

【中文标题】Core Audio 指定要解码的音轨【英文标题】:Core Audio specify which audio track to decode 【发布时间】:2017-12-08 15:10:54 【问题描述】:

我能够使用 Core Audio API 成功获取音频文件的解码 PCM 数据。下面是 简化的 代码,它显示了我如何做到这一点:

CFStringRef urlStr = CFStringCreateWithCString(kCFAllocatorDefault, "file.m4a", kCFStringEncodingUTF8);
CFURLRef urlRef = CFURLCreateWithFileSystemPath(NULL, urlStr, kCFURLPOSIXPathStyle, false);    

ExtAudioFileOpenURL(urlRef, &m_audioFile);

bzero(&m_outputFormat, sizeof(AudiostreamBasicDescription));
m_outputFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked;
m_outputFormat.mSampleRate = m_inputFormat.mSampleRate;
m_outputFormat.mFormatID = kAudioFormatLinearPCM;
m_outputFormat.mChannelsPerFrame = m_inputFormat.mChannelsPerFrame;
m_outputFormat.mBytesPerFrame = sizeof(short) * m_outputFormat.mChannelsPerFrame;
m_outputFormat.mBitsPerChannel = sizeof(short) * 8;
m_outputFormat.mFramesPerPacket = 1;
m_outputFormat.mBytesPerPacket = m_outputFormat.mBytesPerFrame * m_outputFormat.mFramesPerPacket;


ExtAudioFileSetProperty(m_audioFile, kExtAudioFileProperty_ClientDataFormat, sizeof(m_outputFormat), &m_outputFormat)

short* transformData = new short[sampleCount];    

AudioBufferList fillBufList;
fillBufList.mNumberBuffers = 1;
fillBufList.mBuffers[0].mNumberChannels = channels;
fillBufList.mBuffers[0].mDataByteSize = m_sampleCount * sizeof(short);
fillBufList.mBuffers[0].mData = (void*)(&transformData[0]);

ExtAudioFileRead(m_audioFile, &m_frameCount, &fillBufList);

我对我如何指定我想要解码的音轨感兴趣(假设媒体文件包含多个)?

【问题讨论】:

【参考方案1】:

一种方法是解码所有轨道,然后提取(复制)所需的轨道数据(用于交错立体声等的每个其他样本)到另一个缓冲区、数组或文件中。与解码时间相比,额外的复制时间是微不足道的。

【讨论】:

以及如何设置解码所有曲目?此外,我对获取所有音轨的元数据(即比特率、采样率、通道数等)很感兴趣。我该怎么做呢?谢谢。 这是评论区,不是新问题区。

以上是关于Core Audio 指定要解码的音轨的主要内容,如果未能解决你的问题,请参考以下文章

Monster Audio 使用教程 发送音轨的设置

一次播放 15 个音轨,延迟小于 50 毫秒?

gstreamer:没有可用于“audio/x-wav”类型的解码器/找不到合适的插件

为啥百度云下载的视频没有声音?

audio_thread音频解码线程分析

使用多个音频类型的 AVAsset 轨道切换 AVURLAsset 的音轨