opencv - 在 Opencv 中处理相机流,使用 FFMPEG 将其推送到 RTMP(NGIN

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

相关文章:

matlab - 光流直方图如何工作?

python - 延时图像的亮度/直方图归一化

python - 从笔记本中提取文本

opencv - 如何将Emgu::CV::Mat转换为OpenCV cv::Mat,反之亦然?

opencv - 拼接细节中相机参数调整失败问题

java - OpenCV Java RGB还是HSV?

python - 从阈值图像中找到轮廓

image - 不是JPEG文件:开头为0x0a 0x4c错误

python - 从二进制字符串加载OpenCV图像

android - 使用ORB和RANSAC的OpenCV中用于Android关键点匹配和阈值的性能