使用ExtAudioFileSeek和ExtAudioFileRead从音频文件中读取编码的帧

时间:2016-07-15 15:08:27

标签: ios objective-c audio core-audio

这就是我想做的事情:

从麦克风获取音频

  • 将其编码为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 numFrame。

对于我可能做错了什么或任何关于实现我需要的替代路径的建议有任何想法?

2 个答案:

答案 0 :(得分:1)

问题在于,无论ExtAudioFile在引擎盖下做什么都不允许寻找一个可以写作的文件。如果您查看ExtAudioFileSeek的文档,它会说"此函数的文件打开以进行写入的行为目前尚未定义"。

您可以通过直接使用更具可扩展性(和难度)Audio File ServicesAudio Converter Services而不是方便的扩展音频文件服务来解决此问题。

答案 1 :(得分:0)

我放弃了这种方法,并重用Apple的SpeakHere示例中的AQRecorder类。

该项目可在此处https://github.com/robovm/apple-ios-samples/tree/master/SpeakHere