/dev/video0
私はFFmpegを使ってstdin経由でx11画面をv4l2ウェブカメラデバイスにライブストリーミングしています。
ffmpeg -re -probesize 32 -analyzeduration 0 -i pipe:0 -s 1280x720 -vf scale=1280:720 -preset veryfast -tune zero_latency -vf format=yuv420p -f v4l2 /dev/video0
rxscreen
私はスクリーンショット(rustはlibX11にバインドされています)をキャプチャし、それをffmpegの標準入力に書き込むための簡単なRustプログラムを書いています。毎秒30フレーム以上を送信しています(平均フレームサイズは200,000バイト(200kb))。
残念ながら、この方法でストリーミングすると5〜9秒の遅延が発生しますが、ffmpegに組み込まれているx11グラブを使用すると
ffmpeg -framerate 30 -video_size 500x500 -draw_mouse 0 -f x11grab -i :1.0+0,0 -s 1280x720 -vf scale=1280:720 -preset veryfast -tune zero_latency -vf format=yuv420p -f v4l2 /dev/video0
非常に小さな遅延(1〜2ms)があります。元の方法でビデオ遅延を減らすためにできることをすべて試しましたが、結果は同じです。これらの遅延は、私のデータ転送方法(標準入力に大量のデータを書き込む)によって引き起こされますが、ffmpegの組み込み画面スクレイピングの実装はメモリから直接データを読み書きできます。
外部プログラムからFFmpegにデータを書き込む最速の方法は何ですか?標準入力、UDP、名前付きパイプ、メモリマッピングファイル
FFmpegがこの方法をネイティブにサポートしていれば、これは最善です。