【问题标题】:FFmpeg command: stream generated raw video over RTSPFFmpeg 命令:通过 RTSP 流式传输生成的原始视频
【发布时间】:2018-06-25 08:52:10
【问题描述】:

我正在研究使用 FFmpeg 将应用程序生成的输出流式传输到同一网络中的另一个系统。但是,我发现命令列表有点令人生畏且难以理解。所以我希望我能在这件事上寻求你的帮助。

我目前的用例: 我有一个 Unity 应用程序,它有一个单独的视频输出流,并且使用插件我可以将该输出保存到视频文件中。用于将其保存到文件的命令是:

ffmpeg -y -f rawvideo -vcodec rawvideo -pixel_format rgba -colorspace bt709 -video_size 1280x720 -framerate 30 -loglevel warning -i - -pix_fmt yuv444p -preset ultrafast -crf 0 test.mp4

输出格式等已经正确,但我现在想直接通过网络流式传输此输出,最好使用 RTSP。使用下面的命令,我将末尾的 test.mp4 替换为 udp://127.0.0.1:23000 以测试通过 UDP 进行的流式传输,但这会在 Unity 中返回 IOException。

非常感谢任何能指导我正确方向的帮助。 提前致谢!

【问题讨论】:

  • 通过网络流式传输原始文件绝不是一个好主意,我猜当您使用 mp4 文件时,ffmpeg 可能会对输出进行编码,如果是 UDP(或 rtp 或 rtps),您应该明确告诉 ffmpeg在输出之前对流进行编码。对于流媒体,大部分 yuv420 用作像素格式,大多数编解码器都期望这种格式(如 mpeg2、mpeg4 avc。)
  • @thekamilz 感谢您的评论。输入是原始视频,我相信给出的参数与输入有关。但是您是说定义编码和格式的输出缺少其他参数吗?我知道通过网络发送原始视频并不理想,因此当然欢迎进行额外的优化。

标签: video ffmpeg video-streaming live-streaming


【解决方案1】:

这是我之前使用的示例 ffmpeg 行,格式为 mpeg-ts(视频 h264+audio aac),可能会有所帮助:

/path_to_ffmpeg/bin/ffmpeg -ignore_unknown -probesize 100000000 -analyzeduration 100000000 -loglevel verbose -thread_queue_size 2048 -err_detect aggressive -fflags +nobuffer+discardcorrupt -re -i - -aspect 16:9 -s 1920x1080 -c:v:0 libx264 -x264-params force-cfr=1 -preset superfast -vb 6000k -minrate 6000k -maxrate 6000k -bufsize 6000k -muxrate 7000k -nal-hrd cbr -flags +ilme+ildct -top 1 -g 25 -r 25 -pix_fmt yuv420p -vbsf h264_mp4toannexb -c:a:0 libfdk_aac -strict -2 -b:a:0 128k -mpegts_service_type advanced_codec_digital_hdtv -metadata service_provider='PROVIDER' -metadata service_name='hd_low' -mpegts_flags system_b -flush_packets 0 -f mpegts 'udp://DEST_IP:DEST_PORT?pkt_size=1316&reuse=1&localaddr=INTERFACE_IP&bitrate=7000000&fifo_size=18618&overrun_nonfatal=1'

替换这些:
DEST_IP 你猜对了吗,目标 ip 即 192.168.1.5
DEST_PORT 是目标端口,即:1234
INTERFACE_IP 是如果设备有多个以太网接口你应该输入接口 ip 用于输出,或者只输入设备的 ip。即:192.168.1.3。这是可选的。

您将目标 IP 用作网络上的一台 PC,并使用 VLC 在该 PC 上播放流(打开网络流并输入 udp://@dest_ip:port)。

希望对您有所帮助。

【讨论】:

    【解决方案2】:

    您必须在命令末尾定义输出流媒体源。您需要定义 ffmpeg 命令的所有元素以与流格式匹配。例如,如果您通过 UDP 进行流式传输,则可以使用类似于此的命令。

    ffmpeg -i (your input) -r 10 -vcodec mpeg4 -f mpegts udp://127.0.0.1:1234
    

    您可以使用 VLC 或 ffplay 播放器测试 UDP 流。但是,如果您想通过 RTSP 进行流式传输,最简单的解决方案是使用媒体服务器,例如 Wowza 或 Red5。 Red5 是一个开源媒体服务器,对初学者来说有点混乱。 Wowza 是付费媒体服务器,但提供更好的文档和支持服务。如果您使用的是 RTMP 协议,您可以使用类似的命令。

    ffmpeg -i (your input) -r 10 -vcodec libx264 -pix_fmt yuv420p -f flv "rtmp://(IpAddress):(portnumber)/live/myStream flashver=FMLE/3.0\20(compatible;\20FMSc/1.0) live=myApplication pubUser=myRTMP connection pubPasswd=password"
    

    您还可以使用 ffserver(Ffmpeg 媒体服务器)进行 RTMP。但它仅适用于 Linux 操作系统。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-05
      • 2018-04-24
      • 2016-09-24
      • 1970-01-01
      • 1970-01-01
      • 2014-12-14
      • 1970-01-01
      • 2011-03-12
      相关资源
      最近更新 更多