iOS에서 WAVE 파일을 AAC로 인코딩 된 M4A 파일로 변환해야합니다. 저는 AAC 인코딩이 오래된 장치 나 시뮬레이터에서 지원되지 않는다는 것을 알고 있습니다. 코드를 실행하기 전에 테스트하고 있습니다. 그러나 나는 아직도 그것을 작동시킬 수 없다.iOS의 ExtAudioFile과 함께 AAC 인코딩을 작동 시키려면 어떻게해야합니까?
나는 애플 자신의 iPhoneExtAudioFileConvertTest 예를 들여다 보았다. 나는 그것을 정확하게 따라 갔다고 생각했지만 여전히 운이 없다.
현재 대상 파일에서 클라이언트 형식을 설정하는 중 -50 (사용자 매개 변수 목록에 오류가 있음)이 표시됩니다. 소스 파일에서 작동합니다.
아래 코드는 제 코드입니다. 어떤 도움이라도 대단히 감사합니다.
UInt32 size;
// Open a source audio file.
ExtAudioFileRef sourceAudioFile;
ExtAudioFileOpenURL((CFURLRef)sourceURL, &sourceAudioFile);
// Get the source data format
AudioStreamBasicDescription sourceFormat;
size = sizeof(sourceFormat);
result = ExtAudioFileGetProperty(sourceAudioFile, kExtAudioFileProperty_FileDataFormat, &size, &sourceFormat);
// Define the output format (AAC).
AudioStreamBasicDescription outputFormat;
outputFormat.mFormatID = kAudioFormatMPEG4AAC;
outputFormat.mSampleRate = 44100;
outputFormat.mChannelsPerFrame = 2;
// Use AudioFormat API to fill out the rest of the description.
size = sizeof(outputFormat);
AudioFormatGetProperty(kAudioFormatProperty_FormatInfo, 0, NULL, &size, &outputFormat);
// Make a destination audio file with this output format.
ExtAudioFileRef destAudioFile;
ExtAudioFileCreateWithURL((CFURLRef)destURL, kAudioFileM4AType, &outputFormat, NULL, kAudioFileFlags_EraseFile, &destAudioFile);
// Create canonical PCM client format.
AudioStreamBasicDescription clientFormat;
clientFormat.mSampleRate = sourceFormat.mSampleRate;
clientFormat.mFormatID = kAudioFormatLinearPCM;
clientFormat.mFormatFlags = kAudioFormatFlagIsPacked | kAudioFormatFlagIsSignedInteger;
clientFormat.mChannelsPerFrame = 2;
clientFormat.mBitsPerChannel = 16;
clientFormat.mBytesPerFrame = 4;
clientFormat.mBytesPerPacket = 4;
clientFormat.mFramesPerPacket = 1;
// Set the client format in source and destination file.
size = sizeof(clientFormat);
ExtAudioFileSetProperty(sourceAudioFile, kExtAudioFileProperty_ClientDataFormat, size, &clientFormat);
size = sizeof(clientFormat);
ExtAudioFileSetProperty(destAudioFile, kExtAudioFileProperty_ClientDataFormat, size, &clientFormat);
// Make a buffer
int bufferSizeInFrames = 8000;
int bufferSize = (bufferSizeInFrames * sourceFormat.mBytesPerFrame);
UInt8 * buffer = (UInt8 *)malloc(bufferSize);
AudioBufferList bufferList;
bufferList.mNumberBuffers = 1;
bufferList.mBuffers[0].mNumberChannels = clientFormat.mChannelsPerFrame;
bufferList.mBuffers[0].mData = buffer;
bufferList.mBuffers[0].mDataByteSize = (bufferSize);
while(TRUE)
{
// Try to fill the buffer to capacity.
UInt32 framesRead = bufferSizeInFrames;
ExtAudioFileRead(sourceAudioFile, &framesRead, &bufferList);
// 0 frames read means EOF.
if(framesRead == 0)
break;
// Write.
ExtAudioFileWrite(destAudioFile, framesRead, &bufferList);
}
free(buffer);
// Close the files.
ExtAudioFileDispose(sourceAudioFile);
ExtAudioFileDispose(destAudioFile);
이제까지이 기능을 사용할 수 있습니까? .wav를 .acc로 변환하려고합니다. – RyanG
안녕 라이언, 아래 내 자신의 대답을 확인하십시오. – Sebastian