9

複数のオーディオ ファイルのストリーミングと同期を必要とする Web アプリケーションに取り組んでいます。このために、オーディオのタイミングが重要であるため、HTML5 オーディオ タグよりもWeb Audio APIを使用しています。

現在、FFMPEG のセグメンテーション機能を使用して、オーディオ ファイルを小さなチャンクにエンコードおよびセグメント化しています。それらをセグメント化する理由は、最初からではなく、ファイルの途中からストリーミングを開始できるようにするためです (そうでなければ、ここに示すように、UNIX 分割を使用してファイルを分割しただけです。問題は、オーディオ セグメントが元に戻ると、セグメント間にオーディオ ポップが発生します。

.wav ファイルで PCM エンコーディング (pcm_s24le) を使用してセグメントをエンコードすると、再生がシームレスになり、エンコーダーがファイルの先頭または末尾にパディングしていると思われます。さまざまなオーディオ ファイルを扱うので、.wav を使用すると帯域幅が非常に多く必要になります。

この問題に対する次の解決策のいずれかを探しています。

  • エンコードされたオーディオ ファイルをシームレスにセグメント化するにはどうすればよいですか?
  • ffmpeg (または別のユーティリティ) を使用してエンコーダーにオーディオ フレームをパディングさせないようにするにはどうすればよいですか?
  • オーディオ タグを使用せずに (任意のトラック時間で開始して) オーディオをストリーミングするより良い方法は何ですか?

システムインフォメーション

  • カスタム node.js サーバー
  • オーディオ ファイルのアップロード時に、node.js はデータを ffmpeg のエンコーダーにパイプします。
  • HTML5 Web Audio API でサポートされているエンコーディングを使用する必要があります
  • サーバーは、WebSockets ソケットを介して一度に 1 つのオーディオ チャンクを送信します

前もって感謝します。できるだけ明確にしようとしましたが、明確化が必要な場合は喜んで提供します。

4

1 に答える 1

2

PCMは非圧縮形式のため、シームレスな再生が期待できます。グリッチを作成できるものは何もありません。flac のようなロスレス コーデックを使用すると、同じことが起こります。一方、mp3、wma などの非可逆コーデックを使用する場合は、何らかの介入なしにグリッチを回避する方法はありません。たとえば、WMA デコーダーは、エンコード中に最初に提供したよりも多くの PCM を常に提供します。その余分なバイトはグリッチを生成し、持続時間も台無しにします。また、このような連結された再生 (カットリスト) は、必要以上に長くなります。DSP フィルタリングを使用してグリッチを滑らかにすることができます。トランジションのクロスフェードなど、いくつかの簡単なアクションを試すこともできます。おそらく、いくつかの有用な結果が得られるでしょう。

帯域幅の関係で一部のロスレス コーデックが受け入れられない場合は、別の方法として、mp3 などの非可逆コーデックで圧縮ファイルを作成し、計算された位置からストリーミングを開始することもできます。もちろん、PCM のようにサンプルを正確にシークすることはできず、デコーダが必要とする「前のデータ」を必要とせずに途中で圧縮データのデコードを開始するため、デコード中に少量の役に立たない PCM が得られます。ストリーミングを開始する前に、圧縮ファイルのシーク位置をより正確に計算できるため、このようなファイルのエンコード中は一定のビットレートをお勧めします。

ここでの不具合については、そのような mp3 ファイルのエンコードを開始し、エンコーダーを停止せずにこれらのファイルを作成すると、圧縮データをより多くのファイルに分割しただけなので、ファイルの切り替え中に不具合が発生することはありません。もちろん、これはおそらく自分で実装する必要があります。

于 2013-05-16T07:29:33.747 に答える