Использование 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.
Для моего демонстрационного канала я установил эти значения в переменные среды 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
Эта команда производит вывод, как показано ниже.
В этом посте мы рассмотрели, как выполнять прямую трансляцию Amazon IVS в режиме без заголовка с помощью FFMPEG. Если у вас есть пример использования, который не был описан в этой публикации, свяжитесь со мной в Twitter.
Оригинал