[FFmpeg] 如何通过实时摄像头帧图片生成 rtmp 直播流?

2018-03-08 20:23:29 +08:00
 ZoomQuiet

背景

分析

尝试

问题

动态固定图片

尝试将实时帧图像,另外输出到硬盘固定图片文件, 内容动态变化,

命令改变为: ffmpeg -f image2 -loop 1 -i "path/2/frame.png" ...

但是, 无论怎么调整参数,都只能工作十多帧就崩溃了, 报错都是类似:

...
Error while decoding stream #0:0: Invalid data found when processing input
    Last message repeated 1 times
Past duration 0.799995 too large
[flv @ 0x7fabfa001800] Failed to update header with correct duration.34.3kbits/s dup=0 drop=1120 speed=7.25x
[flv @ 0x7fabfa001800] Failed to update header with correct filesize.
frame= 1730 fps=109 q=5.5 Lsize=    3300kB time=00:01:55.40 bitrate= 234.3kbits/s dup=0 drop=1120 speed=7.24x
video:3273kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.832250%

系列静态图片

而将帧图像持续输出为一系列有命名规模的静态图片后, 参考:

无论怎么折腾参数, 都无法工作, 报错为:

...

  Metadata:
    encoder         : Lavf57.71.100
    Stream #0:0: Video: flv1 (flv) ([2][0][0][0] / 0x0002), yuv420p, 480x270, q=2-31, 200 kb/s, 25 fps, 1k tbn, 25 tbc
    Metadata:
      encoder         : Lavc57.89.100 flv
    Side data:
      cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: -1
[flv @ 0x7ff53d008600] Failed to update header with correct duration.
[flv @ 0x7ff53d008600] Failed to update header with correct filesize.
frame=   20 fps=0.0 q=9.7 Lsize=     173kB time=00:00:00.76 bitrate=1867.3kbits/s speed=10.1x
video:173kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.300397%

所以, 综合以上, 想知道如何能通过动态图片 /实时增长的系列图片 实时编译为 rmtp 直播流?

或是说, 思路上还有什么选择?

17701 次点击
所在节点    程序员
34 条回复
contmonad
2018-03-08 21:47:33 +08:00
经过磁盘文件中转后实时性不好吧,直接用 pipe。这里有个 OpenCV 到 FFmpeg 的例子: https://stackoverflow.com/q/36422211/3107204

我猜用 FFmpeg 的 Python binding 也可以( libavdevice 操作摄像头,libavformat 转封装),而且自由度更高。
contmonad
2018-03-08 21:51:17 +08:00
你帖子中的描述概念错误好多啊。。建议找 H.264 和 RTMP 的规范看一下
wdlth
2018-03-08 22:11:37 +08:00
为何不直接传输视频流?
likuku
2018-03-08 22:55:11 +08:00
rtmp 传输的也就是包装成 flv 的 h264 流 (video: h264, audio: aac)
likuku
2018-03-08 22:56:38 +08:00
ffmpeg 本身就具有直接读取摄像头抓取信息的能力,只要你机器编码足够快(GPU 之类加速就 OK),实时推流不是问题
fgodt
2018-03-08 22:59:21 +08:00
不是很懂你的构架,正常的如果有图片源用 ffmpeg 编成 264 封装成 flv 输出到 rtmp 地址就行了
picone
2018-03-09 01:13:28 +08:00
动态图片不可行,刚好我毕设在做相关的项目,可以一起讨论。
因为是本科生的毕设,所以就用动态图片实现了,websocket+protobuf,传输图片,前端 img 加载。
后端用 APS 定时抓帧,用 jpeg 编码再推送出去。
我的 mac 跑,9fps,单核 cpu 跑满。。。再高的 fps 就有延迟了。。。
https://github.com/picone/RealTimeTrackingCamera
你可以用 jsmpeg 实现以下,把视频用 mpeg 压缩,效果会好很多
ETiV
2018-03-09 02:26:39 +08:00
// 可能需要重写 Python 的部分

摄像头 -> FFmpeg -> nginx-rtmp -> 通过指令 push 把直播流推出去 -> 直播站点
             \-> Python (或 FFmpeg )读 rtmp:// 直播流,拆出来图片 -> Python 分析
ZoomQuiet
2018-03-09 07:15:09 +08:00
@likuku 是也乎 ╮(╯▽╰)╭

多谢提醒…可以无声的…推流~
ZoomQuiet
2018-03-09 07:18:02 +08:00
@ETiV 试过…不可用…
机械视觉部分实时要求高…

且需要用原帧~
从第三方直播服装绕时间轴全乱套了…

是也乎 ╮(╯▽╰)╭
ZoomQuiet
2018-03-09 07:19:04 +08:00
@fgodt 是也乎 ╮(╯▽╰)╭

正常的是图片已准备好…
俺这是实时动态生成的…
ZoomQuiet
2018-03-09 07:20:37 +08:00
@contmonad
是也乎 ╮(╯▽╰)╭

多谢提醒…概念术语的确不准…
直播方面是二把刀…
临时突然要追加的…
ZoomQuiet
2018-03-09 07:21:26 +08:00
@contmonad 多谢~
有方向好探查…

是也乎 ╮(╯▽╰)╭
ZoomQuiet
2018-03-09 07:23:25 +08:00
@picone 多谢提醒…
也尝试过 jsmpeg …官网效果看着好~
竟然安装不上…
俺这就再刷一下…
ZoomQuiet
2018-03-09 07:57:25 +08:00
@contmonad 再次感谢
pipe 是个靠谱的方向, 之前实现过, 都忘记了...

> ... libavdevice 操作摄像头,libavformat 转封装...

涉及 FFmpeg 底层 C 库了,这种调试起来就嗯哼了...
gggxxxx
2018-03-09 09:01:18 +08:00
几年前我自己用 librtmp 做过类似的,摄像头画面直接推到 rtmp 服务器。
不用 ffmpeg 也能实现。
fgodt
2018-03-09 09:34:05 +08:00
你想不写代码用几个命令来处理还是有点难度,正确的流程应该是
1 视频流->ffmpeg->pkt
2 pkt->ffmpeg->图片->py 处理
3 pkt->ffmpeg->rtmp
第二步第三步可以互不影响
Panic
2018-03-09 10:07:19 +08:00
应该就是使用 pipe,先将 png 转成 rgb 格式或 YUV 格式的 rawvideo, 再送到 ffmpeg 的 pipe 进行编码,输出 rtmp 到添加了 rtmp 模块的 nginx 服务器。客户端连接通过 rtmp 链接访问 nginx 就可以了。
retamia
2018-03-09 10:44:19 +08:00
你是要将摄像头采集到的图片帧处理后,进行直播推流吗?
ZoomQuiet
2018-03-09 18:49:56 +08:00
@retamia 是也乎 ╮(╯▽╰)╭

对的…整体数据流必须这样…

通过硬盘文件来隔离不同业务…

否则有硬件争用现象…

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/436280

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX