Raspividでh264エンコーディングをスキップするにはどうすればよいですか?(5秒のレイテンシストリーミングビデオを取り除く)


11

監視カメラとしてPI-Camと一緒にPiを使用する場合、5秒間のレイテンシを解消するための膨大な数のフォーラムとスレッドがあります。多くのチュートリアルは、RTCプロトコルを使用して画像をエンコードおよびストリーミングするためにvlcを使用する方法を示しています。これにより、約5秒の遅延が生じます。

私によると、理由はraspividがストリームをH264にエンコードしているのに対し、VLCは再度デコードして、RTPが何であれ再エンコードする必要があるためです。コマンドラインは次のようになります。

raspivid -w 640 -h 480 -o - -t 0 |cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/}' :demux=h264

最初の部分は、raspividにビデオを標準出力にストリーミングするように指示します。

raspivid -w 640 -h 480 -o - -t 0 

パイプの後の部分は、VLCにそれをピックアップし、h264を使用してデコードするように指示します。

cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/}' :demux=h264

この多重化と逆多重化は、リソースのかなりの部分です!

私はgithub でraspicamソースを見つけましたが、encoder_buffer_callbackメソッド(現在は848行目)でエンコードをスキップするために何かできると思います。しかし、私はcが得意ではなく、ビデオエンコーディングにも精通していないため、どこから始めればよいのかわかりません。

Githubでは330個のフォークを見ることができますが、それらは特にraspicam(ユーザーランドプロジェクト全体)向けではないようです。エンコーディングを削除したり、mjpegのような簡単なものを実装したりするフォークを見つけようとして迷いました。

cおよびビデオコーデックの知識を持つ誰かが、私と他の億兆のユーザーがレイテンシを取り除くのを助けることができますか?おそらく、解決策はすでにこれらのフォークの1つにありますが、運が悪ければ何時間もかけて検索してきました。

PS私はブラウザソリューションを探していませんが、最終的にはそれをSynologyにストリーミングしたいのですが、できればmjpegストリーミングを使用します(ただしWebページではなく、ほとんどの商用IPカメラに組み込まれている標準のmjpegストリームを使用します)。最初のステップは、h264をgettigで取り除くことです。


