paint-brush
Utilisation de FFMPEG pour la diffusion vers un flux en direct Amazon IVS en mode sans têtepar@amazonivs
2,448 lectures
2,448 lectures

Utilisation de FFMPEG pour la diffusion vers un flux en direct Amazon IVS en mode sans tête

Trop long; Pour lire

Lors de la diffusion sur un flux en direct, vous allez probablement utiliser une sorte de logiciel de streaming de bureau. Dans cet article, nous discuterons d'une autre option - la diffusion sans tête (IE : sans interface utilisateur) via la ligne de commande avec FFMPEG. Toutes les commandes ci-dessous ont été testées sur MacOS, donc certaines modifications peuvent être nécessaires si vous utilisez un autre système d'exploitation.
featured image - Utilisation de FFMPEG pour la diffusion vers un flux en direct Amazon IVS en mode sans tête
Amazon Interactive Video Service (IVS)  HackerNoon profile picture
0-item

Lors de la diffusion sur un flux en direct, vous allez probablement utiliser une sorte de logiciel de streaming de bureau comme OBS, Streamlabs ou l'un des autres excellents programmes disponibles pour la tâche, comme nous l'avons vu précédemment sur ce blog . Une autre option que nous avons examinée ici consiste à diffuser à partir d'un navigateur avec le SDK de diffusion Web d'Amazon Interactive Video Service (Amazon IVS). Ces deux options de diffusion couvrent la majorité des cas d'utilisation, mais ce ne sont pas les seules options qui s'offrent à nous. Dans cet article, nous discuterons d'une autre option - la diffusion sans tête (IE : sans interface utilisateur) via la ligne de commande avec FFMPEG.


Ce sujet est bien couvert dans le guide de l'utilisateur d'Amazon IVS , mais je voulais aller un peu plus loin et discuter de la façon dont nous pourrions étendre la solution pour des cas d'utilisation spécifiques. Il peut arriver que vous souhaitiez diffuser quelque chose en direct sans le retour visuel immédiat fourni par une interface utilisateur. Par exemple peut-être avez-vous besoin de diffuser une vidéo pré-enregistrée sur notre chaîne ? Ou, que diriez-vous de rediffuser à partir d'une caméra IP sur votre réseau qui utilise un protocole comme RTSP ou un autre format qui peut ne pas être le format RTMP requis par Amazon IVS ? Il existe une poignée de cas d'utilisation, alors examinons-en quelques-uns.

Remarque : Pour éviter de décomposer chaque instruction et de discuter de ce que fait chaque argument, les extraits intégrés ci-dessous sont commentés. Ce sera probablement mauvais pour l'utilisation du copier/coller, donc chaque extrait a un lien vers une version non commentée de la commande sur GitHub.

Pour jouer à la maison, assurez-vous d'avoir installé FFMPEG . Toutes les commandes ci-dessous ont été testées sur MacOS, donc certaines modifications peuvent être nécessaires si vous utilisez un autre système d'exploitation. Enfin, je dois mentionner que je suis loin d'être un expert FFMPEG, mais que j'ai entièrement testé chaque commande à la date de publication originale de cet article sur la version 5.1.2 .

Encore une chose : Je sais qu'il est tentant de simplement copier et coller des commandes, mais veuillez prendre le temps de lire les commentaires et de vous référer à la documentation FFMPEG pour assurer la compatibilité avec votre environnement. Par exemple, la plupart des commandes ci-dessous utilisent 6000k pour un débit binaire cible, mais cela peut ne pas fonctionner pour votre canal si vous utilisez un type de canal BASIC .

Collecte des informations sur votre chaîne

Vous aurez besoin du point de terminaison Ingest et de la clé Stream , alors collectez-les à partir de votre canal via la console Amazon IVS.

Ingestion du point de terminaison et de la clé de flux

Pour mon canal de démonstration, j'ai défini ces valeurs dans les variables d'environnement DEMO_STREAM_INGEST_ENDPOINT et DEMO_STREAM_KEY .

Liste de vos appareils audio et vidéo

Ensuite, répertoriez vos appareils audio et vidéo avec FFMPEG :

 $ ffmpeg -list_devices true -f avfoundation -i dummy


Si vous êtes sous Windows, vous devrez utiliser -f dshow à la place.

Sur ma machine, cette commande a produit la sortie suivante.

 [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


Dans nos commandes ci-dessous, nous référencerons l'appareil par index (par exemple : 2 pour la "FaceTime HD Camera").

Diffuser votre webcam et votre microphone

Le cas d'utilisation le plus simple est un simple flux de caméra et de microphone.

 $ 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


Commande non commentée

L'utilisation de la commande ci-dessus produit le flux en direct suivant.

Webcam et micro Diffuser un partage d'écran avec superposition vidéo et microphone

Un autre cas d'utilisation courant consiste à diffuser un partage d'écran avec une vidéo superposée à une certaine position. Cette commande est un peu plus délicate, mais les commentaires devraient expliquer ce qui se passe.

 $ 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


Commande non commentée

Cette commande produit une sortie qui ressemble à ceci :

Partage d'écran avec vidéo Diffuser une vidéo préenregistrée

Pour les ressources préenregistrées, nous pouvons remplacer l'entrée de la caméra par le chemin d'accès à un fichier vidéo existant sur notre système de fichiers 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

Commande non commentée

La sortie ici est similaire à la sortie de la webcam, mais contient le contenu vidéo préenregistré avec audio intégré.

Vidéo préenregistrée Diffusion de vidéos préenregistrées avec une piste audio séparée

Parfois, notre vidéo préenregistrée ne contient pas d'audio, mais nous souhaitons peut-être inclure une piste audio distincte. Ceci est utile pour créer une expérience comme un flux "lofi radio" qui utilise une vidéo animée et une piste audio séparée. Notez que ce flux bouclera à l'infini la vidéo et l'audio, vous devez donc garder à l'esprit que la durée du flux en direct est limitée à 48 heures consécutives.

 $ 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


Commande non commentée

Re-streaming d'une caméra IP

Le dernier exemple que nous allons couvrir est un cas d'utilisation de re-stream. Il peut être pratique d'utiliser une source d'entrée qui ne produit pas de sortie RTMP. Certaines caméras IP et autres appareils produisent une sortie en RTSP, et avec FFMPEG, nous pouvons rediriger une entrée de ces appareils vers notre flux en direct 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


Commande non commentée

Cette commande produit une sortie comme celle-ci.

Caméra IP diffusée sur Amazon IVS Résumé

Dans cet article, nous avons examiné comment diffuser un flux en direct Amazon IVS sans tête avec FFMPEG. Si vous avez un cas d'utilisation qui n'a pas été couvert dans cet article, contactez-moi sur Twitter .