使用FFMPEG将视频文件连续传输到RTMP服务器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用FFMPEG将视频文件连续传输到RTMP服务器相关的知识,希望对你有一定的参考价值。

ffmpeg将RTMP流作为输入或输出处理,并且运行良好。

我想将一些视频(由python脚本管理的动态播放列表)流式传输到RTMP服务器,我现在正在做一些非常简单的事情:使用FFMPEG将我的视频逐个流式传输到RTMP服务器,但这会导致连接中断每次视频结束时,当下一个视频开始时,流就准备好了。

我想在没有任何连接中断的情况下流式传输这些视频,然后可以正确查看流。

我使用此命令将我的视频逐个流式传输到服务器

ffmpeg -re -y -i myvideo.mp4 -vcodec libx264 -b:v 600k -r 25 -s 640x360 
-filter:v yadif -ab 64k -ac 1 -ar 44100 -f flv 
"rtmp://mystreamingserver/app/streamName"

我在互联网上寻找了一些解决方法已经很多天了,我发现有些人在ffmpeg上讨论使用命名管道作为输入,我已经尝试了它并且它运行不正常,因为ffmpeg不仅关闭了RTMP流一个新的视频来了,但也关闭了自己。

有没有办法做到这一点? (使用ffmpeg将视频的动态播放列表流式传输到RTMP服务器,不会出现连接中断

答案

更新(因为我无法删除已接受的答案):正确的解决方案是实现自定义分离器,类似于concat。目前还没有其他干净的方式。你必须得到你的手和代码!

下面是一个丑陋的黑客。这是一个非常糟糕的方法,只是不要!

该解决方案使用concat demuxer并假设所有源媒体文件都使用相同的编解码器。该示例基于MPEG-TS,但RTMP也可以这样做。

  1. 使用以下格式制作播放列表文件,其中包含动态播放列表的大量入口点列表: file 'item_1.ts' file 'item_2.ts' file 'item_3.ts' [...] file 'item_[ENOUGH_FOR_A_LIFETIME].ts' 这些文件只是占位符。
  2. 创建一个跟踪当前播放列表索引的脚本,并为current_index + 1即时创建符号链接 ln -s /path/to/what/to/play/next.ts item_1.ts ln -s /path/to/what/to/play/next.ts item_2.ts ln -s /path/to/what/to/play/next.ts item_3.ts [...]
  3. 开始玩ffmpeg -f concat -i playlist.txt -c copy output -f mpegts udp://<ip>:<port>
  4. 由愤怒的系统管理员获取追逐和呼叫的名字
另一答案

您可以将循环传递到缓冲区,并从此缓冲区管道到您的流实例。

在shell中它看起来像:

#!/bin/bash

for i in *.mp4; do
       ffmpeg -hide_banner -nostats -i "$i" -c:v mpeg2video [proper settings] -f mpegts -
done | mbuffer -q -c -m 20000k | ffmpeg -hide_banner -nostats -re -fflags +igndts -thread_queue_size 512 -i pipe:0 -fflags +genpts [proper codec setting] -f flv rtmp://127.0.0.1/live/stream

当然,您可以使用任何类型的循环,也可以循环播放播放列表。

  • 我发现mpeg比输入流的x264更稳定一些
  • 我不知道为什么,但mpeg压缩的最小2个线程效果更好
  • 输入压缩需要比输出帧速率快,所以我们得到足够快的新输入
  • 由于非连续时间戳,我们必须跳过它们并在输出中生成一个新的时间戳
  • 缓冲区大小需要足够大,以使循环有足够的时间来获取新剪辑。

我从事基于python的解决方案,尚未完成,但除了一些警告,我的测试流运行了多天:

ffplayout

这使用xml播放列表格式。播放列表是动态的,这样您就可以编辑当前播放列表,更改曲目或添加新曲目。

另一答案

需要创建两个播放列表文件,并在每个文件的末尾指定另一个文件的链接。

list_1.txt

ffconcat version 1.0
file 'item_1.mp4'
file 'list_2.txt'

list_2.txt

ffconcat version 1.0
file 'item_2.mp4'
file 'list_1.txt'

现在您只需动态更改下一个播放列表文件的内容即可。

以上是关于使用FFMPEG将视频文件连续传输到RTMP服务器的主要内容,如果未能解决你的问题,请参考以下文章

如何将 ffmpeg 流中的音频传输到 nginx rtmp 服务器?

将音频和视频从 Android 手机流式传输到 RTMP 服务器的最佳方式

寻找一个库/框架将实时视频从 OS X 流式传输到 Wowza 服务器(RTMP)[关闭]

使用 FFMpeg 将 FLV 流式传输到 RTMP,使用 H264 编解码器和 C++ API 到 flv.js

使用 RTMP 协议将视频文件流式传输到使用 Python 的 rtmp 服务器

使用 ffmpeg 在文件夹中流式传输视频