首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Opencv中处理摄像机流,使用FFMPEG将其推到RTMP (NGINX RTMP模块)上

在Opencv中处理摄像机流,使用FFMPEG将其推到RTMP (NGINX RTMP模块)上
EN

Stack Overflow用户
提问于 2016-04-05 09:24:32
回答 2查看 8.4K关注 0票数 2

输出视频:https://youtu.be/VxfoBQjoY6E

解释:

我想:处理Opencv中的相机流,并将其推到RTMP服务器上。我已经设置了NGINX (RTMP模块),我已经用RTMP (Flash )和HLS测试了流视频。

我正在循环中读取框架,并使用python中的“子进程”来执行ffmpeg命令。下面是我使用的命令:

代码语言:javascript
复制
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终端日志的输出:

代码语言:javascript
复制
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   

它最后提到了速度。我认为应该接近1倍。我不知道如何做到这一点。

而且我和服务器在同一个网络上,如果需要的话我可以发布我的python代码。需要一些专家给我一些建议。

编辑

我的输入fps实际上是3。使用'-use_wallclock_as_timestamps', '1',我可以在日志中看到速度接近1倍。但是HLS并不是流媒体直播克里斯的建议部分奏效了。我不知道问题到底在哪里,我开始相信它与nginx模块有关。

这是最后的输出,左边是闪光灯,右边是hls。我在最后给大家展示了各种选择。https://youtu.be/jsm6XNFOUE4

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-17 05:10:36

我以前也遇到过类似的问题,不管是原始视频(像你一样)还是MJPEG源。有两个输入选项可以尝试使用ffmpeg使其保持1倍的速度:

备选案文1

代码语言:javascript
复制
ffmpeg -re -i <rest of input options>

-re告诉ffmpeg以本机输入速率读取。

选项2

代码语言:javascript
复制
ffmpeg -use_wallclock_as_timestamps 1 -i <rest of input options>

-use_wallclock_as_timestamps告诉ffmepg,当它进来时,只取每一帧,占用系统时间,并将其作为时间戳。当速度减慢时,我发现这个选项最有效。

不顾一切

确保您是在一个恒定的帧编码。当框架变化时,ffmpeg可能会变得有些挑剔,因此在输出选项上,使用-r 25 (替换所需输出框架的25 )来强制ffmpeg使用静态框架输出。

票数 1
EN

Stack Overflow用户

发布于 2019-08-12 03:27:58

我遇到了同样的问题,发现ffmpeg无法自动填补空白,所以当您给ffmpeg提供3 fps时,客户端仍将以25 fps的速度播放,因此客户端需要在播放前缓存大量帧,然后以快速的速度播放,然后再停下来缓存帧。

因此,当您向ffmpeg提供这样的代码时,很容易就可以填补空白。

代码语言:javascript
复制
timeStart = get_time_seconds()
count = 0
some loop:
  frame = getimage()
  targetCount = (get_time_seconds()-timeStart)*25
  repeatCount = targetCount - count
  loop for repeatCount times:
     proc.stdin.write(frame.tostring()) 
  count = targetCount 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36422211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档