2011-01-26 2 views

ответ

1

Afaik, вам нужно разработать собственный «сегмент». Это похоже на то, что вам нужно для создания потоковых файлов HTTP Live. Могут быть более простые решения, но вот что я сделал бы:

Вы можете сделать относительную небольшую программу (в python) с использованием multifilesink next-file = buffer (или маркер следующего файла, если сегменты не могут соответствовать в памяти).

Вам нужно будет закодировать или демонтировать поток ввода и снова включить поток. Разрежьте поток мультиплексирования на ключевой кадр, когда будет достигнута желаемая продолжительность, и нажмите агрегированный буфер (или отметьте фальшивый ключевой фрейм, например, чтобы заставить приемник создать новый файл). Повторно инициализируйте мультиплексор (или добавьте потоковый поток муксинга), чтобы получить файл с правильным заголовком, чем можно проигрывать отдельно (в зависимости от мультиплеера).

+0

я бросил GStreamer и написал Сегментер с использованием библиотеки FFmpeg вместо этого. Пришлось написать уродливую программу на С; – Saideira

1

gnonlin и gnlfilesource сделаны для этого. Вам придется перекодировать видео как часть процесса, так как gstreamer не имеет специальной поддержки для разделения определенных форматов без перекодирования.

См. How do I use gstreamer to make an audio clip from a segment of a longer source? для примера того, как создавать клипы из аудиофайла.

0

Мне удалось выполнить что-то подобное с помощью Perl с привязками GStreamer и GLib. Мой взлом злоупотребляет состоянием GStreamer Pipeline, чтобы сбросить местоположение файла. Я использую источник потоковой передачи и, следовательно, режим сброса до нуля после того, как set_state («null») является приемлемым. Вам нужно будет управлять позицией поиска в исходном элементе, чтобы поддерживать правильную сегментацию.

my $g_pipeline = GStreamer::Pipeline->new('pipeline'); 
.... 
my $g_filesink = GStreamer::ElementFactory->make(filesink => "filesink"); 
$g_filesink->set(location => $file_name); 
... 
$g_pipeline->add(..., $g_filesink); 

my $delay = 5000; # switch output file at this interval 
my $timer = Glib::Timeout->add($delay, 
    sub { 
    $g_pipeline->set_state('null'); 
    ... 
    $g_filesink->set(location=> $next_file_name); 
    $g_pipeline->set_state('playing'); 
    } 
); 
Смежные вопросы