直播直播时,您可能会使用某种桌面流媒体软件,例如 OBS、Streamlabs 或我们之前在本博客中看到的可用于该任务的任何其他出色程序。我们在这里看到的另一个选项是使用 Amazon Interactive Video Service (Amazon IVS) Web Broadcast SDK从浏览器进行广播。这两个广播选项涵盖了大多数用例,但它们并不是我们可用的唯一选项。在本文中,我们将讨论另一种选择——使用 FFMPEG 通过命令行进行无头广播(IE:没有用户界面)。
Amazon IVS 用户指南中详细介绍了该主题,但我想更深入地讨论一下我们如何针对特定用例扩展解决方案。有时您可能希望在没有用户界面提供的即时视觉反馈的情况下直播某些内容。例如,您可能需要在我们的频道上播放预先录制的视频?或者,如何从网络上使用RTSP等协议或可能不是 Amazon IVS 所需的 RTMP 格式的其他格式的网络摄像机重新流式传输?有一些用例,所以让我们深入研究其中的一些。
注意:为了避免分解每个语句并讨论每个参数的作用,下面嵌入的片段被注释掉了。这可能不利于复制/粘贴的使用,因此每个片段都有一个指向 GitHub 上命令的未注释版本的链接。
要在家一起玩,请确保您已安装FFMPEG 。下面的所有命令都在 MacOS 上进行了测试,因此如果您使用不同的操作系统,可能需要进行一些修改。最后,我应该提一下,我远不是 FFMPEG 专家,但已经在5.1.2
版本上对这篇文章的原始发布日期的每个命令进行了全面测试。
还有一件事:我知道只复制和粘贴命令很诱人,但请花时间阅读评论并参考 FFMPEG 文档以确保与您的环境兼容。例如,下面的许多命令都使用
6000k
作为目标比特率,但如果您使用的是BASIC
频道类型,这可能不适用于您的频道。
您将需要Ingest 端点和Stream 密钥,以便通过 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 高清摄像头”)。
最简单的用例是简单的摄像头和麦克风流。
$ 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 广播”流的体验很有用。请注意,此流将无限循环播放视频和音频,因此您需要注意直播时长上限为连续 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
我们将介绍的最后一个示例是重新流式传输用例。使用不产生 RTMP 输出的输入源会很方便。某些 IP 摄像机和其他设备以 RTSP 格式生成输出,使用 FFMPEG 我们可以将这些设备的输入重定向到我们的 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
此命令产生如下所示的输出。
在这篇文章中,我们了解了如何使用 FFMPEG 以无头方式流式传输到 Amazon IVS 实时流。如果您有本文未涵盖的用例,请在Twitter上与我联系。