nginx rtm-module HLS配信で音ズレを修正する

nginx rtmp-module でHLS配信をしていますが、音ズレが気になってしょうがないような状態になってきました。RTMPで配信するよりも、ズレがひどくなっているように思います。

リップシンクとも呼ばれるかも。Lip Synchは唇の動きと、音声(音)がずれないように合わせていく事を言います。これを行うためには2つのアプローチがあります。

1つ目は、映像配信を長くしていると、段々と音がずれていってしまう。何の拍子か、長時間たつとだんだんと音と映像がずれていってしまう事があります。これをタイミングをとって自動的に補正する機能があります。

2つ目は、入力ソース上のズレは、上記自動補正では補正できません。映像キャプチャボード、音声キャプチャボードが分かれている場合は、どうやったってずれています。そのキャプチャーボードの性能によって大きくずれてしまうことだって考えられます。

3つ目は、Playerを疑います。私はweb player で、Video.jsを利用しブラウザ上でライブ映像が見られるようにしていました。rtmp配信では全く問題がなかったものが、hlsに変更する事で音ズレが目立つ羽目に。この音ズレも時間が経つにつれひどくなってくるもので、1番目・2番目の対策では全く効果がありませんでした。こんな場合は思い切ってPlayer自体を変えてしまいます。

私はエンコーダはOBSを利用しています。

ミキサー ⇒ 音声入力キャプチャ(マイクとか) ⇒ 歯車マーク ⇒ プロパティ

デバイスのタイムスタンプを使用にチェック

 

キーフレーム間隔

1秒(1秒ごとにキーフレームを送出して同期を促す)

 

wait_key on;

ビデオストリームをキーフレームで開始します。

wait_video on;

最初のビデオフレームが送信されるまでオーディオを無効にします。デフォルトではオフになっています。wait_keyそれに続く他の全てのデータと共にクライアント受信ビデオキーフレームを作るためにと組み合わせることができます。しかし、これは通常接続遅延を増加させます。エンコーダでキーフレームの間隔を調整して遅延を減らすことができます。

sync 10ms;

オーディオとビデオのストリームを同期させます。加入者帯域幅がパブリッシャ速度でデータを受信するのに十分でない場合、一部のフレームはサーバによって廃棄されます。これは同期の問題を引き起こす。タイムスタンプの差がsync引数として指定された値を超えると、それを修正する絶対フレームが送信されます。デフォルトは300msです。

入力ソースでずれていれば、1の同期をどうとっていっても、唇の動きと音声を同期させるのは無理です。元々ずれているのですから。特に映像はHDMIキャプチャで入力して、音声はアナログでキャプチャしているとか、入力経路が違えばずれてしまいます。それがエンコーダで処理する時に、パソコン内部の処理の違いによってもずれてくるため、さらに大きくずれてしまいます。これを手動で調整させます。

ミキサー ⇒ 音声入力キャプチャ(マイクとか) ⇒ 歯車マーク ⇒ プロパティ

オーディオの詳細プロパティ

同期オフセットで、音声を遅らせる事が可能です。マイナス値も設定して音声を進める事も可能ですが、入力ソースより早める事は不可能なのであまり期待できないと思います。

私は、Video.jsを利用し倒していて、videojs-contrib-hlsにお世話になっているわけですが、その大元のhls.jsを利用する事にしました。どうもVideojs-contrib-hlsはだんだんと音ズレしてしまいます。hls.jsで再生するようにしたら全く問題なくなりました。

おすすめhls web player hls.jsを使ってみる

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です