使用 ExtAudioFileWrite 在文件末尾写入

Posted

技术标签:

【中文标题】使用 ExtAudioFileWrite 在文件末尾写入【英文标题】:Using ExtAudioFileWrite to write at the end of a file 【发布时间】:2012-10-10 20:53:35 【问题描述】:

我正在尝试使用 ExtAudioFileWrite 打开一个文件并向其附加数据。现在,创建/初始写入(在创建时)/转换工作得很好,但不幸的是,我似乎无法打开文件之后进行写入。似乎只有一个函数可以打开文件:ExAudioFileOpenURL,但仅用于读取。那么,如果我无法打开文件进行写入,我该如何在文件末尾写入呢?

【问题讨论】:

你试过AudioFileOpenURL然后ExtAudioFileWrapAudioFileID吗? 你好,你成功追加到文件末尾了吗?我正在尝试做同样的事情,但无法正常工作。谢谢! 【参考方案1】:

我可能错了,或者没有完全理解您的问题。但是,一旦您开始使用 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);

我猜这不会编译。但希望能帮助您了解这个想法。

【讨论】:

是的,如果您保持文件打开,它将正常工作。但是,如果您关闭它然后再次打开,它将从头开始写入。我直接使用AudioFile解决了这个问题,我觉得扩展版没有这个功能。 如果你读入一个缓冲区,就像在你的例子中一样,内存在某些时候会成为一个问题(在我的情况下) 就像我说的,我可能并不完全了解您的需求。我很高兴你明白了。抱歉,我帮不上什么忙。 Np,对不起,我没有删除问题或回答它:) 有没有办法在应用被杀死后获取ExtAudioFileRef以便恢复写入?

以上是关于使用 ExtAudioFileWrite 在文件末尾写入的主要内容,如果未能解决你的问题,请参考以下文章

ExtAudioFileWrite 创建静音 m4a

Swift 中的 AudioUnitRender 和 ExtAudioFileWrite 错误 -50:尝试将 MIDI 转换为音频文件

使用 ExtAudioFileWrite ios 将流式 mp3 数据包的缓冲区写入 wav 文件

从 AudioUnit 格式转换为 ExtAudioFileWrite

使用 AudioToolBox 将 Wave 文件保存到 NSFileWrapper

在 iPhone 上录制播放和麦克风