我有一个AVQueuePlayer
,在特定情况下,它将在上一个轨道结束之前开始播放下一个轨道。它不会同时播放它们,只是尽早切出第一首轨道,然后开始下一首轨道。当两个音轨都是HTTP流时,肯定会发生这种情况,在本地播放文件时我没有尝试过。此外,并非每条轨道都发生这种情况。放在一起时,只有特定的两个音轨会引起问题。大多数轨道都没有此问题,但是相当多。其他媒体播放器在喂入这些轨道时没有显示这些症状。表现症状的音轨必须经过AAC编码,在播放其MP3版本时,我没有此类问题。 AAC文件使用libfaac
(VBR为90%)进行编码。用于对轨道进行编码的确切命令行:
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
只是一场骚乱-我敢肯定任何有过与之共事的恐惧的人都会同意的。我正在讨论是否将其作为Apple的错误进行举报,但是由于它在两次iOS重大更新中均幸免于难,因此我感觉到这些东西对于AVQueuePlayer
来说像往常一样。从我对这个问题的研究来看,我显然不是唯一在这个框架上苦苦挣扎的人:全面披露:我的应用程序实际上是用RubyMotion编写的,但是我已经能够用更少的代码(因此,减少了很多的失败点)在Objective-C中重现了这个问题,所以我相当确定RubyMotion还是我的此处不是
AVFoundation
的使用原因。编辑:只是使用
file://
链接对本地文件进行了测试,问题仍然存在,因此流引擎或Web服务器绝对不是问题。编辑2:我研究了MP4规范以及iTunes和AVFoundation如何确定MP4中的无缝性。出现在
moov.udta.meta.ilst.---
原子中,应该有三个原子mean
,name
和data
,它们告诉解码器various bits needed to recreate gapless。但是,引起问题的文件没有这些原子,因此绝对不是无间隙播放的结果。我决定通过CoreAudio的AAC编码器运行原始文件(一个是FLAC,另一个是MP3),并且生成的文件可以通过AVQueuePlayer
正常播放(即使我用 AtomicParsley
剥离了所有无间隙的标签之后),看起来也像处理非Apple AAC比特流时,libfaac
的输出或AVFoundation
的解码器中的错误。 最佳答案
不要在AVFoundation中使用libfaac
。它不喜欢它。我们现在正在使用libfdk
,它不会烂。
ffmpeg -loglevel error -probesize 10000000 -i "$input" -acodec libfdk_aac -vbr 3 -vn "$output.m4a"