我一直在寻找一个简单(或许不那么简单)的解决方案,解决我在设置简单测试案例时遇到的问题:通过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
逐个播放文件。但是,它确实存在一个关键问题:每次交换歌曲时都会导致取消发布事件,从而导致所有客户端断开连接。我想阻止这个。该事件在ActionScript中表现为:
16:33:54:209 - Playback - NetStream.Play.UnpublishNotify
16:33:54:209 - Playback - NetStream.Play.PublishNotify
我见过concat
多路分配器并相信它可能对我有所帮助。问题很简单:在没有导致Unpublish事件的情况下,将ffmpeg流播放到RTMP服务器的最佳方法是什么?
答案 0 :(得分:1)
我认为没有一种简单的FFMPEG方法可以阻止发送这些事件。
当你说客户时,你真的是指正在播放流的Flash客户端吗?
您可以做的就是将这些视频保存在red5上并在Red5中配置播放列表,而不是将它们从FFMPEG流式传输到Red5。 Red5有一个所谓的播放列表功能,可以连续播放视频。
如果您的客户是自定义的,您也可以修改客户端以跳过此。 我认为人们实现无限播放列表的最常见方式是使用简单的ActionScript客户端代码自动跳过不同的视频。这比任何类型的服务器端解决方案都容易。