2017-12-08 21 views
0

Core Audio API를 사용하여 오디오 파일의 디코딩 된 PCM 데이터를 성공적으로 가져올 수 있습니다. 아래는 내가 그렇게 할 방법을 보여줍니다 감소 코드 : 어떻게 내가 디코딩 할 오디오 트랙을Core Audio 디코딩 할 오디오 트랙을 지정하십시오.

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

하나의 방법은 모든 트랙을 디코딩 한 다음 원하는 트랙 데이터 (인터리브 스테레오 등 모든 다른 샘플)를 다른 버퍼, 배열 또는 파일로 추출 (복사)하는 것입니다. 디코드 시간과 비교하여 여분의 복사 시간은 중요하지 않습니다.

+0

모든 트랙을 디코딩하도록 설정하는 방법은 무엇입니까? 또한 모든 오디오 트랙의 메타 데이터 (예 : 비트 전송률, 샘플 속도, 채널 수 등)를 얻는 데 흥미 롭습니다. 어떻게해야합니까? 감사합니다. . – mbaros

+0

좋아, 프로그래밍 방식으로 모든 트랙을 디코딩하는 방법? – mbaros

+0

이것은 새로운 질문 섹션이 아니라 주석 섹션입니다. – hotpaw2