我有一个
我认为这个问题与AVQueuePlayer试图无间隙地播放音轨有关,因为我知道AAC中包含一些元数据,允许两个音轨无间隙地连续播放(在电子混音中特别有用)- 这些文件不应该具有此元数据,而且当播放两个不相关的音轨时,它肯定不会导致AVQueuePlayer崩溃。编辑:已确定不是原因,请参见下文。
如果您想自己重现此问题,只需编写一个基本项目,包括AVFoundation,并执行以下操作即可:
让第一首歌曲播放到几乎结束(大约运行100秒左右),你会听到它突然停止,接着第二首曲目就开始播放。
我认为有解决方法,比如在下一首曲目开始时拦截消息并检查上一首曲目的播放状态,或者只有在前一首曲目开始后将下一项添加到队列中……但我担心这种方法的可靠性,特别是当应用程序处于后台时。如果客户端没有修复这个问题,我可以调查是否有一种方法可以在服务器端剥离这些元数据(假设那是问题所在),或者只使用体积更大、音质更差的MP3版本。
AVFoundation真是太棒了——我相信任何与它工作过的人都会同意这一点。我正在考虑是否向苹果报告此问题,但由于它已经在两个重要的iOS更新中存活下来,我感觉这些问题对于AVQueuePlayer来说只是家常便饭。从我对此问题的研究来看,我显然不是唯一一个与这个框架挣扎的人。
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来说只是家常便饭。从我对此问题的研究来看,我显然不是唯一一个与这个框架挣扎的人。
- AVQueuePlayer的困扰(缓冲不足处理)
- 由于间隙,AVPlayer在后台流媒体播放停止
- AVQueuePlayer有时会在不发送AVPlayerItemDidPlayToEndTimeNotification的情况下移动到其项目队列中的下一个AVPlayerItem
- AVQueuePlayer在iOS5后台播放多个音轨
- 检测AVQueuePlayer中的当前项目并知道何时更改?
完全透露:我的应用实际上是用RubyMotion编写的,但我已经能够用少得多的代码在Objective-C中重现这个问题(因此可能出现故障的点较少),所以我相当确定RubyMotion或我的使用AVFoundation
不是罪魁祸首。
编辑:刚刚使用file://
链接测试了本地文件,问题仍然存在,因此这绝对不是流媒体引擎或Web服务器的问题。
moov.udta.meta.ilst.---
原子中,应该有三个原子:mean
、name
和data
,它们告诉解码器重建无间隙所需的各种位。然而,导致问题的文件没有这些原子,因此这绝对不是无间隙播放的结果。我决定将原始文件(一个是FLAC,另一个是MP3)通过CoreAudio的AAC编码器进行转换,结果文件可以通过AVQueuePlayer
完美地播放(即使我使用AtomicParsley
去除了所有的无间隙标记),因此看起来这是libfaac
输出或AVFoundation
解码器在处理非苹果AAC比特流时的错误。