web-dev-qa-db-ja.com

H264 Janusを通じてFFMPEGからストリーミングされたWebRTCビデオは再生時に非常に途切れています

次のチェーンを介してビデオをストリーミングしようとしています。ローカルインスタンスストレージ上のH264/MP4ファイル(AWS) - > FFMPEG-> RTP-> Janusと同じインスタンス - > WebRTC再生(Chrome/Mac)。結果として得られるビデオは、どのリソースも過負荷になっているように見える(CPU /メモリ/ネットワーク帯域幅のいずれかに含まれる)。私はコッターンターンサーバーも使用しています、それはまったくロードされず、帯域幅は豊富です。

コーデックを切り替えようとしましたが、働いている間(●オミネスの種類はまだあるが非常にまれで許容できる)、そのような高いCPU消費をもたらし、そのような高いCPU消費が容認できないことをもたらしました。

ffmpeg -re -stream_loop -1 -i ./short.mp4 -s 426x240 -c:v libx264 -profile:v baseline -b:v 1M -r 24 -g 60 -an -f rtp rtp://127.0.0.1:5004 _

結果のSDPは次のとおりです。

o=- 0 0 IN IP4 127.0.0.1
s=No Name
c=IN IP4 127.0.0.1
t=0 0
a=tool:libavformat 58.20.100
m=video 5004 RTP/AVP 96
b=AS:1000
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1
 _

ストリームはJanus API ASで設定されています

            "janus" : "message",
            "transaction" : 'Transaction',
        "body": {
                "request" : "create",
                "type" : "rtp",
                "id" : newId,
                "name": streamId+newId,
                "audio": false,
                "video": true,
                "description" : streamId+newId,
                "videoport" : 5000+newId*4,
                "videopt" : 96,
                "videortpmap": "H264/90000",
                "secret" : "adminpwd"
            }
        }
 _

BWのさまざまなオプションを試してみましたが、まったく役に立ちません。値を下げるには、-g(GOPサイズ)を下げるまでの時間が短くなると頻繁に頻繁になることがあります。 -g 3または4では許容可能ですが、許容できる品質のビットレートは予測可能になり、非常識になります。

期待される結果:ビデオは、軽さなしに再生されます。

私の理論の理論はそれが次のうちの1つかもしれません:

  • どちらのFFMPEGがバッファーにデータを提供していますが、Janusがまだ準備ができていない間に次のパケットを送信する必要があるため、飢えバッファ、中断の結果として次のパケットを送信する必要があるため、FFMPEGをある種のショートにする方法がある場合があります(半秒かそこらのフローを調節するための緩衝液。どのように?

  • またはH264はそのままUDPの上では悪く機能し、私ができることは何もありません。それから私はTCPに切り替えるようになりましたが、これまでにこれをやろうとしたことに失敗しました。

6

fFMPEGは、個々の符号化フレームを出力するためのものではなく、チャンク内のフレームを出力するように最適化されています。マセルの場合は、RTPマルチュアの場合は、出力にフラッシュする前にデータをバッファします。そのため、FFMPEGはリアルタイムストリーミングのために最適化されていません。しかし、WEBRTCは本当にリアルタイムに到着するフレームを必要としているので、フレームが束で送信された場合、それは「遅い」フレーム、したがってのオミネスを破棄する可能性があります。

ただし、FFMPEGには、マセルのバッファサイズを0に設定することができます。それは:

- max_delay

また、WebRTCの場合は、Bフレームを無効にし、SPS-PPSをすべてのキーフレームに追加します。

- bf 0 + global_header -bsf:v "dump_extra = freq = keyframe"

2
user1390208