将视频流数据写入 ffmpeg 的最快方法是什么?

将视频流数据写入 ffmpeg 的最快方法是什么?

/dev/video0我正在通过 stdin 使用 FFmpeg将 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

我编写了一个简单的 Rust 程序来抓取屏幕截图rxscreen(rust 绑定到 libX11)并将其写入 ffmpeg 的标准输入。我每秒发送 >30 帧(平均帧大小为 200000 字节 (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 支持开箱即用的方法。

相关内容