Подтвердить что ты не робот

Как мы можем перекодировать поток live rtmp в живой поток hls с помощью ffmpeg?

Я пытаюсь преобразовать поток live rtmp в поток hls в реальном времени.

У меня появилась идея после прочтения

http://sonnati.wordpress.com/2011/08/30/ffmpeg-%E2%80%93-the-swiss-army-knife-of-internet-streaming-%E2%80%93-part-iv/

Я могу преобразовать поток live rtmp в hls, но не во время выполнения. когда я запускаю команду и проверяю любые hsl файлы (.m3u8 и .ts), я не могу видеть, но когда я прерываю команду и проверяю там, я получаю файлы hls по мере необходимости.

Я искал google для решения, но не смог получить правильный ответ.

Может ли кто-нибудь помочь мне?

Спасибо в Advance...

4b9b3361

Ответ 1

Это краткое руководство для потоковой передачи HLS с любым входным файлом или потоком:

Я следую подходу user1390208, поэтому я использую FFMPEG только для создания потока rtmp, который затем получает мой сервер для предоставления HLS. Вместо Unreal/Wowza/Adobe я использую бесплатный сервер nginx с модулем rtmp, который довольно прост в настройке. Вот как я делаю это кратко: Any input file or stream -> ffmpeg -> rtmp -> nginx server -> HLS -> Client или более подробно:

входной видеофайл или поток (http, rtmp, whatever) → ffmpeg transcodes live to x.264 + aac, выходы в rtmp → nginx принимает rtmp и обслуживает HLS для пользователя (клиента). Таким образом, на стороне клиента вы можете использовать VLC или что угодно и подключаться к файлу .m3u8, который предоставляется nginx.

  • Я следил за этим руководством по настройке для nginx.
  • Это - мой конфигурационный файл nginx.
  • Вот как я использую ffmpeg для перекодирования моего входного файла в rtmp:

    ffmpeg -re -i mydirectory/myfile.mkv -c:v libx264 -b:v 5M -pix_fmt yuv420p -c:a:0 libfdk_aac -b:a:0 480k -f flv rtmp://localhost:12345/hls/mystream;
    

    (.mkv 1080p с 5.1 звуком, в зависимости от вашего ввода, вы должны использовать более низкие битрейты!)

Откуда вы получаете поток rtmp?

  • Файл? Тогда вы можете использовать именно мой подход.
  • Любой сервер X с потоком Y? Затем вам нужно изменить команду ffmpeg на:

    ffmpeg -re -i rtmp://theServerX/yourStreamY -c:v libx264 -b:v 5M -pix_fmt yuv420p -c:a:0 libfdk_aac -b:a:0 480k -f flv rtmp://localhost:12345/hls/mystream;
    

    или если ваш поток rtmp уже закодирован h.264/aac, вы можете попробовать использовать опцию copy в ffmpeg для потоковой передачи содержимого непосредственно в nginx.

Как вы видите в моем файле конфигурации nginx:

  • Мой сервер rtmp имеет "приложение" под названием "hls". Эта часть, описывающая, где nginx прослушивает поток ffmpeg rtmp, и почему ffmpeg передает в rtmp://localhost:12345/hls/mystream;
  • Мой http-сервер имеет location /hls. Это означает, что в VLC я могу подключиться к http://myServer:80/hls/mystream.m3u8 для доступа к потоку HLS.

Все ясно? Счастливые потоки!

Ответ 2

Попробуйте установить параметры командной строки RTMP в HLS:

ffmpeg -v verbose -i rtmp://<host>:<port>/<stream> -c:v libx264 -c:a aac -ac 1 -strict -2 -crf 18 -profile:v baseline -maxrate 400k -bufsize 1835k -pix_fmt yuv420p -flags -global_header -hls_time 10 -hls_list_size 6 -hls_wrap 10 -start_number 1 <pathToFolderYouWantTo>/<streamName>.m3u8

В канале HLS может быть некоторая задержка. Однако это сработает.

Ответ 3

Как обновление к этому вопросу, мне удалось завершить транскодирование в реальном времени от RTMP до HLS без использования ffmpeg, как?

Ну, просто используя тот же самый конфигурационный файл nginx, который пользователь user3069376, и очень осторожно относитесь к путям, которые вы генерируете манифест .m3uh, параметр hls в модуле RTMP должен позаботиться об этом.

Что касается видеопроигрывателя, Video.Js работал как шарм o

Ответ 5

Вам необходимо использовать программное обеспечение потокового сервера, которое использует потоки RTMP и выводит HLS. Ваши варианты: Unreal Media Server, Wowza Media Server, Adobe Media Server.