Al transmitir a una transmisión en vivo, probablemente usará algún tipo de software de transmisión de escritorio como OBS, Streamlabs o cualquiera de los otros excelentes programas disponibles para la tarea, como vimos anteriormente en este blog . Otra opción que hemos visto aquí es la transmisión desde un navegador con el SDK de transmisión web de Amazon Interactive Video Service (Amazon IVS). Estas dos opciones de transmisión cubren la mayoría de los casos de uso, pero no son las únicas opciones disponibles para nosotros. En esta publicación, analizaremos otra opción: la transmisión sin interfaz de usuario (es decir, sin interfaz de usuario) a través de la línea de comandos con FFMPEG.
Este tema está bien cubierto en la guía del usuario de Amazon IVS , pero quería profundizar un poco más y analizar cómo podríamos ampliar la solución para casos de uso específicos. Puede haber ocasiones en las que desee transmitir algo en vivo sin la retroalimentación visual inmediata proporcionada por una interfaz de usuario. Por ejemplo, ¿quizás necesite transmitir un video pregrabado en nuestro canal? O, ¿qué tal volver a transmitir desde una cámara IP en su red que utiliza un protocolo como RTSP o algún otro formato que puede no ser el formato RTMP requerido por Amazon IVS? Hay un puñado de casos de uso, así que profundicemos en algunos de ellos.
Nota: Para evitar desglosar cada declaración y discutir qué hace cada argumento, se comentan los fragmentos incrustados a continuación. Esto probablemente será malo para el uso de copiar/pegar, por lo que cada fragmento tiene un enlace a una versión sin comentarios del comando en GitHub.
Para tocar en casa, asegúrese de tener instalado FFMPEG . Todos los comandos a continuación se probaron en MacOS, por lo que es posible que se requieran algunas modificaciones si está utilizando un sistema operativo diferente. Finalmente, debo mencionar que estoy lejos de ser un experto en FFMPEG, pero probé completamente cada comando a partir de la fecha de publicación original de esta publicación en la versión 5.1.2
.
Una cosa más: sé que es tentador simplemente copiar y pegar comandos, pero tómese el tiempo para leer los comentarios y consulte los documentos de FFMPEG para garantizar la compatibilidad con su entorno. Por ejemplo, muchos de los comandos a continuación usan
6000k
para una tasa de bits de destino, pero es posible que esto no funcione para su canal si está usando un tipo de canalBASIC
.
Necesitará el punto final Ingest y la clave Stream , así que recopile los de su canal a través de la consola de Amazon IVS.
Para mi canal de demostración, configuré estos valores en las variables de entorno DEMO_STREAM_INGEST_ENDPOINT
y DEMO_STREAM_KEY
.
A continuación, enumere sus dispositivos de audio y video con FFMPEG:
$ ffmpeg -list_devices true -f avfoundation -i dummy
Si está en Windows, deberá usar
-f dshow
en su lugar.
En mi máquina, este comando produjo el siguiente resultado.
[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
En nuestros comandos a continuación, haremos referencia al dispositivo por índice (por ejemplo: 2
para la "Cámara FaceTime HD").
El caso de uso más simple es una transmisión sencilla de cámara y micrófono.
$ 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
El uso del comando anterior produce la siguiente transmisión en vivo.
Otro caso de uso común es transmitir una pantalla compartida con video superpuesto en una posición determinada. Este comando es un poco más complicado, pero los comentarios deberían explicar lo que está pasando.
$ 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
Este comando produce una salida que se ve así:
Para activos pregrabados, podemos cambiar la entrada de la cámara por la ruta a un archivo de video existente en nuestro sistema de archivos local.
$ 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
La salida aquí es similar a la salida de la cámara web, pero contiene el contenido de video pregrabado con audio incrustado.
A veces, nuestro video pregrabado no contiene audio, pero tal vez queramos incluir una pista de audio separada. Esto es útil para crear una experiencia como una transmisión de "radio lofi" que usa video animado y una pista de audio separada. Tenga en cuenta que esta transmisión repetirá infinitamente el video y el audio, por lo que querrá tener en cuenta que la duración de la transmisión en vivo tiene un límite de 48 horas consecutivas.
$ 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
El ejemplo final que cubriremos es un caso de uso de retransmisión. Puede ser útil usar una fuente de entrada que no produzca una salida RTMP. Ciertas cámaras IP y otros dispositivos producen salida en RTSP, y con FFMPEG podemos redirigir una entrada de estos dispositivos a nuestra transmisión en vivo de Amazon IVS.
$ ffmpeg \ -rtsp_transport \ tcp \ -i rtsp://user:[email protected]: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
Este comando produce una salida como la siguiente.
En esta publicación, analizamos cómo transmitir a una transmisión en vivo de Amazon IVS de forma autónoma con FFMPEG. Si tiene un caso de uso que no se trató en esta publicación, comuníquese conmigo en Twitter .