gpt4 book ai didi

iphone - AVQueuePlayer 过早开始下一项

转载 作者:可可西里 更新时间:2023-11-01 04:39:51 27 4
gpt4 key购买 nike

我有一个 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 来说只是一切照旧。 .从我对这个问题的研究来看,我显然不是唯一一个在这个框架上挣扎的人:
  • AVQueuePlayer frustrations (buffer underrun handling)
  • AVPlayer streaming stops in background due to gaps
  • AVQueuePlayer sometimes moves to the next AVPlayerItem in its items queue without sending AVPlayerItemDidPlayToEndTimeNotification
  • AVQueuePlayer playing several audio tracks in background iOS5
  • Detecting Current Item in AVQueuePlayer and Knowing when it Changes?

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

    编辑:刚刚使用 file:// 使用本地文件对其进行了测试链接,问题仍然存在,所以它绝对不是流引擎或网络服务器的问题。

    编辑 2:我研究了 MP4 规范以及 iTunes 和 AVFoundation 如何确定 MP4 中的无间隙。原来在 moov.udta.meta.ilst.---原子,应该有三个原子, mean , name , 和 data ,它告诉解码器 various bits needed to recreate gapless .然而,导致问题的文件 没有这些原子 所以这绝对不是无缝播放的结果。我决定通过 CoreAudio 的 AAC 编码器运行原始文件(一个是 FLAC,另一个是 MP3),结果文件通过 AVQueuePlayer 完美播放。 (即使我用 AtomicParsley 去掉了所有的无间隙标签),所以它看起来像是 libfaac 中的一个错误的输出或 AVFoundation处理非 Apple AAC 比特流时的解码器。

    最佳答案

    不要使用 libfaac与 AVFoundation。它不喜欢它。我们现在使用 libfdk它不烂。

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

    关于iphone - AVQueuePlayer 过早开始下一项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16748591/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com