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 指定要解码的音轨的主要内容,如果未能解决你的问题,请参考以下文章