使用 Linux 和 YouTube 直播您的宠物!

作者:Shawn Powers

任何阅读过 Linux Journal 的人都知道我对观鸟的痴迷。我已经用 Raspberry Pi 创建了我自己的防风雨摄像机。我发布了关于如何使用 JavaScript 创建您自己的自动更新摄像机图像页面的说明。天哪,我甚至学习了 CSS,以便我可以制作一个移动友好的 BirdCam 版本,该版本可以横向模式填满屏幕。

然而,最近,我终于能够创建一个自动化系统,通过 YouTube 直播我的 BirdCam。它在日出时启动,在日落时停止。并且由于一些强大的开源软件,我永远不必接触该系统!

我在这里描述的一些工具已在其他文章中介绍过,但这是我第一次能够创建一个任何人都可以看到的流媒体,利用 Google 付费的带宽!

图 1. 鸟类总是害羞于镜头。但是,如果您观看足够长的时间,它们就会过来偷花生!

我的配料清单

首先,我想明确说明为了完成类似于我正在做的事情,需要什么样的硬件和软件

  • 一台 Linux 计算机:如果您计划使用 USB 摄像头,则这需要是一台物理计算机。如果您的视频源是基于网络的,则这可以是您网络上的虚拟机。Raspberry Pi 的性能不足以完成必须完成的视频工作,除非可能是低分辨率的。我有一台旧的 i5 CPU 以 1.6GHz 运行,它已经足够了。

  • 一个视频源:这几乎可以是您手头的任何视频源。如果您计划使用 USB 网络摄像头,则需要确保您正在使用如上所述的物理 Linux 计算机。我已经使用过 USB、通过 http 的 MJPEG(请参阅我以前的 BirdCam 文章)、具有 RTSP 流的廉价无线安全摄像头,以及最近,我开始使用 UniFi 视频摄像头。事实上,如果您正在考虑为像这样的项目购买室外视频摄像头,我强烈推荐 UniFi 摄像头。它们是 PoE 供电、高清的,并且免费软件处理录制并提供具有高清视频和一流音频的 RTSP 流。

  • 一个启用了直播的 YouTube 帐户:您需要验证您的帐户,然后在此处启用直播。这不是一个困难的过程,但如果不遵循这些步骤,您将无法使用免费服务。

  • Open Broadcaster Software:我已经尝试了多种方法来使用 CLI 解决方案通过 FFmpeg 或 mencoder 直接流式传输到 YouTube,但我从未能够使其稳定工作。我曾犹豫是否使用 OBS,因为它是一个 GUI 解决方案,没有 CLI 界面,但我克服了这个问题,而且我现在实际上很高兴拥有 GUI。

  • 一个用于托管您的嵌入式频道的 Web 服务器:您可以只共享指向您的 YouTube 频道的 URL,但嵌入要酷得多,因为您可以将其集成到您自己的网站中。

  • 足够的上行带宽来支持 1.5–2mbps 的流式传输:由于 YouTube 将重新分发,因此本地带宽要求不会改变,无论有多少人正在观看您的流。对于某些人(比如不幸的我),牺牲那么多带宽是很困难的,有时会导致问题。只需知道流式传输实时视频需要少量但并非微不足道的恒定上行带宽。这应该是显而易见的,但这是一个需要考虑的事情。

  • 一些其他实用程序,如 crontab 和 sunwait:后者仅在您想用日出和日落来定时您的流时才需要。而且,crontab 仅在您想自动化启动和停止时才需要。这些小的改进确实对我很重要,所以我鼓励您考虑一下。

收集您的信息

YouTube

为了进行直播,您需要一些信息。正如我上面提到的,您需要验证您的帐户才能打开直播。然后您需要获取您的流密钥(图 2)。重要的是您不要共享流密钥,因为它就像您的身份验证。如果其他人获得您的密钥,他们可以流式传输到您的频道,即使没有您的用户名。

