2012-02-06 3 views
1

저는 FLAC-ALAC 트랜스 코더를 사용하고 있으며 ExtAudioFile을 사용하여 ALAC에 쓰기를 시도하고 있습니다. FLAC 라이브러리의 콜백 기반 시스템을 사용하여 FLAC 파일을 읽었습니다. FLAC 파일의 모든 프레임에서 함수 호출이 발생합니다. 다음과 같이 그 전화 내, 내 버퍼를 설정하고 ExtAudioFileWrite 코드를 호출 :ExtAudioFileWrite inNumberFrames 매개 변수에 적절한 값은 무엇입니까?

AudioBufferList * fillBufList; 
fillBufList = malloc(sizeof *fillBufList + (frame->header.channels - 1) * sizeof fillBufList->mBuffers[0]); 
fillBufList->mNumberBuffers = frame->header.channels; 

for (int i = 0; i < fillBufList->mNumberBuffers; i++) { 
    fillBufList->mBuffers[i].mNumberChannels = 1; // non-interleaved 
    fillBufList->mBuffers[i].mDataByteSize = frame->header.blocksize * frame->header.bits_per_sample/8; 
    fillBufList->mBuffers[i].mData = (void *)(buffer[i]); 
    NSLog(@"%i", fillBufList->mBuffers[i].mDataByteSize); 
} 

OSStatus err = ExtAudioFileWrite (outFile, 1, fillBufList); 

이제, 마지막 줄에 숫자 1이 내가 한 프레임 있다고 생각하기 때문에 내가 선택한 매직 넘버의 무언가이다 FLAC 파일의 해당 프레임은 해당 ALAC 파일의 한 프레임과 일치 할 수 있지만이 경우는 그렇지 않습니다. ExtAudioFileWrite를 호출 할 때마다 오류 값이 -50 (사용자 매개 변수 목록의 오류)을 반환합니다. 명백한 범인은 frame 매개 변수에 제공하는 값입니다.

나는 무엇을 제공해야합니까?

아니면 잘못된 나무를 짖고 있습니까?

(사이드 노트 : param 관련 오류 값에도 불구하고 실제 문제는 버퍼 설정 일 수 있으므로 어떤 일이 발생하는지 확인하기 위해 제로 아웃 된 더미 버퍼를 mallocing하려고했습니다.)

+0

더 많은 연구와 연구에서, "프레임"이라는 용어는 FLAC 문서와 CoreAudio에서 매우 다른 것을 의미 할 수 있습니다. 채널 당 샘플 수를 제공하려고 시도했지만 (frame-> header.blocksize) 여전히 매개 변수 오류가 발생합니다. –

답변

2

ExtAudioFileWrite의 경우 프레임 수는 작성하려는 샘플 수와 같습니다. 32 비트 부동 소수점 인터리브 데이터로 작업하는 경우 mDataByteSize/(sizeof (Float32)/mNumberChannels)가됩니다. 샘플을 하나만 쓰는 것을 원하지 않는 한 1이되어서는 안되며, 압축 된 형식을 쓰는 경우 특정 샘플 수가 필요하다고 생각합니다. -50 오류가 다른 문제 일 수도 있습니다.

확인할 사항 중 하나는 ExtAudioFile이 하나의 버퍼만을 필요로한다는 것입니다. 따라서 fillBufList-> mNumberBuffers는 항상 1이어야하고 스테레오를 수행해야하는 경우 mBuffers [0] .mNumberChannels가 스테레오 용으로 2가되도록 오디오 데이터를 인터리브해야합니다.

+0

당신이 제기 한 마지막 문제는 정확하게 문제라고 믿습니다. fillBufList에 하나의 버퍼 만 사용해야합니다. 그러나 이것은 하위 질문을 제기합니다. mNumberBuffers가 항상 1과 같을 때 "fillBufList"구조를 사용하는 이유는 무엇입니까? ExtAudioFileWrite 함수가 단순히 원시 버퍼를 받아들이는 것이 아닌가? –

+0

애플은 왜 그런 식으로 만들었는지 모르겠지만 내 경험에 비 인터리브 스테레오 오디오 데이터 (즉, mNumberBuffers는 2이고 오디오 데이터가있는 두 개의 mBuffer가 있음)가 전혀 작동하지 않는다는 경험이 있습니다. 인터리브 된 오디오 데이터 만 작동합니다. 그들은 여러 버퍼에 대해 API의 AudioBufferList 구조체를 사용할 수 있기를 원했지만 ExtAudioFile API의 경우에는 그렇게 사용하지 않았습니다. – lucius