Forward HLS Stream — необходимо решение

я получаю поток HLS/AppleHTTP с FFmpeg. Исходный поток выглядит так:

Input #0, hls,applehttp, from 'http://example.com/hls/index.m3u8':
   Duration: 00:00:00.09, start: 42870.540944, bitrate: 91 kb/s
   Program 0
   Metadata:
      variant_bitrate : 0
   Stream #0:0: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p, 1024x576 [SAR 1:1 DAR 16:9], 12.50 fps, 25 tbr, 90k tbn, 50 tbc
   Stream #0:1: Audio: aac ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 114 kb/s
   Stream #0:2: Unknown: none ([21][0][0][0] / 0x0015)

Мне нужно перенаправить такой поток с помощью FFmpeg на потоковый сервер. Моя проблема в том, как это сделать с FFmpeg без кодирования и с высокой загрузкой ЦП (я думаю, -видеокопия -аудиокопия). Во-вторых, какое программное обеспечение потокового сервера лучше всего (низкое использование ЦП) для получения потока и отправки его пользователям в виде потока HLS?


person Chris    schedule 12.08.2015    source источник


Ответы (2)


HLS означает HTTP Live Streaming. Вам не нужен специальный сервер, чтобы отправить его клиентам, просто обычный веб-сервер, такой как Nginx (один из ваших тегов).

Ты можешь сделать:

ffmpeg -i http://example.com/hls/index.m3u8 -c copy /path/to/web/dir/index.m3u8

Команда создаст список воспроизведения и скопирует сегменты в /path/to/web/dir, который находится в корне документа веб-сервера. Клиентам нужен только новый URL.

Все усложнится, если входной список воспроизведения является основным списком воспроизведения, содержащим несколько вариантов потоков. В этом случае вам нужно захватить все отдельные потоки в разные каталоги и написать новый основной список воспроизведения на вашей стороне, чтобы перегруппировать разные потоки.

person aergistal    schedule 13.08.2015
comment
большое спасибо за это отличное решение! я не знал, что ffmpeg будет постоянно загружать сегменты и создавать файл index.m3u8. Это действительно круто. Спасибо еще раз. - person Chris; 13.08.2015
comment
я только что протестировал ваше решение, идея отличная, но... когда я играю с VLC, сегменты меняются каждые 2 секунды... я уже добавил опцию -segment_time 30, но это не изменилось... здесь вся моя команда ffmepg: m3u8 ...и стрим как бы зависает при каждом изменении файла... знаете как решить? кстати. я использую лайти вместо nginx .. может быть это проблема? - person Chris; 13.08.2015
comment
Решено. добавили -hls_time ./ffmpeg -i http://example.com/index.m3u8 -c copy -segment_list_flags +live -hls_time 10 -hls_list_size 6 -hls_wrap 10 -segment_list_type m3u8 -map 0:0 -map 0:1 -segment_time 10 /var/www/hls/index.m3u8 Спасибо за поддержку. - person Chris; 14.08.2015
comment
Да, 2 с — это значение по умолчанию, если вы ничего не укажете. - person aergistal; 14.08.2015
comment
-c copy выдает мне ошибку: At least one output file must be specified my.m3u8 command not found - person chovy; 02.12.2015

Лучше сработало со мной, изменил hls_wrap, чтобы он был равен hls_list_size, а также hsl_time равен segment_time

./ffmpeg -i http://example.com/index.m3u8 -c copy -segment_list_flags +live -hls_time 4 -hls_list_size 6 -hls_wrap 6 -segment_list_type m3u8 -map 0:0 -map 0:1 -segment_time 4 /var/www/hls/index.m3u8
person ossamacpp    schedule 29.04.2017