5

を持っていますが、特定のAVQueuePlayer状況下で、前のトラックが終了する前に次のトラックの再生を開始します。両方を同時に再生するのではなく、最初のトラックを早めに切り取り、次のトラックを開始します。これは、両方のトラックが http ストリームである場合に確実に発生します。ファイルをローカルで再生するときは試していません。また、これはすべてのトラックで発生するわけではありません。特定の 2 つのトラックを一緒にすると、問題が発生します。ほとんどのトラックにはこの問題はありませんが、かなりの数のトラックに問題があります。他のメディア プレーヤーでは、これらのトラックをフィードしてもこれらの症状は見られません。症状を示すトラックはAACエンコードする必要があります。MP3 バージョンをストリーミングする場合、そのような問題はありません。AAC ファイルは、libfaac、VBR 90%。トラックをエンコードするための正確なコマンド ライン:

ffmpeg -loglevel error -probesize 10000000 -i "$input" -strict -2 -acodec libfaac -q:a 90 -vn "$output.m4a"

この問題は、トラックをギャップレスで積極的に再生しようとすることに関連してAVQueuePlayerいると思います.2つのトラックをギャップなしで順番に再生できるようにするメタデータがAACに含まれていることを知っています(特に電子ミックスで役立ちます)-これらのファイルにはこのメタデータがあってはなりませんとはいえ、関係のない 2 つのトラック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 秒ほどかかります)、突然終了して 2 番目のトラックが再生されます。

次のトラックが開始されたときにメッセージを傍受して前のトラックの再生状態を確認する、前の開始後にのみ次のアイテムをキューに追加するなどの回避策があると思います...しかし、そのような方法の信頼性が心配です.特にアプリがバックグラウンドの場合。このクライアント側に修正がない場合は、このメタデータ サーバー側を削除する方法があるかどうかを調査するか (それ問題であると仮定します)、はるかに大きく、はるかに音質の悪い MP3 バージョンを使用することをあきらめます。

AVFoundationはただの暴動です - それを使って恐怖を感じたことのある人なら誰でも同意するでしょう。これを Apple にバグとして報告するかどうかは議論中ですが、iOSの2 つAVQueuePlayerの主要なアップデートを経ても生き残っているので、これは. この問題に関する私の調査から判断すると、このフレームワークに苦労しているのは明らかに私だけではありません。

完全な開示: 私のアプリは実際には RubyMotion で書かれていますが、Objective-C で問題を再現するコードはずっと少なくて済みました (したがって、障害の可能性がはるかに少なくなりました)。の使用はAVFoundationここでの犯人ではありません。

編集:リンクを使用してローカルファイルでテストしたところfile://、問題はまだ残っているため、ストリーミングエンジンやWebサーバーの問題ではありません.

編集 2: MP4 の仕様と、iTunes と AVFoundation が MP4 のギャップレス性を判断する方法を調べました。アトムには、 、、およびの 3 つのmoov.udta.meta.ilst.---アトムがあるはずであり、ギャップレス を再作成するために必要なさまざまなビットをデコーダーに伝えます。ただし、問題の原因となるファイルにはこれらのアトムがないため、ギャップレス再生の結果ではないことは間違いありません。元のファイル (1 つは FLAC、もう 1 つは MP3) を CoreAudio の AAC エンコーダーで実行することにしました。Apple 以外の AAC ビットストリームを扱うときのの出力またはのデコーダ。meannamedataAVQueuePlayerAtomicParsleylibfaacAVFoundation

4

1 に答える 1

5

libfaacAVFoundationでは使用しないでください。それは好きではありません。私たちは今使っていますがlibfdk、それは悪くありません。

ffmpeg -loglevel error -probesize 10000000 -i "$input" -acodec libfdk_aac -vbr 3 -vn "$output.m4a"
于 2013-06-07T08:23:08.590 に答える