ffmpeg - 通过 RTMP 连续文件流式传输

Posted

技术标签:

【中文标题】ffmpeg - 通过 RTMP 连续文件流式传输【英文标题】:ffmpeg - continuous file streaming over RTMP 【发布时间】:2013-04-30 15:29:04 【问题描述】:

我一直在寻找一个简单(或者可能不那么简单)的解决方法,以解决我在设置一个简单测试用例时遇到的问题:red5 媒体服务器上的视频流。

我已经建立了一个从 YouTube 上抓取的 FLV 文件的小型库,并设法使用以下 perl 脚本连续播放它们:

use Cwd;
use strict;
use warnings;
use DBI;
use DBD::mysql;

our $db = DBI->connect();
my $dst = "/home/seb/youtube/";
sub streamFile 
    my $r = $db->prepare("SELECT name FROM music_flvs ORDER BY RAND() LIMIT 1");
    $r->execute();
    my @data = $r->fetchrow_array();
    my $filename = $data[0]
    my $t = `ffmpeg -re -i '$dst$filename' -ab 48k -ac 1 -vcodec libx264 -crf 30 -s "640x480" -acodec libfaac -ar 44100 -threads 4 -f flv 'rtmp://server/oflaDemo/music'`;
    return 1;

while (&streamFile()) 

这个脚本非常好地完成了它的任务:它通过ffmpeg 一个一个地播放文件。但是,这样做有一个关键问题:每次交换歌曲时都会引发 Unpublish 事件,从而导致所有客户端断开连接。我想防止这种情况。该事件在 ActionScript 中表现为:

 16:33:54:209 - Playback - NetStream.Play.UnpublishNotify
 16:33:54:209 - Playback - NetStream.Play.PublishNotify

我见过concat demuxer 并相信它可能对我有所帮助。问题很简单:让 ffmpeg 将播放列表流式传输到 RTMP 服务器而不引起 Unpublish 事件的最佳方法是什么?

【问题讨论】:

【参考方案1】:

我认为没有一种简单的 FFMPEG 方法可以阻止发送这些事件。

当您说客户端时,您真的是指播放流的 Flash 客户端吗?

您可以做的是将这些视频保存在 red5 上并在 Red5 中配置播放列表,而不是将它们从 FFMPEG 流式传输到 Red5。 Red5 有一个所谓的播放列表功能,可以连续播放视频。

如果您的客户是定制的,您也可以只修改客户以跳过这一点。 我认为人们实现无限播放列表的最常见方式是使用简单的 ActionScript 客户端代码自动跳过不同的视频。这比任何类型的服务器端解决方案都容易。

【讨论】:

这是我的想法。但是,我希望有人能够像这样“覆盖”流 - 如有必要,流过随机播放列表。顺便说一句,我来自 Shoutcast,它具有这些功能。客户的想法很好,我很可能会接受。 构建自定义 Flash 客户端可以解决问题。答案已接受,非常感谢您的建议:-)

以上是关于ffmpeg - 通过 RTMP 连续文件流式传输的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ffmpeg 将实时 m3u8 文件流式传输到 youtube rtmp

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

FFMPEG - 流式传输到 RTMP 输出并同时保存到 MP4 - 重新连接

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

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

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