gpt4 book ai didi

opencv - 在 Opencv 中处理相机流,使用 FFMPEG 将其推送到 RTMP(NGINX RTMP 模块)上

转载 作者:行者123 更新时间:2023-12-02 16:30:19 28 4
gpt4 key购买 nike

输出视频:
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

问题:

我可以看到流很好,但它经常卡住和恢复。这是 FFMPEG 终端日志的输出:
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

它在最后提到了速度。我相信它应该接近1x。我不确定如何实现这一目标。

而且我与服务器在同一个网络上,如果需要,我可以发布我的 python 代码。需要一些 ffmpeg 大师给我一些建议。

编辑

我的输入 fps 实际上是 ~3。
'-use_wallclock_as_timestamps', '1'我可以在日志中看到速度接近 1 倍。
但是 HLS 没有直播,有大约 2 分钟的延迟,它会停止并且 .克里斯的建议部分奏效。我不确定问题到底出在哪里,我开始相信它与 nginx-rtmp 模块有关。

这是最终输出,左边是 flash,右边是 hls。我在最后展示了 ffmpeg 选项。
https://youtu.be/jsm6XNFOUE4

最佳答案

在流式传输原始视频(就像您一样)或来自 MJPEG 源之前,我也遇到过类似的问题。有两个输入选项可以尝试使用 ffmpeg 使其保持 1x 速度:
选项1

ffmpeg -re -i <rest of input options>
-re告诉 ffmpeg 以 native 输入速率读取
选项 2
ffmpeg -use_wallclock_as_timestamps 1 -i <rest of input options>
-use_wallclock_as_timestamps告诉 ffmepg 在每一帧进入时只获取它,获取系统时间,并使其成为时间戳。当速度减慢时,我发现此选项最有效。
不顾一切
确保您以恒定的帧速率进行编码。当帧率变化时,ffmpeg 会变得有点挑剔,所以在输出选项上,使用 -r 25 (将 25 替换为所需的输出帧速率)强制 ffmpeg 使用静态帧速率输出

关于opencv - 在 Opencv 中处理相机流,使用 FFMPEG 将其推送到 RTMP(NGINX RTMP 模块)上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36422211/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com