Я искал простое (или, возможно, не очень простое) решение проблемы, с которой я столкнулся в своей настройке для простого тестового примера: потоковое видео через медиа-сервер red5.
Я создал небольшую библиотеку FLV-файлов, скопированных с YouTube, и мне удалось воспроизвести их последовательно с помощью следующего 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
и считаю, что он может мне чем-то помочь. Вопрос довольно прост: как лучше всего заставить ffmpeg передавать плейлист на RTMP-сервер, не вызывая события Unpublish?