2013-05-13 11 views
6

高ビットレートのHLSストリームに連続したライブストリームを録音しています。私は、これを異なるフォーマット/ビットレートに非同期に変換したいと思っています。私は、オーディオアーチファクトが各セグメント(ギャップとポップ)の間に現れることを除いて、ほとんどこの作業をしています。ここFFMPEGを使用して個別にHLSセグメントをトランスコードする

は、コマンドラインをffmpegの例である:例えばサウンドファイルを検査

ffmpeg -threads 1 -nostdin -loglevel verbose \ 
    -nostdin -y -i input.ts -c:a libfdk_aac \ 
    -ac 2 -b:a 64k -y -metadata -vn output.ts 

音声の終了時にギャップがあることを示している:

End

の開始ファイルは明らかに減衰しているように見えます(これは問題ではありません)。

Start

私は、ストリーム全体のコンテキストなしでトランスコードが行われているため、これらのアーチファクトが起こっている可能性が疑わしいです。

FFMPEGがHLSストリームに収まるようにオーディオを生成するように納得させる方法に関するアイデアはありますか?

**ここ**

UPDATE 1は、セグメントの開始/終了です。ご覧のとおり、スタートは同じですが、最後は30秒で終わりです。私は非可逆符号化とパディングをある程度期待するが、私HLSは、ギャップレス再生を行うために管理しているいくつかの方法があるが(カスタムメタデータとiTunesの方法には、この関連で?)

Original Start Original End

** 2を更新しました**

元の(MPEG2 TSの128k aac)とトランスコードされた(aac/adtsコンテナの64k aac)の両方をWAVに変換し、両者を並べて配置しました。これが結果です:

Side-by-side start Side-by-side end

私は、これは、クライアントがそれを再生する方法の代表的なものであるかどうかわからないんだけど、トランスコード1をデコードすることでギャップを導入していることを少し奇妙に思えますセグメントをより長くしてにします。両方が損失のあるエンコーディングであることを考えれば、私は両方で(もしあれば)同じようにパディングが存在することを期待していただろう。 http://en.wikipedia.org/wiki/Gapless_playbackによる** UPDATE 3 **

- エンコーダのほんの一握りは、ギャップレスをサポート - MP3のために、私はffmpegの中にラメに切り替えてきた、との問題は、これまでのところ、なくなっているように見えます。

AACの場合(http://en.wikipedia.org/wiki/FAACを参照)、私はlibfaac(libfdk_aacとは対照的)を試しましたが、gaplessオーディオも生成されているようです。しかし、後者の品質はあまり良くはありません。むしろlibfdk_aacを使用することは可能です。

+0

そして、波形は入力ファイルとどのように比較されますか? – vipw

+0

オリジナルと比較した波形で更新されました – rayh

答えて

0

これは、使用する明示的なツールを含むよりもむしろ概念的な答えです。申し訳ありませんが、何らかの用途に使用される可能性があります。オーディオアーチファクトの導入の問題を取り除きます層。

私の提案では、非圧縮の入力オーディオを分割しないで、icecast2サーバー(またはicecastがAACをサポートしていない場合は同様のもの)などのオーディオプロキシにパイプする連続した圧縮ストリームのみを生成し、圧縮オーディオのチャンクを使用して、プロキシのクライアント側で分割/再結合を実行します。

ここでは、定期的に(例えば、60秒ごとに)プロキシに接続し、ポーリングしている期間より少し大きい音声チャンクを収集します(これは75秒分の価値ですか?) - これはいくつかの時点では2つのクライアントが実行されるため、並列で実行するように設定する必要があります。シェルスクリプトから必要であれバックグラウンドであればcronから実行することもできます...

これで動作します。一連のチャンクを少しオーバラップさせると、これらを比較し、各チャンクに固有の中間のオーディオセクションを分離するために、いくつかの処理作業を行う必要があります。

明らかにこれは単純化プロキシがメタデータ情報(すなわち、ICYデータまたはヒント)を追加しないと仮定すると、この方法でオーディオを分割すると、オーディオアーチファクトなしで連結されることが可能になります。オリジナルのオーディオ入力とそれらを比較することは、あなたが実際にそのフォーマットについて気にしないので、それはちょうどその時点のバイトです。

ここでの利点は、オーディオエンコーダをクライアントから切断したことです。他のプロセスを並行して実行して、異なるフォーマットやビットレートにトランスコードしたり、プロキシのエンコーダー側では何も変更されません。ちょうど上記のようなツールチェーンを使用して別のクライアントをプロキシに追加するだけです。

+0

私はデバイスからのオーディオデータをバッファリングするシンプルなプロキシを持っていると思っています。これはデータを失うことなくエンコーディングを再開できるようになります...特にサンプルを理解し、サンプル境界。 – rayh

+0

しかし、オリジナルの問題を解決することなく、60sチャンクでのトランスコードは、チャンクの境界でこれらの問題を導入するだけです。アーチファクトはaacエンコーディングの結果であるように見えるため、混乱したオーディオファイルにも影響します。 – rayh

+0

これはおそらく古代の歴史ですが、これはフレーム境界で圧縮されたオーディオをカットすることを提案した理由です(確かに、それが必要な場所では割り切れませんが遠くはないでしょう)圧縮されたオーディオの2つの異種のチャンクを取り出して一緒に実行すると、アーティファクトは引き続き発生しますが、もともと連続していた場合は発生しません –

関連する問題