首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用FFMPEG将视频文件连续流式传输到RTMP服务器

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

Stack Overflow用户
提问于 2012-07-25 18:36:31
回答 4查看 62.1K关注 0票数 30

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

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

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

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

代码语言:javascript
复制
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服务器,而不会中断连接

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-03-14 22:57:25

更新(因为我不能删除接受的答案):正确的解决方案是实现一个自定义的解复用器,类似于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'

这些文件只是placeholders.

  • Make,一个跟踪当前播放列表索引并为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

[...]

  • Start播放ffmpeg -f concat -i playlist.txt -c copy output -f mpegts udp://<ip>:<port>

  • Get被愤怒的系统administrator

追逐和辱骂

票数 10
EN

Stack Overflow用户

发布于 2018-03-01 14:41:04

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

list_1.txt

代码语言:javascript
复制
ffconcat version 1.0
file 'item_1.mp4'
file 'list_2.txt'

list_2.txt

代码语言:javascript
复制
ffconcat version 1.0
file 'item_2.mp4'
file 'list_1.txt'

现在,您需要做的就是动态更改下一个播放列表文件的内容。

票数 4
EN

Stack Overflow用户

发布于 2018-02-02 18:42:59

您可以通过管道将循环传输到缓冲区,然后从该缓冲区通过管道传输到流实例。

在shell中,它将如下所示:

代码语言:javascript
复制
#!/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播放列表格式。播放列表是动态的,这样你就可以编辑当前的播放列表,更改曲目或添加新的曲目。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11647868

复制
相关文章

相似问题

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