Использование FFMPEG для трансляции в Amazon IVS Live Stream в безголовом режиме

Использование FFMPEG для трансляции в Amazon IVS Live Stream в безголовом режиме

15 февраля 2023 г.

При трансляции в прямом эфире вы, вероятно, будете использовать какое-либо программное обеспечение для потоковой передачи на рабочем столе, такое как OBS, Streamlabs или любую другую замечательную программу, доступную для этой задачи, как мы рассмотрели ранее в этом блоге. Другой вариант, который мы рассмотрели здесь, — это трансляция из браузер с помощью SDK веб-вещания Amazon Interactive Video Service (Amazon IVS). Эти два варианта вещания охватывают большинство вариантов использования, но они не единственные доступные нам варианты. В этом посте мы обсудим еще один вариант — вещание без головы (IE: без пользовательского интерфейса) через командную строку с помощью FFMPEG.

Эта тема хорошо раскрыта в руководстве пользователя Amazon IVS< /a>, но хотел бы пойти немного глубже и обсудить, как мы можем расширить решение для конкретных случаев использования. Могут быть случаи, когда вы захотите транслировать что-то в прямом эфире без немедленной визуальной обратной связи, предоставляемой пользовательским интерфейсом. Например, может быть вам нужно транслировать предварительно записанное видео на нашем канале? Или как насчет повторной потоковой передачи с IP-камеры в вашей сети, которая использует такой протокол, как RTSP или какой-либо другой формат, который может не формат RTMP, требуемый Amazon IVS? Существует несколько вариантов использования, поэтому давайте рассмотрим некоторые из них.

<цитата>

Примечание. Чтобы избежать разбивки каждого утверждения и обсуждения того, что делает каждый аргумент, приведенные ниже встроенные фрагменты прокомментированы. Это, вероятно, будет плохо для использования копирования/вставки, поэтому в каждом фрагменте есть ссылка на некомментированную версию команды на GitHub.

Чтобы играть дома, убедитесь, что у вас установлен FFMPEG. Все приведенные ниже команды были протестированы на MacOS, поэтому могут потребоваться некоторые изменения, если вы используете другую ОС. Наконец, я должен упомянуть, что я далеко от эксперта по FFMPEG, но полностью протестировал каждую команду на дату первоначальной публикации этого поста в версии 5.1.2.< /p><цитата>

Еще кое-что: я знаю, что просто копировать и вставлять команды очень заманчиво, но, пожалуйста, найдите время, чтобы прочитать комментарии и обратиться к документации FFMPEG, чтобы убедиться в совместимости с вашей средой. Например, многие из приведенных ниже команд используют 6000k для целевого битрейта, но это может не работать для вашего канала, если вы используете тип канала BASIC. р>

Сбор информации о вашем канале

Вам потребуется Конечная точка загрузки и Ключ трансляции, поэтому соберите их на своем канале через консоль Amazon IVS.

Ingest endpoint and stream key

Для моего демонстрационного канала я установил эти значения в переменные среды DEMO_STREAM_INGEST_ENDPOINT и DEMO_STREAM_KEY.

Список ваших аудио- и видеоустройств

Далее перечислите аудио- и видеоустройства с помощью FFMPEG:

$ ffmpeg -list_devices true -f avfoundation -i dummy

<цитата>

Если вы работаете в Windows, вместо этого вам нужно будет использовать -f dshow.

На моем компьютере эта команда выдала следующий результат.

[AVFoundation indev @ 0x11d605c80] AVFoundation video devices:
[AVFoundation indev @ 0x11d605c80] [0] OBS Virtual Camera
[AVFoundation indev @ 0x11d605c80] [1] ManyCam Virtual Webcam
[AVFoundation indev @ 0x11d605c80] [2] FaceTime HD Camera
[AVFoundation indev @ 0x11d605c80] [3] Capture screen 0
[AVFoundation indev @ 0x11d605c80] AVFoundation audio devices:
[AVFoundation indev @ 0x11d605c80] [0] ManyCam Virtual Microphone
[AVFoundation indev @ 0x11d605c80] [1] BlackHole 2ch
[AVFoundation indev @ 0x11d605c80] [2] External Microphone

