使用 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 在文件末尾写入的主要内容,如果未能解决你的问题,请参考以下文章
Swift 中的 AudioUnitRender 和 ExtAudioFileWrite 错误 -50:尝试将 MIDI 转换为音频文件
使用 ExtAudioFileWrite ios 将流式 mp3 数据包的缓冲区写入 wav 文件
从 AudioUnit 格式转换为 ExtAudioFileWrite