图 2. 这不是我真实的流密钥,仅供参考。

您需要从 YouTube 获取的另一个信息是您的频道 ID。频道 ID 不容易找到,但如果您想嵌入您的视频,您稍后会需要它。前往此页面,并找到看起来像“YouTube 频道 ID:UCbUTB3bVg3cmeyJUtUC9DPA”的行(您的频道 ID 将与我的不同)。长文本字符串是您的频道 ID,将其复制到容易找到的地方。

视频摄像头馈送

我真的只能给您一些关于在这里寻找什么的提示。您需要找到来自您的摄像头的流式视频馈送。确保您不使用嵌入了流的网页(大多数摄像头都有一个嵌入流的简易 Web 服务器)。您需要原始馈送本身。Google 或用户手册将是您找出原始流 URL 的最佳选择。

我有一个与 Onvif 兼容的视频摄像头,它有一个 MJPEG 流 URL,看起来像这样:http://192.168.1.170:9090/stream/video.mjpeg。

我的一个 Foscam 摄像头需要在 URL 中使用用户名和密码才能获得流。它看起来像这样:http://192.168.1.180:88/cgi-bin/CGIStream.cgi?cmd=GetMJStream&usr=admin&pwd=xxx。

我的新 UniFi 摄像头实际上使用来自 UniFi 服务器而不是直接来自摄像头的 RTSP URL。它看起来像这样:rtsp://192.168.1.16:7447/58cf11bef14c359f4b3c7b2e_1。

我想说明的是,找到您的视频摄像头的流 URL 通常具有挑战性。如果您在开始之前这样做,它可以节省数小时的挫败感。测试您是否找到了正确 URL 的一个简单方法是在 VLC 中尝试打开它。我还没有找到 VLC 无法查看的视频摄像头,因此如果它抱怨视频源无效,您可能没有正确的 URL。Google 以及您的摄像头型号可能是找出答案的最佳方法。

软件

网上有许多脚本声称使用 FFmpeg 从摄像头源流式传输到 YouTube。我确信它们对某些人有效,但我从未让它们工作过,无论我调整多少设置。事实上,我放弃了很长一段时间,因为我不想依赖 GUI 界面进行流式传输。我希望我的服务器完成繁重的工作,并且无需我的交互即可完成。然而,最近有一天,我发现 Open Broadcaster Software (OBS) 支持用于启动流式传输的命令行标志。这意味着我可以让服务器在无需“单击”任何内容的情况下开始流式传输。

我必须克服的一个问题是我的 BirdCam 服务器上缺少 X Window System。服务器上没有连接显示器,但为了让 OBS 工作,它必须具有已登录的 GUI 桌面。我连接了一个显示器足够长的时间来安装 GUI,然后将系统设置为自动登录。我还禁用了显示器的所有节能功能,因为无论如何我都不会登录显示器。设置好后,我安装了 TeamViewer,以便在需要时远程控制系统。最近 TeamViewer 的安全性出现了一些问题,因此它可能不是您选择用于控制服务器的软件,但它是我安装的软件,并且可以工作。图 3 显示了通过 TeamViewer 远程控制的我的“服务器”。

图 3. 我通常不会在我的直播中播放我猫的猫砂盆的安全摄像头,但我想展示多个摄像头。

安装 OBS 很简单。前往OBS 网站并下载最新版本,或者如果您使用的是 Ubuntu,只需安装他们的 PPA。自从我上次提到该软件以来,该软件已经成熟,即使通过远程会话连接,我也没有任何依赖项问题。

OBS 还具有保存您上次使用的会话的强大功能。这意味着一旦您设置好摄像头,您就不必担心在下次启动时重新调整它们。OBS 只是使用您之前的相同设置。如果您回顾图 3,您会看到预览窗口中添加了多个摄像头。无需保存布局,OBS 只会记住从启动到启动您如何定位摄像头。