В приведенных ниже командах мы будем ссылаться на устройство по индексу (например, 2 для «FaceTime HD Camera»).

Потоковая передача с веб-камеры и микрофона

Самый простой вариант использования – прямой поток с камеры и микрофона.

$ ffmpeg 
    -f avfoundation  # force the format
    -video_size 1920x1080  # video size
    -framerate 30  # FPS
    -i "2:2"  # input device (video:audio)
    -c:v libx264  # codec - libx264 is an advanced encoding library for creating H. 264 (MPEG-4 AVC) video streams
    -b:v 6000K  # target bitrate 
    -maxrate 6000K  # max bitrate
    -pix_fmt yuv420p  # pixel format
    -s 1920x1080  # video size
    -profile:v main  # the H.264 profile (https://trac.ffmpeg.org/wiki/Encode/H.264#Profile)
    -preset veryfast  # encoder quality setting
    -g 120  # group of picture (GOP) size
    -x264opts "nal-hrd=cbr:no-scenecut" 
    -acodec aac  # audio codec
    -ab 160k  # audio bitrate
    -ar 44100  # audio sample rate
    -f flv  # output video format
    $DEMO_STREAM_INGEST_ENDPOINT/$DEMO_STREAM_KEY

Команда без комментариев

Использование приведенной выше команды создает следующую прямую трансляцию.

Веб-камера и микрофонПотоковая передача экрана с наложением видео и микрофоном

Еще один распространенный вариант использования – потоковая демонстрация экрана с наложением видео в определенной позиции. Эта команда немного сложнее, но комментарии должны объяснить, что происходит.

$ ffmpeg 
    -f avfoundation  # force format for input 0
    -framerate 30  # input 0 framerate
    -video_size 1920x1080  # input 0 size
    -i "3:"  # first (index 0) input (screenshare)
    -f avfoundation  # force format for input 1
    -framerate 30  # input 1 framerate
    -video_size 640x480  # input 1 size
    -i "2:"  # second (index 1) input (camera)
    -f avfoundation  # force format for input 2
    -i ":2"  # third (index 2) input (mic)
    -filter_complex "[0:v][1:v] overlay=main_w-overlay_w-5:main_h-overlay_h-5"  # overlay video on screenshare in the bottom right
    -map 0:v:0  # use the video from input 0
    -map 1:v:0  # use the video from input 1
    -map 2:a:0  # use the video from input 2
    -c:v libx264  # codec - libx264 is an advanced encoding library for creating H. 264 (MPEG-4 AVC) video streams
    -b:v 6000K  # target bitrate 
    -maxrate 6000K  # max bitrate
    -pix_fmt yuv420p  # pixel format
    -s 1920x1080  # video size
    -profile:v main  # the H.264 profile (https://trac.ffmpeg.org/wiki/Encode/H.264#Profile)
    -preset veryfast  # encoder quality setting
    -g 120  # group of picture (GOP) size
    -x264opts "nal-hrd=cbr:no-scenecut" 
    -acodec aac  # audio codec
    -ab 160k  # audio bitrate
    -ar 44100  # audio sample rate
    -f flv  # output video format
    $DEMO_STREAM_INGEST_ENDPOINT/$DEMO_STREAM_KEY

Команда без комментариев

Эта команда производит вывод, который выглядит следующим образом:

Демонстрация экрана с видеоПотоковая передача предварительно записанного видео

Для предварительно записанных объектов мы можем заменить вход камеры на путь к существующему видеофайлу в нашей локальной файловой системе.

