ffmpeg udp 直播发布到 rtmp

Posted

技术标签:

【中文标题】ffmpeg udp 直播发布到 rtmp【英文标题】:ffmpeg udp live stream publish to rtmp 【发布时间】:2015-02-20 12:05:35 【问题描述】:

我需要制作这条链: JVC HM650--UDP-->localhost-->ffmpeg(复制流)-->nginx-rtmp

在输入时,我有来自摄像头的 UDP 流 (udp://@:35501),我需要它发布到 rtmp 服务器(带有 rtmp 模块的 nginx)。除了一切正常 - 我可以在 VLC 上播放输入,我可以从 FMLE 流式传输到 nginx 等。除了这是我第一次使用 ffmpeg,我无法让它工作。所以:

这是我最好的:

C:\ffmpeg\bin>ffmpeg -re -i udp://@:35501 -f flv "rtmp://192.168.1.17/live/live" -loglevel debug
ffmpeg version N-69972-g6c91afe Copyright (c) 2000-2015 the FFmpeg developers
  built with gcc 4.9.2 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnu
tls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-
libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-l
ibrtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --
enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --ena
ble-libxvid --enable-lzma --enable-decklink --enable-zlib
  libavutil      54. 19.100 / 54. 19.100
  libavcodec     56. 25.100 / 56. 25.100
  libavformat    56. 23.100 / 56. 23.100
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 11.100 /  5. 11.100
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  3.100 / 53.  3.100
Splitting the commandline.
Reading option '-re' ... matched as option 're' (read input at native frame rate) with argument '1'.
Reading option '-i' ... matched as input file with argument 'udp://@:35501'.
Reading option '-f' ... matched as option 'f' (force format) with argument 'flv'.
Reading option 'rtmp://192.168.1.17/live/live' ... matched as output file.
Reading option '-loglevel' ... matched as option 'loglevel' (set logging level) with argument 'debug'.
Finished splitting the commandline.
Parsing a group of options: global .
Applying option loglevel (set logging level) with argument debug.
Successfully parsed a group of options.
Parsing a group of options: input file udp://@:35501.
Applying option re (read input at native frame rate) with argument 1.
Successfully parsed a group of options.
Opening an input file: udp://@:35501.
[udp @ 0000000002c30760] end receive buffer size reported is 65536
[AVIOContext @ 0000000002c513c0] Statistics: 0 bytes read, 0 seeks
udp://@:35501: Immediate exit requested
Received signal 2: terminating.

C:\ffmpeg\bin>

ffmpeg 配置有什么问题?

解决方案:

ffmpeg 正在侦听错误版本的 UDP 协议:

甚至在网卡上禁用 IPv6,在系统内部,使用 @ 允许 ffmpeg 侦听 UDPv6。

通过使用 127.0.0.1 告诉 ffmpeg 使用干净的 UDP。

谢谢@thomas,让我有不同的想法!

【问题讨论】:

【参考方案1】:

看来你的 ffmpeg 命令是对的,它对我有用。有关信息,这里是导致配置良好的 udp 连接的输出:

...
Opening an input file: udp://@:35501.
[udp @ 0x2058c80] end receive buffer size reported is 131072
[flv @ 0x20631a0] Format flv probed with size=2048 and score=100
[flv @ 0x20631a0] Before avformat_find_stream_info() pos: 13 bytes read:2099 seeks:0
[flv @ 0x20631a0] max_analyze_duration 5000000 reached at 5016000 microseconds
rfps: 29.916667 0.015099
rfps: 30.000000 0.000067
    Last message repeated 1 times
rfps: 60.000000 0.000267
    Last message repeated 1 times
rfps: 120.000000 0.001067
    Last message repeated 1 times
rfps: 240.000000 0.004267
rfps: 29.970030 0.002007
rfps: 59.940060 0.008027
[flv @ 0x20631a0] After avformat_find_stream_info() pos: 12110 bytes read:12110 seeks:0 frames:154
Input #0, flv, from 'udp://@:35501':
  Metadata:
    AspectRatioX    : 1
    AspectRatioY    : 1
    metadatacreator : GStreamer FLV muxer
    creationdate    : Mon Feb 23 6:51:54 2015
  Duration: N/A, start: 0.002000, bitrate: N/A
    Stream #0:0, 154, 1/1000: Video: h264 (High), yuv420p, 320x240 [SAR 1:1 DAR 4:3], 1/60, 30.30 fps, 30 tbr, 1k tbn, 60 tbc
Successfully opened the file.
Parsing a group of options: output file rtmp://192.168.0.20/live/live.
Applying option f (force format) with argument flv.
Successfully parsed a group of options.
Opening an output file: rtmp://192.168.0.20/live/live.
...

这意味着您的传入流配置不正确。您确定您的相机正在流式传输到正确的协议(udp)、地址(ffmpeg 主机的 ip)和端口(35501)吗? 也许如果你没有它,我在这里找到了你的相机手册:http://pro.jvc.com/pro/attributes/CAMERA/manual/GY-HM650U_V2.pdf(直播第 166 页)

希望对你有帮助!

【讨论】:

嗨,@thomas。我相信相机配置正确,正如我在 VLC 中看到的那样,我们已经在流媒体模式下使用了一段时间,即使是通过 4G (LTE) 连接,它也可以正常工作。除了,作为接收件我们使用 VLC,但我不想摆脱它并创建不包括在服务器端手动启动的自动化和可靠的工作流程。我什至尝试使用 ffmpeg 记录到文件中,但输出始终是无法播放的 1kb 文件。 ffmpeg 是否需要一些库或 Windows 依赖项? 我看到有时 ffmpeg 块上的“报告的最终接收缓冲区大小为 65536”步骤。您是否尝试过: - 停止从相机流式传输 - 重新启动您的 ffmpeg 命令 - 然后再次从相机开始流式传输?您使用什么类型的连接来流式传输到 VLC? 也许我错了,但要确保您确实在流式传输到 udp 端口​​ 35501,请停止 ffmpeg 并在命令行工具中运行以下 python 脚本:udpserver.py。然后开始从您的相机流式传输。如果我是对的,脚本将在“等待端口:35501”这一行无限等待。 我找到了不同的解决方案,因为我没有设置 Py,我对它太生疏了,多年来没有在 Py 中写过任何一行 :) 所以,令人困惑的事情, ffmpeg 正在监听 UDPv6 而不是简单的 UDP。我注意到 ffmpeg 正在监听 UDPv6 的 TcpView(来自Sysinternals)。为了更正它,我只是将命令从@ 更改为127.0.0.1。我得到了下一个错误,但是there is no place like 127.0.0.1,你知道... 哦,奇怪..默认情况下,它正在侦听 udp v4。干得好!你的新错误是什么?如果您正在寻找支持 rtmp 和 rtmfp 的小型服务器,您可以尝试MonaServer

以上是关于ffmpeg udp 直播发布到 rtmp的主要内容,如果未能解决你的问题,请参考以下文章

流媒体服务海康摄像头RTSP视频推流转码拉流直播综合应用:VLC+FFMPEG+Nginx实现RTSP到RTMP网页直播

搭建rtmp直播流服务之4:videojs和ckPlayer开源播放器二次开发(播放rtmphls直播流及普通视频)

直播 RTMP 转 HTML5

直播系列1-ffmpeg捕捉摄像头发送rtmp

流媒体开发10ffmpeg命令直播

流媒体开发10ffmpeg命令直播