为了获得最佳效果,您需要调整一些 OBS 设置。单击设置按钮,然后转到“视频”选项卡(图 4)。这有点令人困惑,但您需要设置两个不同的分辨率。“画布”是您希望 OBS 在预览窗口中显示的大小。“输出”分辨率是它缩放您的视频以进行流式传输和录制的分辨率。我只是将它们都设置为 720p,因为我认为缩放会占用 CPU。您还可以设置输出视频的每秒帧数 (FPS)。我将 720p 大小与 10FPS 一起使用。如果您想要 1080p,或者如果您没有带宽,可以调低此设置。

图 4. 分辨率是灵活的,但我喜欢保持简单。

接下来,单击“输出”选项卡(图 5)。我的设置是可见的,我建议使它们与我的设置接近,除了视频和音频的比特率。如果您想要更高质量的视频(并且您可以负担得起带宽),则可以在此处设置平均上传速度。如果您想要更高质量的音频,也可以更改音频质量。请记住,您在上一步中选择的分辨率将与您在此处选择的带宽一起使用,以提供用户将看到的视频质量。1500(以 kbps 为单位测量)的视频速率非常适合我的 10FPS 和 720p 分辨率。但是,如果您尝试以 1500kbps 流式传输 1080p、30FPS 视频,则视频质量将非常差。您必须进行实验才能找到最佳点。

图 5. 1500 是我当前互联网连接可以处理的最大值。

“流”选项卡是您配置希望 OBS 使用的流服务的选项卡(图 6)。您应该能够选择 YouTube,然后粘贴您之前从 YouTube 获取的流密钥。(这不是频道 ID;它是图 2 中隐藏的密钥。)输入后,您应该无需在设置中进行任何更改。OBS 将保留所有设置,包括流信息。

图 6. OBS 在 YouTube 流式传输方面的表现确实令人惊叹。

剩下的就是将摄像头添加到您的预览屏幕。这是 OBS 最好的功能,除了能够实际流式传输到 YouTube 之外。设置是拖放式的,您可以调整摄像头大小、重叠摄像头并按您想要的任何方式排列它们。由于 OBS 支持如此多种类型的输入,因此您可以疯狂地使用文本叠加等等。要添加网络摄像头,请单击主窗口底部中间的 +,然后选择“媒体源”(图 7)。然后取消选中“本地文件”,并在“输入”字段中输入摄像头 URL(图 8)。单击“确定”后,您的摄像头应出现在预览窗口中,您可以调整其大小和移动它。该界面还允许您裁剪要使用的视频部分。它非常强大且非常用户友好。此外,正如我之前提到的,OBS 会自动存储您的所有调整,因此下次您启动它时,您将获得相同的排列方式。

图 7. 媒体源作为网络摄像头的选择并不明显。

图 8. 确保取消选中“本地文件”,否则您将没有输入字段。

设置好摄像头后,您可以决定是否要包含音频(如果您的摄像头支持音频)。音频电平应显示在摄像头列表旁边的列中。然后只需单击“开始流式传输”即可将您的流实时发送到 YouTube。大约需要 30 秒才能显示在 YouTube 仪表板中,但现在是确保流式传输正常工作的时候了。

自动化

我可以让 OBS 24/7 全天候运行,并让它整晚流式传输我的喂鸟器。老实说,我不确定 YouTube 将如何处理 24/7 全天候流,但无论如何我都不想这样做。我不仅想自动化 OBS 的启动和停止,而且还想确保如果某些东西崩溃,它会在第二天重新启动,而无需我进行修复。Cron 是管理它的明显方法,但由于 OBS 是一个 GUI 程序,因此 cron 被证明具有挑战性。最后,我能够在我的 crontab 中包含环境变量,并且事情顺利进行。这是我的 crontab 的 OBS 部分的样子。查看一下,稍后我会解释它


DISPLAY=:0
@reboot sleep 10; obs --startstreaming
0 5 * * * /usr/local/bin/sunwait civ up 45.3733N 84.9553W;
 ↪obs --startstreaming
