输出视频:
https://youtu.be/VxfoBQjoY6E
解释:
我想:在 Opencv 中处理摄像头流并将其推送到 RTMP 服务器。我已经设置了 NGINX(RTMP 模块),并且已经使用 RTMP(Flash Player)和 HLS 测试了流式视频。
我正在循环读取帧并在 python 中使用“子进程”来执行 ffmpeg 命令。这是我正在使用的命令:
command = [ffmpeg,
'-y',
'-f', 'rawvideo',
'-vcodec','rawvideo',
'-pix_fmt', 'bgr24',
'-s', dimension,
'-i', '-',
'-c:v', 'libx264',
'-pix_fmt', 'yuv420p',
'-preset', 'ultrafast',
'-f', 'flv',
'rtmp://10.10.10.80/live/mystream']
import subprocess as sp
...
proc = sp.Popen(command, stdin=sp.PIPE,shell=False)
...
proc.stdin.write(frame.tostring()) #frame is read using opencv
Stream mapping:
Stream #0:0 -> #0:0 (rawvideo (native) -> h264 (libx264))
frame= 117 fps= 16 q=22.0 size= 344kB time=00:00:04.04 bitrate= 697.8kbits/s speed=0.543x
'-use_wallclock_as_timestamps', '1'
我可以在日志中看到速度接近 1 倍。最佳答案
在流式传输原始视频(就像您一样)或来自 MJPEG 源之前,我也遇到过类似的问题。有两个输入选项可以尝试使用 ffmpeg 使其保持 1x 速度:
选项1
ffmpeg -re -i <rest of input options>
-re
告诉 ffmpeg 以 native 输入速率读取ffmpeg -use_wallclock_as_timestamps 1 -i <rest of input options>
-use_wallclock_as_timestamps
告诉 ffmepg 在每一帧进入时只获取它,获取系统时间,并使其成为时间戳。当速度减慢时,我发现此选项最有效。-r 25
(将 25 替换为所需的输出帧速率)强制 ffmpeg 使用静态帧速率输出
关于opencv - 在 Opencv 中处理相机流,使用 FFMPEG 将其推送到 RTMP(NGINX RTMP 模块)上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36422211/