2012-10-10 177 views
1

我试图打开一个文件并使用ExtAudioFileWrite将数据追加到它。现在,创建/初始写入(创建时)/转换工作很好,但不幸的是,我似乎无法打开文件以供后来写入。只有一个函数似乎打开文件:ExAudioFileOpenURL,但仅用于阅读。那么,如果我无法打开文件进行写入,我该如何在文件末尾编写代码?使用ExtAudioFileWrite在文件末尾写入

+0

你试过'AudioFileOpenURL'然后'ExtAudioFileWrapAudioFileID'吗? – sbooth

回答

0

我可能是错的,或不完全理解你的问题。但是,一旦使用ExtAudioFileWrite开始写入文件,您可以通过再次调用ExtAudioFileWrite来继续写入文件。我要冒险进入没有编译器的编码,希望你会得到的想法

例子:

....variables declaration and your logic..... 

//1.Create File to write output 
ExtAudioFileRef outputFile; 

//+++++++ LOOP to append as many files as you want +++++++// 

//2.Create file reference to files you want to merge 
ExtAudioFileRef audioFileObject = 0; 

//3.open the first file 
ExtAudioFileOpenURL (firstFileURL, &audioFileObject); 

//4.get file properties 
AudioStreamBasicDescription AudioFileFormat = 0; 
UInt64 numberOfPacketsToReadInCurrentFile = 0; 
ExtAudioFileGetProperty(audioFileObject, 
         kExtAudioFileProperty_FileLengthFrames, 
         sizeof(numberOfPacketsToReadInCurrentFile), 
         &numberOfPacketsToReadInCurrentFile 
         ); 

ExtAudioFileGetProperty(audioFileObject, 
         kExtAudioFileProperty_FileDataFormat, 
         sizeof(AudioFileFormat), 
         &AudioFileFormat 
         ); 
//5.Set destination ASBD 
ExtAudioFileSetProperty(audioFileObject, 
         kExtAudioFileProperty_ClientDataFormat, 
         sizeof (importFormat), 
         &importFormat 
         ); 

//6.Set/Create/Allocate Some Buffers 
//use AudioFileFormat to setup your buffers accordingly 

AudioBufferList theBufferList = 0 // bufferList setup (I dont remember that) 

//7.Read the file into the buffer 
ExtAudioFileRead(audioFileObject,&numberOfPacketsToReadInCurrentFile,theBufferList); 

//8.Write the buffer to a File  
ExtAudioFileWrite(outputFile, numberOfPacketsToReadInCurrentFile, theBufferList); 
free(theBufferList); 

//if you want to append more files go to point 2 with the next file URL 

//+++++++CLOSE LOOP+++++++++// 

//once you are done.. just dispose the file and clean up everything left 
ExtAudioFileDispose(outputFile); 

这将无法编译,我猜。但希望能帮助你明白这个想法。

+0

是的,如果你保持文件打开,它会工作得很好。但是,如果关闭它然后再次打开它将从头开始写入。我通过直接使用AudioFile解决了问题,我不认为扩展版本具有此功能。 –

+0

如果你读到一个缓冲区,就像在你的例子中,内存将在某个时候是一个问题(这是在我的情况) –

+0

就像我说的,我可能不完全理解你需要什么。我很高兴你知道了。对不起,我不能有任何帮助。 – Dan1one