Трансляция из Icecast в Facebook Live с помощью ffmpeg в Ubuntu 16.04

У меня есть веб-радио, которое транслируется с помощью Liquidsoap + Icecast на капле DigitalOcean (Ubuntu 16.04), и я хочу объединить этот аудиопоток с простым изображением jpeg с помощью ffmpeg, преобразовать его в видеопоток и отправить в Facebook в прямом эфире.

Характеристики Facebook Live:

Формат видео:

Мы принимаем видео с максимальным разрешением 720p (1280 x 720) со скоростью 30 кадров в секунду. (или 1 ключевой кадр каждые 2 секунды). Вы должны отправлять I-кадр (ключевой кадр) не реже одного раза в две секунды на протяжении всего потока. Рекомендуемая максимальная скорость передачи данных составляет 4000 Кбит / с. Заголовки должны быть меньше 255 символов, иначе поток завершится ошибкой. Live API принимает только видео в кодировке H264 и аудио в формате AAC.

Длина видео:

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

Расширенные настройки :

Соотношение сторон пикселя: квадрат. Типы кадров: прогрессивная развертка. Частота дискретизации аудио: 44,1 кГц. Аудио битрейт: стерео 128 Кбит / с. Кодирование битрейта: CBR.

И команда ffmpeg, которую я пробовал:

ffmpeg -loop 1 -i radio-background.jpg -thread_queue_size 20480 -i http://localhost:8000/radio -framerate 30 -r 30 -acodec aac -strict -2 -c:v libx264 -strict experimental -b:a 128k -pix_fmt yuvj444p -x264-params keyint=60 -b:v 256k -minrate 128k -maxrate 512k -bufsize 768k -f flv 'rtmp://rtmp-api.facebook.com:80/rtmp/<fb-streaming-key>'

Это действительно работает, поскольку Facebook получает видео в реальном времени и позволяет мне публиковать его. Но я не могу понять, почему происходит задержка почти каждые 2 или 3 секунды. Я просил разных людей посмотреть тестовое видео, и у всех возникала одна и та же проблема: каждые 2 или 3 секунды воспроизведение "зависает" на полсекунды и, кажется, загружает видео, я даже вижу, как значок загрузки вращается на экране.

Я пробовал разные комбинации значений для следующих параметров: -thread_queue_size / -b: v / -minrate / -maxrate / -bufsize. Кажется, ничего не меняет.

Потоковое видео для меня в новинку, я не очень удобен с опциями, перечисленными ранее, поэтому я думаю, что мне что-то здесь не хватает ...

Также обратите внимание, что аудиопоток icecast отлично работает, и согласно графикам DigitalOcean сервер не перегружен. Поэтому я считаю, что моя команда ffmpeg неверна.

Какие параметры ffmpeg будут работать в этом случае?


person Matthieu    schedule 14.01.2017    source источник
comment
Вероятно, это причуда того, как Facebook обрабатывает ваш видеопоток. Вы можете подумать о том, чтобы увеличить битрейт вашего видео до 1 или 2 мегабит и посмотреть, что произойдет. Я подозреваю, что что-то где-то буферизуется по размеру байта, а не по времени.   -  person Brad    schedule 14.01.2017
comment
Я уже проводил тесты с таким значением битрейта, но для уверенности я просто провожу еще один тест со следующими значениями: ffmpeg -loop 1 -i radio-background.jpg -thread_queue_size 20480 -i http://localhost:8000/radio -framerate 30 -r 30 -acodec aac -strict -2 -c:v libx264 -strict experimental -b:a 128k -pix_fmt yuvj444p -x264-params keyint=60 -b:v 2048k -minrate 1024k -maxrate 4000k -bufsize 4000k -f flv 'rtmp://rtmp-api.facebook.com:80/rtmp/<fb-streaming-key> Результат точно такой же. Кажется, это ничего не меняет.   -  person Matthieu    schedule 15.01.2017
comment
Что, если вы оставите опцию -pix_fmt?   -  person Brad    schedule 15.01.2017
comment
Если я попробую без этой опции, у меня появятся предупреждения ffmpeg. Думаю, я нашел решение: jpg, который я использовал, был слишком большим по спецификациям fb (1280 * 720 макс). Я изменил размер изображения до 1280 * 720 пикселей, и результат стал намного лучше. Но все еще возникают проблемы с зависанием, примерно каждые 1-2 минуты. Это не идеально, и, честно говоря, для радио этого недостаточно. Я попробую с разными значениями битрейта и буфера и посмотрю, куда это денется. Но пока проблема решена только наполовину: s   -  person Matthieu    schedule 16.01.2017
comment
Вы должны опубликовать это как ответ.   -  person Brad    schedule 16.01.2017
comment
Извините, только что отредактировал предыдущий пост. Я думаю, что есть еще достаточно проблем с зависанием, чтобы сообщение оставалось открытым, мне все еще нужно найти лучшие значения для битрейта и bufsize, чтобы избежать текущих проблем.   -  person Matthieu    schedule 16.01.2017
comment
Что произойдет, если вы воспользуетесь keyint=960? Проблема с зависанием теперь возникает примерно каждые 4 минуты? Протестируйте и дайте мне знать, спасибо   -  person VC.One    schedule 30.01.2017
comment
Проблема с facebook в том, что он заставляет вас транслировать со скоростью 30 кадров в секунду, в отличие от youtube, вы можете передавать изображение со скоростью 1 кадр в секунду.   -  person eusid    schedule 21.11.2018


Ответы (1)


укажите частоту кадров для изображения. это будет перед элементом ввода.

-r 30 -loop 1 -i radio-background.jpg

если ваш радиопоток уже является aac, вы можете просто скопировать его, перекодировать звук не нужно. вы можете использовать -c: копию.

-c:a copy

если вы все еще хотите использовать aac, вам следует переключиться на использование libfdk_aac. ffmpeg по умолчанию использует битрейт 128k для звука, поэтому указывать -b: a не нужно.

-c:a libfdk_aac

ffmpeg будет использовать входную частоту кадров первого элемента для вывода по умолчанию, поэтому вам больше не нужно указывать частоту кадров. (у вас дважды указана выходная частота кадров. -framerate 30 и -r 30 одинаковы)

сверхбыстрая предустановка для повышения производительности процессора, настройки и формата пикселей. вы также можете использовать -g для ключа.

-c:v h264 -preset ultrafast -tune stillimage -pix_fmt yuvj444p -g 60

установить профиль и уровень профиля, bframes

-profile:v high444 -level 4.2

используйте либо -b: v, либо -minrate -maxrate -bufsize, но не оба сразу.

-b:v 768k

и мы идем

-f flv rtmp://rtmp-api.facebook.com:80/rtmp/streamkey

теперь собрать все воедино

    ffmpeg -r 30 -loop 1 -i radio-background.jpg \
-i http://localhost:port/mount -c:a libfdk_aac -c:v h264 -b:v 768k \
-preset ultrafast -tune stillimage -pix_fmt yuvj444p -g 60 \
-profile:v high444 -level 4.2 -f flv rtmp://rtmp-api.facebook.com:80/rtmp/streamkey
person DopeLabs    schedule 24.07.2017