Ios Avassetrader和AudioFileReadPackets读取音频的方式之间的差异

Ios Avassetrader和AudioFileReadPackets读取音频的方式之间的差异,ios,audio,streaming,Ios,Audio,Streaming,考虑以下两种从音频文件读取/写入数据的场景(用于通过网络发送): 场景1:音频文件服务: 使用来自的AudioFileReadPackets。这会生成音频数据包,您可以通过网络轻松发送这些数据包。在接收端,您使用AudioFileStreamOpen和AudioFileStreamParseBytes来解析数据 然后有两个回调函数:和。当在流中发现新属性和从流中接收数据包时,分别调用这些家伙。一旦收到数据包,您就可以将其发送到音频队列,使用该队列可以很好地播放文件 注意:此方法不适用于存储在iP

考虑以下两种从音频文件读取/写入数据的场景(用于通过网络发送):

场景1:音频文件服务:
使用来自的AudioFileReadPackets。这会生成音频数据包,您可以通过网络轻松发送这些数据包。在接收端,您使用AudioFileStreamOpen和AudioFileStreamParseBytes来解析数据

然后有两个回调函数:和。当在流中发现新属性和从流中接收数据包时,分别调用这些家伙。一旦收到数据包,您就可以将其发送到音频队列,使用该队列可以很好地播放文件

注意:此方法不适用于存储在iPod库中的音乐文件,这就引出了第二种情况:

场景2:Avassetrader:
使用,您可以读取iPod音乐库中的内容,并通过网络发送数据包。通常,您将直接在音频队列上加载数据包,类似于上面所述。但是,在此场景中,您必须创建一个线程,以确保在队列已满时阻止接收数据包,并在队列缓冲区可用时取消阻止(请参见示例)

问题:
是否可以使用Avassetrader发送数据包,而只让AudioFileStreamPasseBytes读取?(动机是AudioFileStreamParseBytes的回调将处理线程/阻塞业务,并为您省去痛苦)。我试着这样做:
1.首先使用Avassetrader读取音频文件

二,。设置拖缆

三,。收到数据后,我将解析字节:

问题:当我这样做的时候。。我发送字节,并且AudioFileStreamPasseBytes不会失败。但是,永远不会调用回调*AudioFileStream\u PropertyListenerProc*和*AudioFileStream\u PacketsProc*。这让我觉得解析器无法解析字节并从中提取任何有用的信息。。在it文档中指出:*您应该提供至少超过单个数据包的音频文件数据,但最好一次提供几包到几秒钟的数据。*我发送的数据超过900字节,刚好低于GKSession的数据。我非常确定900字节就足够了(在场景1下测试时,每次的总字节数为417字节,效果很好)


有什么想法吗?

简单的回答是,让音频文件流字节解析音频数据包根本没有意义。。在AudioFileStreamPasseBytes中,是一个依赖于音频文件存在的函数(因此参数inudioFileStream..,它被定义为要向其传递数据的解析器的ID。解析器ID由AudioFileStreamOpen函数返回。)

因此,我们得到的教训是:不要试图将iOS功能分类以适应您的情况。。应该是相反的

我最后做的是将数据直接传送到音频队列。。没有经过所有这些不必要的中介功能。。更深入的方法是将数据传送到音频单元。。但我的应用程序不需要那种级别的控制

//NSURL *assetURL = [NSURL URLWithString:@"ipod-library://item/item.m4a?id=1053020204400037178"]; 
AVURLAsset *songAsset = [AVURLAsset URLAssetWithURL:assetURL options:nil];

NSError * error = nil;
AVAssetReader* reader = [[AVAssetReader alloc] initWithAsset:songAsset error:&error];

AVAssetTrack* track = [songAsset.tracks objectAtIndex:0]; 

// Note: I don't supply an audio format description here, rather I pass on nil to keep the original
// file format. In another piece of code (see here: http://stackoverflow.com/questions/12264799/why-is-audio-coming-up-garbled-when-using-avassetreader-with-audio-queue?answertab=active#tab-top) I can extract the audio format from the track, let's say it's an AAC format.
AVAssetReaderTrackOutput* readerOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:track
                                                                                    outputSettings:nil];


[reader addOutput:readerOutput];
[reader startReading];
// notice how i manually add the audio file type (for the file hint parameter) 
// using the info from step one.. If i leave it as 0, this call fails and returns
// the typ? error, which is :The specified file type is not supported.  
streamer->err = AudioFileStreamOpen((__bridge void*)streamer, 
                                     ASPropertyListenerProc, ASPacketsProc, 
                                     kAudioFileAAC_ADTSType, &(streamer->audioFileStream)); 
streamer->err = AudioFileStreamParseBytes(streamer->audioFileStream, inDataByteSize, inData, 0);