0 16 * * * /usr/local/bin/sunwait civ down 45.3733N
 ↪84.9553W; pkill obs

首先,将 DISPLAY 环境变量设置为 :0 意味着 crontab 可以在当前桌面上启动 GUI 应用程序。当我意识到让 cron 启动 GUI 应用程序是多么容易时,我感到很尴尬。但重要的是要注意,用户必须已登录。

@reboot 行在系统启动时启动 OBS。简单的 --startstreaming 标志告诉 OBS 启动并立即开始流式传输。这太棒了。真的,如果我必须想办法自动化实际单击按钮,我们可能就不会一起做这个项目了。

接下来的两行有点令人困惑。首先,我安装了程序“sunwait”。这是一个旧程序,但它太不可思议了,我不敢相信它不是每个发行版的默认程序。我以前在 BirdCam 文章中提到过它,但基本上,它是一个 C 程序,可以根据您的经度和纬度确定日出和日落。最后一个版本于 2004 年发布(认真地),但它仍然可以编译。您可以在此处获取源代码。

无论如何,这两行 cron 行告诉服务器在日出和日落时启动和停止 OBS。在凌晨 5 点,我告诉 sunwait“等待”直到太阳升起。它实际上只是等待直到日出,然后结束。一旦结束,OBS 就会启动。然后在下午 4 点,我告诉 sunwait 等待日落,在 sunwait 程序结束后,kill 停止 OBS。为什么是凌晨 5 点和下午 4 点?嗯,在我的世界中,太阳永远不会在凌晨 5 点之前升起,也永远不会在下午 4 点之前落下。如果我在下午 4 点之后重新启动我的服务器,它将整夜流式传输,这存在潜在的问题。但是这个潜在的问题并没有让我担心到需要使逻辑更复杂的地步。

由于我的服务器没有连接显示器或键盘,因此屏幕中间随机启动和停止的 GUI 应用程序不会影响任何内容。由于我仅在想要更改 OBS 时才连接到服务器的桌面,因此它始终在我的桌面上正面和居中运行实际上很方便!我对当前的直播设置感到非常满意。

嵌入流

不久前,YouTube 做出了一项更改,以便每次直播开始时,它都会获得自己的嵌入代码。这意味着如果您只是使用直播中的“分享”按钮来获取嵌入代码,则它仅适用于当前流会话。对我来说,这意味着第二天它将显示前一天的录像,而不是直播。老实说,这种悄然的变化非常令人沮丧!值得庆幸的是,有一种方法可以嵌入实际的直播,以便任何时候您开始直播,它都会变为活动状态——这就是您之前获得的频道 ID 的用武之地。

这是我的直播在http://birds.brainofshawn.com"> 的嵌入代码:


<iframe width="1280" height="720"
 ↪src="https://www.youtube.com/embed/live_stream?channel=
↪UCbUTB3bVg3cmeyJUtUC9DPA&autoplay=1" frameborder="0"
 ↪allowfullscreen></iframe>

显然,您需要为自己的频道进行更改,但应该清楚各种内容的含义。即使在我的嵌入页面上,我也坚持使用 720p 大小。由于这是嵌入代码,因此您不必像我一样将其放在自己的页面上;例如,您可以将微型分辨率版本嵌入到您的博客中。

通过 YouTube 设置直播出于多种原因而很好。首先,即使您有 10,000 名观众,您的带宽要求也不会改变。此外,由于它是 YouTube,您可以将视频“投射”到电视或 Chromecast 设备,并向您的朋友炫耀您的频道。我仍然希望获得更多摄像头,并可能在多个喂鸟器上设置摄像头旋转,但就目前而言,我再高兴不过了。尽情享受吧!

Shawn 是 Linux Journal 的副编辑,并且从一开始就接触 Linux。他对开源充满热情,并且热爱教学。他还喝了太多咖啡,这经常在他的写作中体现出来。

加载 Disqus 评论