Ao transmitir para uma transmissão ao vivo, você provavelmente usará algum tipo de software de transmissão de desktop como OBS, Streamlabs ou qualquer um dos outros excelentes programas disponíveis para a tarefa, conforme vimos anteriormente neste blog . Outra opção que vimos aqui é a transmissão de um navegador com o Amazon Interactive Video Service (Amazon IVS) Web Broadcast SDK. Essas duas opções de transmissão cobrem a maioria dos casos de uso, mas não são as únicas opções disponíveis para nós. Nesta postagem, discutiremos outra opção - transmissão sem cabeça (ou seja: sem uma interface de usuário) por meio da linha de comando com FFMPEG.
Este tópico é bem abordado no guia do usuário do Amazon IVS , mas gostaria de ir um pouco mais fundo e discutir como podemos estender a solução para casos de uso específicos. Pode haver momentos em que você deseja transmitir algo ao vivo sem o feedback visual imediato fornecido por uma interface de usuário. Por exemplo, talvez você precise transmitir um vídeo pré-gravado em nosso canal? Ou, que tal retransmitir de uma câmera IP em sua rede que utiliza um protocolo como RTSP ou algum outro formato que pode não ser o formato RTMP exigido pelo Amazon IVS? Há um punhado de casos de uso, então vamos nos aprofundar em alguns deles.
Nota: Para evitar quebrar cada instrução e discutir o que cada argumento faz, os snippets incorporados abaixo são comentados. Isso provavelmente será ruim para o uso de copiar/colar, então cada snippet tem um link para uma versão não comentada do comando no GitHub.
Para tocar junto em casa, certifique-se de ter o FFMPEG instalado. Todos os comandos abaixo foram testados no MacOS, portanto, algumas modificações podem ser necessárias se você estiver usando um sistema operacional diferente. Finalmente, devo mencionar que estou longe de ser um especialista em FFMPEG, mas testei totalmente todos os comandos desde a data de publicação original deste post na versão 5.1.2
.
Mais uma coisa: sei que é tentador apenas copiar e colar comandos, mas reserve um tempo para ler os comentários e consulte os documentos do FFMPEG para garantir a compatibilidade com seu ambiente. Por exemplo, muitos dos comandos abaixo estão usando
6000k
para uma taxa de bits de destino, mas isso pode não funcionar para o seu canal se você estiver usando um tipo de canalBASIC
.
Você precisará do endpoint Ingest e da chave Stream , portanto, colete-os de seu canal por meio do Amazon IVS Console.
Para meu canal de demonstração, defini esses valores nas variáveis de ambiente DEMO_STREAM_INGEST_ENDPOINT
e DEMO_STREAM_KEY
.
Em seguida, liste seus dispositivos de áudio e vídeo com FFMPEG:
$ ffmpeg -list_devices true -f avfoundation -i dummy
Se você estiver no Windows, precisará usar
-f dshow
.
Na minha máquina, esse comando produziu a seguinte saída.
[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
Em nossos comandos abaixo, referenciaremos o dispositivo por índice (por exemplo: 2
para o "FaceTime HD Camera").
O caso de uso mais simples é um fluxo direto de câmera e microfone.
$ 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
O uso do comando acima produz a seguinte transmissão ao vivo.
Outro caso de uso comum é transmitir um compartilhamento de tela com vídeo sobreposto em uma determinada posição. Este comando é um pouco mais complicado, mas os comentários devem explicar o que está acontecendo.
$ 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 produz uma saída semelhante a esta:
Para recursos pré-gravados, podemos trocar a entrada da câmera pelo caminho para um arquivo de vídeo existente em nosso sistema de arquivos 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
A saída aqui é semelhante à saída da webcam, mas contém o conteúdo de vídeo pré-gravado com áudio incorporado.
Às vezes, nosso vídeo pré-gravado não contém áudio, mas talvez queiramos incluir uma faixa de áudio separada. Isso é útil para criar uma experiência como um fluxo de "rádio lofi" que usa vídeo animado e uma faixa de áudio separada. Observe que esse fluxo fará um loop infinito de vídeo e áudio, portanto, lembre-se de que a duração da transmissão ao vivo é limitada a 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
O exemplo final que abordaremos é um caso de uso de retransmissão. Pode ser útil usar uma fonte de entrada que não produza saída RTMP. Certas câmeras IP e outros dispositivos produzem saída em RTSP e, com FFMPEG, podemos redirecionar uma entrada desses dispositivos para nossa transmissão ao vivo do 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 produz uma saída como a seguinte.
Nesta postagem, vimos como transmitir para uma transmissão ao vivo do Amazon IVS de maneira headless com FFMPEG. Se você tiver um caso de uso que não foi abordado nesta postagem, entre em contato comigo no Twitter .