AVQueuePlayer太快开始下一个项目

5
我有一个AVQueuePlayer,在特定情况下,它会在前一个曲目播放完之前开始播放下一个曲目。它不会同时播放两个曲目,只是提前结束第一个曲目并开始播放下一个曲目。当两个曲目都是http流时,这种情况肯定会发生,但我还没有尝试在本地播放文件时是否会出现此问题。此外,并非每个曲目都会出现此问题,仅在将特定两个曲目放在一起时才会出现此问题。大多数曲目都没有这个问题,但也有相当数量的曲目存在此问题。其他媒体播放器在播放这些曲目时不会出现这些症状。显示这些症状的曲目必须使用AAC编码,但在流式传输其MP3版本时没有此类问题。使用libfaac、VBR 90%对AAC文件进行编码的确切命令行为:
ffmpeg -loglevel error -probesize 10000000 -i "$input" -strict -2 -acodec libfaac -q:a 90 -vn "$output.m4a"

我认为这个问题与AVQueuePlayer试图无间隙地播放音轨有关,因为我知道AAC中包含一些元数据,允许两个音轨无间隙地连续播放(在电子混音中特别有用)- 这些文件不应该具有此元数据,而且当播放两个不相关的音轨时,它肯定不会导致AVQueuePlayer崩溃。编辑:已确定不是原因,请参见下文。
如果您想自己重现此问题,只需编写一个基本项目,包括AVFoundation,并执行以下操作即可:
self.queuePlayer = [AVQueuePlayer queuePlayerWithItems: @[[AVPlayerItem playerItemWithURL: [NSURL URLWithString: @"https://eqbeats.org/track/4875/aac"]], [AVPlayerItem playerItemWithURL: [NSURL URLWithString: @"https://eqbeats.org/track/4499/aac"]]]];
[self.queuePlayer play];

让第一首歌曲播放到几乎结束(大约运行100秒左右),你会听到它突然停止,接着第二首曲目就开始播放。
我认为有解决方法,比如在下一首曲目开始时拦截消息并检查上一首曲目的播放状态,或者只有在前一首曲目开始后将下一项添加到队列中……但我担心这种方法的可靠性,特别是当应用程序处于后台时。如果客户端没有修复这个问题,我可以调查是否有一种方法可以在服务器端剥离这些元数据(假设那是问题所在),或者只使用体积更大、音质更差的MP3版本。
AVFoundation真是太棒了——我相信任何与它工作过的人都会同意这一点。我正在考虑是否向苹果报告此问题,但由于它已经在两个重要的iOS更新中存活下来,我感觉这些问题对于AVQueuePlayer来说只是家常便饭。从我对此问题的研究来看,我显然不是唯一一个与这个框架挣扎的人。

完全透露:我的应用实际上是用RubyMotion编写的,但我已经能够用少得多的代码在Objective-C中重现这个问题(因此可能出现故障的点较少),所以我相当确定RubyMotion或我的使用AVFoundation不是罪魁祸首。

编辑:刚刚使用file://链接测试了本地文件,问题仍然存在,因此这绝对不是流媒体引擎或Web服务器的问题。

编辑2:我已经研究了MP4规范以及iTunes和AVFoundation如何确定MP4的无间隙性。原来在moov.udta.meta.ilst.---原子中,应该有三个原子:meannamedata,它们告诉解码器重建无间隙所需的各种位。然而,导致问题的文件没有这些原子,因此这绝对不是无间隙播放的结果。我决定将原始文件(一个是FLAC,另一个是MP3)通过CoreAudio的AAC编码器进行转换,结果文件可以通过AVQueuePlayer完美地播放(即使我使用AtomicParsley去除了所有的无间隙标记),因此看起来这是libfaac输出或AVFoundation解码器在处理非苹果AAC比特流时的错误。
1个回答

5

不要在AVFoundation中使用libfaac。它不太适用。我们现在使用的是libfdk,很好用。

ffmpeg -loglevel error -probesize 10000000 -i "$input" -acodec libfdk_aac -vbr 3 -vn "$output.m4a"

在OS X上安装带有libfdk支持的ffmpeg指南:https://trac.ffmpeg.org/wiki/CompilationGuide/MacOSX - Christian Brink

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接