それは非常に徹底的な調査です。組み込みのJPEGエンコーダーにはライブラリーがなく、ソフトウェアがごみだったため、MJPEGを使用することは問題外です。HDでカスタムビルドのnginx-rtmp(FLVパッケージ)を使用して、約1秒の遅延を取得することができました!piは約30%のCPUを使用しましたが、タイミングフレームが欠落し、そのFLVが原因でVLCがデコードするのに苦労しました(また、私のCCTVソフトウェアはVLCシンクを使用し、1 720pストリームは40%のCPUを使用していました不安定
Piotr Kula 14

@ppumkin MJPEGは問題外だとは思いません。H264がなくなったら、デコードと再エンコードのオーバーヘッドなしに、好きなようにエンコードできます。H264を実際に持っていることはかなり贅沢です!オフにできるのは私たちだけです。それは窮屈なトイレの部屋に豪華なプルーチパッドとダイヤモンドを詰め込んだ玉座のようなものです。そのため、部屋には他に何も収まりません(ただし、少し上下にジャンプできるヘッドルームを除きます)...ドアを開けると、登らなければなりません。ハイアームレストの上に座ると、脚が入る余地がありません...
Louis Somers

はい、私はあなたの意味を理解しています。私はCCJPEG IPサーバーに適切な品質でMJPEGを取得するために何日も費やしています。APIが利用できないため、多くのことは変更されましたが、直接ハードウェアJPEGエンコードおよびストリームへのパイプ処理は存在しません。私が知っている唯一の方法はソフトウェアであり、私が見つけた最良の解決策はnginx-rtmp JPEGシンクでした。iPhoneのHLSは実際にはうまく機能しますが、5秒から10秒の遅れがあります:(
Piotr Kula 14

1
これをカメラソフトウェアのGithubプロジェクトに関する質問として挙げてみてください。おそらくそれが難しい理由の説明を得るでしょうが、他の人がそれを便利な機能だと思ったら、誰かがそれを実装するかもしれません。
TomG 2014

demuxはデコードと同じではありません... これ
Flash Thunder

回答:


5

それはおそらく回答から望んでいることではありませんが、VLCストリーミングはまったくお勧めしません。

学校のプロジェクトで、ストリーミングオプションをいくつか試しました(RPiでも!):

  • VLC
  • MJPEG
  • GStreamer

VLCとMJPEG(とあまり知られているいくつかの他)を使用して、私は.. 3と5秒の間のレイテンシを持っていた
のGStreamer、使用NO LATENCYと最高解像度(より多くのオプション)とを!
興味のある方はこちらからチェックできます

そして、あなたがそれを使うなら、これが私のパイプラインです:

raspivid -t 0 -w 640 -h 480 -fps 25 -b 1200000 -p 0,0,640,480 -o - | gst-launch-1.0 -v fdsrc ! h264parse ! rtph264pay config-interval=1 pt=96 ! gdppay ! tcpserversink host=YOUR_IP port=YOUR_PORT

1
はい、すでにGstreamerを試してみましたが、PCにストリーミングする場合などはうまく機能しますが、Synology DiskStationのようなサードパーティのソフトウェアではうまく機能しません。GStreamerはh264ストリームを再利用し、それをデコードせずにストリーミングプロトコルをラップするように見えます。これは優れたソリューションですが、残念ながら少数のユースケースでは使用できません。Androidデバイスでストリームを表示したい場合は、そのための独自のアプリを開発する必要があります。MJPEGははるかに広くサポートされており、Raspividを変更して、不必要なエンコーディングをスキップしてVLCなどに任せることができると確信しています。とにかくチップをありがとう
Louis Somers '29 / 07/29

1
私はSynologyも持っていますが、GStreamerを試していません(私のものは十分強力ではないと思います)。ところで、Androidについては、GStreamerも使用できます。私はそれを私のプロジェクトに使用しており、うまく機能しています:)!
Val

gstreamerの問題には、フレームデータへのtimeframeintervalが含まれておらず、シンクとしては使用できません(オプションを追加しても!!):(パイプ経由で使用できるmodスクリプトがありますが、gstreamerをVLC爆弾に頻繁に受信することがわかりました。 6か月前、私がsaome CCTVを行うことを検討していたとき、それは確実に機能しなかった:(
Piotr Kula 14

@Val true、Android用のSDKがありますが、play-storeには、gst-launch-1.0 -v tcpclientsrc host = 11.22.33.44 port = 1234のようなパイプラインをサポートするすぐに使用できるプレーヤーは多くありません。gdpdepay!rtph264depay!avdec_h264!videoconvert!autovideosink sync = false。iOSの場合は、さらに利用できません。Synologyは、ほとんどの主流のデバイスをサポートする優れたハブであり、モーション検出、記録、および通知をすべてすぐに実行できます(ウエストSDカードなしで)。
Louis Somers 14

あなたはまだこれをこのように使っていますか?新しいU4VLドライバーがありますが、VLCへのh264ストリーミングと同じラグの問題
Piotr Kula

0

私が最初にこの質問をして以来、何人かの人々はこれに懸命に取り組んでおり、この時までにいくつかの選択肢があります(誰もまだこの質問に答えていないのは奇妙です)。私はRaspberrIPCamを試してみて成功しましたが、rtspパケットのTTLが非常に短いようです。Piを私のPCの隣のルーターに直接接続すると、完全に機能します。しかし、必要な場所にカムを設置し、2台のルーターを介してストリームにアクセスしようとすると、すぐに画像が届きません。ソースコードを確認したところ、TTLが最大に設定されていました。私はそれを完全に理解したことはありません。

現在、私はRaspberryIPCameraが素晴らしいユーザーインターフェイス(スクリーンショットを参照)を備えており、既製のSDカードイメージさえあることをお勧めします。私はSDカードを試しましたが、ここで説明するように手動インストールに戻り、大きな成功を収めました(現在のセットアップ)。Synology DiskStationに接続する手順も利用可能で、私のシステムでは完全に機能しています。SDカードイメージの問題は、ファイルシステムをSDカードの全範囲に拡張できなかったことでした(GPIOピンを介していくつかのリレーを制御するために、SDカードのイメージを他にも実行したい)。

上記のソリューションは、UV4Lプロジェクトのコンポーネントを使用しています。このページの UV4Lプロジェクトのドキュメントには、次のことも記載されています。

特に、ビデオストリームをさまざまな方法で確認できるWebインターフェイスと、任意のVideo4Linuxアプリケーションでストリーミングしながらカメラ設定を完全に制御できるコントロールページを提供します。

私はまだその湖をまだ試していません(現在のセットアップを台無しにしたくないので)。


1
これが問題だったかどうかはわかりませんが、ルーターを介してマルチキャストRTSPトラフィックを送信している場合は、ルーターでIGMPスヌーピングが有効になっていることと、PCがルーターからのIGMPクエリをブロックしていないことを確認してください。そうしないと、ルーターはPCがパケットを受信しようとしていることを認識しないため、パケットを転送することはありません。
Malvineous 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.