使用Apple音频文件流服务,iOS 7,无法解析M4A,AAC文件

Gon*_*dez 8 objective-c audio-streaming audiotoolbox ios multipeer-connectivity

我正在使用本教程Multipeer Connectivity Audio Stream To Multiple Peers和这个项目Github Repository,以便从NSInputStream流式传输音频,这是通过以下方式获得的:

-(void)session:didReceiveStream:withName:fromPeer:
Run Code Online (Sandbox Code Playgroud)

MCSession委托方法.

之后,这将打开一个新的音频文件流(TDAudioFileStreamer/Classes/AudioFileStream.m:39):

OSStatus err = AudioFileStreamOpen((__bridge void *)self, TDAudioFileStreamPropertyListener, TDAudioFileStreamPacketsListener, 0, &_audioFileStreamID); 
Run Code Online (Sandbox Code Playgroud)

然后从NSInputStream读取字节并尝试通过这种方式解析(TDAudioFileStreamer/Classes/AudioFileStream.m:98):

err = AudioFileStreamParseBytes(self.audioFileStreamID, length, data, kAudioFileStreamParseFlag_Discontinuity);
Run Code Online (Sandbox Code Playgroud)

要么:

err = AudioFileStreamParseBytes(self.audioFileStreamID, length, data, 0);
Run Code Online (Sandbox Code Playgroud)

取决于数据流.

最后,这个用解析后的数据填充AudioQueue Buffer以便播放(我猜--TDAudioFileStreamer/Classes/TDAudioQueueFiller.m).

这对于MP3格式文件非常有用,但在尝试解析字节时使用其他格式会出现"不支持的文件格式"错误.

Apple文档称音频文件流服务支持许多格式,它们列在此链接中:Apple Stream Services支持的格式,但对我来说只适用于MP3.

我也在尝试,当打开音频文件流传递关于这样的文件格式的提示并发送M4A或AAC文件时:

OSStatus err = AudioFileStreamOpen((__bridge void *)self, TDAudioFileStreamPropertyListener, TDAudioFileStreamPacketsListener, kAudioFileAAC_ADTSType, &_audioFileStreamID);
Run Code Online (Sandbox Code Playgroud)

其中kAudioFileAAC_ADTSType是将要流式传输的已发送文件的类型,通过这种方式,"不支持的文件格式错误"消失,但应用程序崩溃并获得新的错误 在此输入图像描述

这说:io:lpc和客户:aac.

  • 有人知道这是什么意思吗?
  • 队列期待AAC格式文件?
  • 为什么LPCM(线性脉冲编码调制),我发送的M4A或AAC不是LPCM?

提前致谢.

u.g*_*gen 4

为了使用 流式传输/解析 M4A AudioFileStream,m4a 文件需要针对流式传输进行优化。

这意味着标头需要位于文件的前面,并且具有正确的信息,可以让解析器完成其工作。

有些编码器会为您优化 m4a,但有些编码器不会。例如,如果您使用 itunes 播放器创建 m4a 文件,只需右键单击并选择“创建 AAC 版本”,即可创建针对流媒体优化的 m4a 文件。

您可以使用http://ridiculousfish.com/hexfiend/检查它

在此输入图像描述

但如果您使用encoding.com 来编码您的m4a 文件,您将获得不同类型的编码。

当从磁盘播放整个文件时,它们都可以工作,但优化版本将被正确解析/流式传输。

现在您收到的错误告诉您解析器无法AudioStreamBasicDescription从您正在解析的文件中获取正确的信息,文件可能拒绝提供比特率信息...

尝试查看此代码以更好地理解处理 m4a 类型http://www.cocoawithlove.com/2010/03/streaming-mp3aac-audio-again.html