ffmpeg - непрерывная потоковая передача файлов по RTMP

Я искал простое (или, возможно, не очень простое) решение проблемы, с которой я столкнулся в своей настройке для простого тестового примера: потоковое видео через медиа-сервер 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?


person Sébastien Renauld    schedule 30.04.2013    source источник


Ответы (1)


Я не думаю, что есть простой способ FFMPEG предотвратить отправку этих событий.

Когда вы говорите о клиентах, вы действительно имеете в виду Flash-клиенты, которые воспроизводят поток, верно?

Ну, что вы можете сделать, так это сохранить эти видео на red5 и настроить список воспроизведения в Red5 вместо потоковой передачи их из FFMPEG в Red5. Red5 имеет так называемую функцию списка воспроизведения, которая может воспроизводить видео подряд.

Если ваши клиенты изготавливаются на заказ, вы также можете просто изменить клиентов, чтобы пропустить это. Я думаю, что самый распространенный способ, которым люди реализуют бесконечный список воспроизведения, — это иметь простой клиентский код ActionScript, который автоматически пропускает разные видео. Это намного проще, чем любое серверное решение.

person seba.wagner    schedule 01.05.2013
comment
Вот что я подумал. Тем не менее, я хотел бы, чтобы кто-то мог переопределить поток как таковой - при необходимости поток поверх случайного списка воспроизведения. Между прочим, я пришел из Shoutcast, в котором есть эти функции. Идея клиента хороша, и я, скорее всего, соглашусь с ней. - person Sébastien Renauld; 01.05.2013
comment
Создание собственного флэш-клиента решает проблему. Ответ принят, большое спасибо за совет :-) - person Sébastien Renauld; 01.05.2013