使用 ExtAudioFileSeek 和 ExtAudioFileRead 从音频文件中读取编码帧
Read encoded frames from audio file with ExtAudioFileSeek and ExtAudioFileRead
这就是我想做的事情:
从麦克风获取音频
- 将其编码为 AAC、G.711 或 G.726
- 将编码帧写入套接字。
这就是我试图到达那里的方式:
- 我正在使用 TheAmazingAudioEngine 从麦克风获取音频 (PCM) 并将其放入缓冲区;
- 使用 TPAACAudioConverter 我正在从缓冲区读取音频并写入临时文件 (AAC);
在 TPAACAudioConverter 的处理线程中我替换为:
OSStatus status = ExtAudioFileWrite(destinationFile, numFrames, &fillBufList);
有了这个:
OSStatus status = ExtAudioFileWrite(destinationFile, numFrames, &fillBufList);
UInt32 framesWritten = numFrames;
totalFramesWritten += framesWritten;
AudioBufferList readData;
readData.mNumberBuffers = 1;
ExtAudioFileSeek(destinationFile, totalFramesWritten - framesWritten);
OSStatus readStatus = ExtAudioFileRead(destinationFile, &numFrames, &readData);
ExtAudioFileSeek(destinationFile, totalFramesWritten);
NSLog(@"Bytes read=%d", numFrames);
但我得到的是从文件中读取的 0 numFrames。
关于我可能做错了什么的任何想法或关于实现我需要的替代路径的任何建议?
问题在于,无论 ExtAudioFile 在幕后做什么,都不允许在打开以进行写入的文件上进行搜索。如果您查看 ExtAudioFileSeek
的文档,它会显示 "This function's behavior with files open for writing is currently undefined".
您可以通过直接使用更具扩展性(和难度)的 Audio File Services and the Audio Converter Services 而不是方便的扩展音频文件服务来解决此问题。
我放弃了这种方法并重新使用了 Apple 的 SpeakHere 示例中的 AQRecorder class。
项目可在此处获得 https://github.com/robovm/apple-ios-samples/tree/master/SpeakHere。
这就是我想做的事情:
从麦克风获取音频
- 将其编码为 AAC、G.711 或 G.726
- 将编码帧写入套接字。
这就是我试图到达那里的方式:
- 我正在使用 TheAmazingAudioEngine 从麦克风获取音频 (PCM) 并将其放入缓冲区;
- 使用 TPAACAudioConverter 我正在从缓冲区读取音频并写入临时文件 (AAC);
在 TPAACAudioConverter 的处理线程中我替换为:
OSStatus status = ExtAudioFileWrite(destinationFile, numFrames, &fillBufList);
有了这个:
OSStatus status = ExtAudioFileWrite(destinationFile, numFrames, &fillBufList); UInt32 framesWritten = numFrames; totalFramesWritten += framesWritten; AudioBufferList readData; readData.mNumberBuffers = 1; ExtAudioFileSeek(destinationFile, totalFramesWritten - framesWritten); OSStatus readStatus = ExtAudioFileRead(destinationFile, &numFrames, &readData); ExtAudioFileSeek(destinationFile, totalFramesWritten); NSLog(@"Bytes read=%d", numFrames);
但我得到的是从文件中读取的 0 numFrames。
关于我可能做错了什么的任何想法或关于实现我需要的替代路径的任何建议?
问题在于,无论 ExtAudioFile 在幕后做什么,都不允许在打开以进行写入的文件上进行搜索。如果您查看 ExtAudioFileSeek
的文档,它会显示 "This function's behavior with files open for writing is currently undefined".
您可以通过直接使用更具扩展性(和难度)的 Audio File Services and the Audio Converter Services 而不是方便的扩展音频文件服务来解决此问题。
我放弃了这种方法并重新使用了 Apple 的 SpeakHere 示例中的 AQRecorder class。
项目可在此处获得 https://github.com/robovm/apple-ios-samples/tree/master/SpeakHere。