2012-10-31 4 views
3

AudioToolBox 프레임 워크에서 ExtAudioFileCreateWithURL 및 ExtAudioFileWrite를 사용하여 샘플을 파일에 저장했습니다. 하지만 지금은 내가 지금 NSDocument 사용하고 있습니다 년부터 NSFileWrapper에 저장해야합니다AudioToolBox를 사용하여 웨이브 파일을 NSFileWrapper에 저장합니다.

- (NSFileWrapper *)fileWrapperOfType:(NSString *)typeName error:(NSError **)outError 

내가 NSFileWrapper initRegularFileWithContents:(NSData*)contents 방법을 사용할 수 있도록 NSMutableData 개체와 ExtAudioFileXXX 기능을 사용할 수있는 방법이 있습니까?

은 (어떤 작품) 파일에 저장하는 코드를 박탈 : 외부 파일을 사용하여

AudioStreamBasicDescription file_desc; 
FillOutASBDForLPCM(file_desc, _sample_rate, _channel_count, 32, 32, true, false); 
OSStatus rv = ExtAudioFileCreateWithURL(url, kAudioFileWAVEType, &file_desc, NULL, kAudioFileFlags_EraseFile, &fout); 
if (rv == noErr){ 
    int buff_size = sizeof(AudioBufferList) + sizeof(AudioBuffer); 
    AudioBufferList* bufferList = (AudioBufferList*)malloc(buff_size); 
    bufferList->mNumberBuffers = 1; 
    bufferList->mBuffers[0].mData = _samples; 
    bufferList->mBuffers[0].mNumberChannels = _channel_count; 
    bufferList->mBuffers[0].mDataByteSize = _channel_count * _frame_count * sizeof(float); 
    ExtAudioFileWrite(fout, _frame_count, bufferList); 
    free(bufferList); 
    ExtAudioFileDispose(fout); 
} 

답변

0

은 대부분의 시나리오에서 가장 좋은 솔루션입니다. NSData에는 Uncached 및 Mapped 파일에 대한 초기화 프로그램이 있습니다. 대다수의 경우 I/O를 최소화하고 메모리를 많이 소비하지 않고 캐시 메모리 증가에 유의해야합니다. 한 단계 더 나아가서, 문서의 파일이 작은 파일 (예 : 단일주기)이 아니기 때문에 파일 래퍼 객체를 다른 방법 (예 : NSFileWrappers, 링크)으로 표현할 수있는 방법을 고려하십시오.

메모리가 웨이브와 함께 작동 (예를 들어, 당신은 단지 작은 샘플 및 유한 파일 및 문서를 다루고있는) 문제, 당신은 AudioFileInitializeWithCallbacks를 사용할 수는없는 경우 (전부는 아니지만 형식). 이렇게하면 메모리에있는 전체 파일을 나타내는 인접한 할당을 위해 메모리에서 자체 버퍼를 처리 할 수 ​​있습니다. 그런 다음 NSData 표현을 만드는 것은 쉽습니다. 메모리 사용을 모니터링하고 독점적 인 읽기/쓰기 액세스를 보장하십시오. NSData은 깊은 사본을 생성 할 필요가 없으며이를 설계에 반영합니다. OS X에서이 옵션을 사용하면 더 많은 유연성을 얻을 수 있습니다.이 경우 실제로 작성하는 양을 알고 있는지 확인하십시오. 모든 경우에 훌륭한 디스크 기반 솔루션 (위)은 디스크에 많은 양의 쓰기 작업을 저장할 수 있습니다.

어쨌든 대부분의 NSFileWrapper 기반 구현보다 더 많은 생각이 필요합니다. 이는 문서 당 오디오 파일 자산에서 100MB를 상당히 빠르게 초과 할 수 있기 때문입니다.

+1

감사합니다. 저스틴. 오디오 파일이 거의 변경되지 않았기 때문에 이미 NSFileWrappers 자식을 사용하여 쓰기 작업을 최소화했습니다. fileWrapperOfType이 이미 유효한 NSFileWrapper를 찾으면이 파일을 건너 뜁니다. 내 마지막 해결책은 ExtAudioFileCreateWithURL을 사용하여 사용자가 상호 작용하는 외부 파일에 저장하지만 내 NSFileWrapper에 오디오를 저장할 때 내 saveWAVFileToMemory 루틴을 롤업하는 것이 었습니다. 이렇게하면 내보내는 동안 파일 형식을 더 많이 선택할 수 있지만 NSFileWrappers를 사용하여 내부 저장에 사용할 수 있습니다. –

+0

@DaveStephenson 실제 구현에 대한 설명은 높이 평가합니다. 천만에요. – justin