$ ffmpeg 
    -re 
    -i /path/to/video.mp4  #input video
    -c:v libx264  # codec - libx264 is an advanced encoding library for creating H. 264 (MPEG-4 AVC) video streams
    -b:v 6000K  # target (average) bitrate for the encoder
    -maxrate 6000K  # max bitrate
    -pix_fmt yuv420p  # pixel format 
    -s 1920x1080  # size
    -profile:v main  # the H.264 profile (https://trac.ffmpeg.org/wiki/Encode/H.264#Profile)
    -preset veryfast  # encoder quality setting
    -force_key_frames "expr:gte(t,n_forced*2)"  # keyframe interval
    -x264opts "nal-hrd=cbr:no-scenecut" 
    -acodec aac  # audio codec
    -ab 160k  # audio bitrate
    -ar 44100  # audio sample rate
    -f flv  # output video format
    $DEMO_STREAM_INGEST_ENDPOINT/$DEMO_STREAM_KEY

Команда без комментариев

Здесь выходные данные аналогичны выходным данным веб-камеры, но содержат предварительно записанное видеосодержимое со встроенным звуком.

Записанное видеоПотоковая передача предварительно записанного видео с отдельной звуковой дорожкой

Иногда предварительно записанное видео не содержит звука, но, возможно, мы хотим включить в него отдельную звуковую дорожку. Это полезно для создания потока «lofi radio», в котором используется анимированное видео и отдельная звуковая дорожка. Обратите внимание, что этот поток будет бесконечно повторять видео и звук, поэтому помните, что продолжительность прямого эфира ограничена 48 часами подряд.

$ ffmpeg 
    -re 
    -stream_loop -1  # loop video infinitely
    -i /path/to/video.mp4  # input (video)
    -stream_loop -1  # loop audio infinitely
    -i /path/to/audio.mp3  # input (audio) 
    -map 0:v:0  # map the first video stream from the first video file
    -map 1:a:0  # map the first audio stream from the second file
    -c:v libx264  # codec - libx264 is an advanced encoding library for creating H. 264 (MPEG-4 AVC) video streams
    -b:v 6000K  # target (average) bitrate for the encoder
    -maxrate 6000K  # max bitrate
    -pix_fmt yuv420p  # pixel format 
    -s 1920x1080  # size
    -profile:v main  # the H.264 profile (https://trac.ffmpeg.org/wiki/Encode/H.264#Profile)
    -preset veryfast  # encoder quality setting
    -force_key_frames "expr:gte(t,n_forced*2)"  # keyframe interval
    -x264opts "nal-hrd=cbr:no-scenecut" 
    -acodec aac  # audio codec
    -ab 160k  # audio bitrate
    -ar 44100  # audio sample rate
    -f flv  # output video format
    $DEMO_STREAM_INGEST_ENDPOINT/$DEMO_STREAM_KEY

Команда без комментариев

Повторное воспроизведение IP-камеры

Последний пример, который мы рассмотрим, – вариант использования повторной трансляции. Может быть удобно использовать источник ввода, который не создает вывод RTMP. Некоторые IP-камеры и другие устройства выдают выходные данные в формате RTSP, а с помощью FFMPEG мы можем перенаправлять входные данные с этих устройств в нашу прямую трансляцию Amazon IVS.

$ ffmpeg 
    -rtsp_transport 
    tcp 
    -i rtsp://user:pass@192.168.86.34:554  # IP camera URI
    -preset ultrafast  # encoder quality setting
    -vcodec libx264  # codec
    -ar 44100  # audio bitrate
    -f flv  # output video format
    $DEMO_STREAM_INGEST_ENDPOINT/$DEMO_STREAM_KEY

Команда без комментариев

Эта команда производит вывод, как показано ниже.

IP-камера передается в Amazon IVSСводка

В этом посте мы рассмотрели, как выполнять прямую трансляцию Amazon IVS в режиме без заголовка с помощью FFMPEG. Если у вас есть пример использования, который не был описан в этой публикации, свяжитесь со мной в Twitter.


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE