我八年来寻求将45条录像带数字化。第2部分

第一部分描述了将旧的家庭视频数字化并将其分解为单独场景的艰巨任务处理完所有片段后,我想像在YouTube上一样舒适地在线观看它们。由于这些是家庭的个人记忆,因此无法在YouTube本身上发布。我们需要一个既方便又安全的私人托管。



步骤3.发布



ClipBucket,一个开源的YouTube克隆,可以安装在您自己的服务器上



我的第一个尝试是ClipBucket,它自称为开放源YouTube克隆,可以将其安装在服务器上。







令人惊讶的是,ClipBucket没有任何安装说明。感谢第三方教程,使用服务器配置管理工具Ansible自动化了安装过程



困难的部分原因是ClipBucket安装脚本被完全破坏了。当时我在Google工作,但根据合同条款,我无权为开放源代码YouTube复制品做贡献,但是我发布了一个错误报告,可以很容易地进行必要的更正。几个月过去了,他们仍然不明白问题出在哪里。相反,他们在每个版本中都添加了越来越多的错误。



ClipBucket使用的是咨询模型-他们免费发布了代码,并收取了费用以帮助进行部署。渐渐地,我突然意识到,一家通过付费支持赚钱的公司可能对让客户自己安装产品的兴趣不大。



MediaGoblin,更现代的选择



在对ClipBucket进行数月的挫折之后,我查看了可用的选项并找到了MediaGoblin





MediaGoblin 是一个独立的媒体共享平台



,MediaGoblin有很多优点。与难看的PHP中的ClipBucket不同,MediaGoblin是用Python编写的,这是我有很多编码经验的语言。一个命令行界面,可以轻松自动执行视频下载。最重要的是,MediaGoblin带有一个Docker映像,它消除了任何安装问题。



Docker是一项技术,可为可在任何地方运行的应用程序创建独立的环境。我在许多项目中都使用Docker


重新配置MediaGoblin的惊人困难



我以为部署MediaGoblin泊坞映像很简单。好吧,那不是完全可行。



完成的图像缺少两个必要的功能:



  • 认证方式
    • MediaGoblin默认情况下会创建一个公共媒体门户,我需要一种方法来限制未经授权的访问。
  • 转码
    • 每次上传视频时,MediaGoblin都会尝试对其进行重新编码以实现最佳流式传输。如果视频最初准备好进行流传输,则转码会降低质量。
    • MediaGoblin提供了通过配置选项禁用转码的功能,但这不能在现有的Docker映像中完成。


好吧,没问题。 Docker映像是开源的,因此您可以自己重建它



不幸的是,Docker镜像不再由当前的MediaGoblin仓库构建。我尝试将其与上次成功构建的版本同步,但也没有用。尽管我使用完全相同的代码,但MediaGoblin的外部依赖项发生了变化,破坏了构建。几十个小时后,我反复运行了10-15分钟的MediaGoblin构建过程,直到它终于起作用。



几个月后,同样的事情发生了。在过去的几年中,MediaGoblin依赖链总共破坏了我的构建几次,而最后一次发生是在我撰写本文时。我最终发布了自己的MediaGoblin分支,其中包含硬编码的依赖项和显式的库版本。换句话说,我没有怀疑地认为MediaGoblin适用于celery > = 3.0的任何版本,而是安装了对celery 4.2.1的特定依赖项,因为我使用该版本测试了MediaGoblin。看来该产品需要可重现的构建机制,但我还没有做到这一点。



无论如何,经过许多小时的努力,我终于能够在Docker映像中构建和配置MediaGoblin。那里已经很容易跳过不必要的转码设置Nginx进行身份验证



步骤4.托管



由于MediaGoblin在我的本地计算机上运行Docker,因此下一步是将其部署到云服务器,以便全家人可以观看视频。



MediaGoblin和视频存储问题



许多平台都采用Docker映像并将其托管在公共URL上。问题是,除了应用程序本身之外,还必须发布33GB的视频文件。可以将它们硬编码为docker映像,但事实证明它既繁琐又丑陋。更改一行配置将需要重新部署33 GB的数据。



当我用ClipBucket,我解决了这个问题gcsfuse  ,一个工具,它允许操作系统目录上传到谷歌云作为普通的文件系统路径。我将视频文件发布到Google Cloud,并使用gcsfuse在ClipBucket中将它们显示为本地文件。



区别在于ClipBucket在真实的VM中运行,而MediaGoblin在Docker容器中运行。在这里,从云存储挂载文件变得更加困难。我花了数十个小时解决了所有问题,并撰写有关此问题的整篇博客文章





在2018



谈到了MediaGoblin与Google Cloud Storage的初始集成在调整了所有组件几周后,一切正常。在不对MediaGoblin代码进行任何更改的情况下,我巧妙地强迫其读取媒体文件并将其写入Google云存储。



唯一的问题是MediaGoblin变得非常慢。将视频缩略图加载到主页上花费了20秒钟之久。如果您在观看视频时向前跳,MediaGoblin会暂停无限长10秒钟,然后才能继续播放。



主要问题是视频和图片以漫长的回旋方式传递给用户。他们必须通过gcsfuse从Google云存储迁移到Nginx的MediaGoblin-然后才进入用户的浏览器。主要瓶颈是gcsfuse,尚未针对快速性能进行优化。开发人员在项目主页上警告该实用工具的工作会严重延迟gcsfuse文档中的性能





警告



理想情况下,浏览器应绕过所有中间层直接从Google Cloud获取文件。如何在不深入MediaGoblin代码库和添加复杂的Google Cloud集成逻辑的情况下做到这一点?



Nginx sub_filter技巧



幸运的是,尽管有点难看,我还是找到了一个简单的解决方案我在Nginx的default.conf配置中添加了以下过滤器



sub_filter "/mgoblin_media/media_entries/" "https://storage.googleapis.com/MY-GCS-BUCKET/media_entries/";
sub_filter_once off;


在我的安装中,Nginx充当MediaGoblin与最终用户之间的代理。上面的指令告诉Nginx在将MediaGoblin的所有HTML响应传递给最终用户之前,先进行搜索和替换。Nginx用Google Cloud Storage中的URL替换了MediaGoblin媒体文件的所有相对路径。



例如,MediaGoblin生成如下的HTML:



<video width="720" height="480" controls autoplay>
  <source
    src="/mgoblin_media/media_entries/16/Michael-riding-a-bike.mp4"
    type="video/mp4">
</video>


Nginx更改响应:



<video width="720" height="480" controls autoplay>
  <source
    src="https://storage.googleapis.com/MY-GCS-BUCKET/media_entries/16/Michael-riding-a-bike.mp4"
    type="video/mp4">
</video>


现在一切都按预期进行:





Nginx重写了MediaGoblin的响应,以便客户端可以直接从Google云存储请求媒体文件。



关于我的解决方案,最好的部分是它不需要对MediaGoblin代码进行任何更改。Nginx的两行指令将MediaGoblin和Google Cloud无缝集成,即使这些服务彼此之间完全一无所知。



注意:此解决方案要求所有人都可以读取Google Cloud Storage中的文件。为了减轻未经授权的访问的风险,我使用了一个较长的随机存储桶名称(例如mediagoblin-39dpduhfz1wstbprmyk5ak29),并确认存储桶的访问控制策略不允许未经授权的用户显示目录的内容。


最终产品



在这一点上,我有一个完整的,可行的解决方案。 MediaGoblin可以在Google的云平台上愉快地运行在其自己的容器中,因此不需要经常对其进行补丁或更新。我过程中的所有内容都是自动化且可复制的,从而允许简单地编辑或回滚到以前的版本。



我的家人喜欢观看视频非常容易。有了上述Nginx骇客,影片处理的速度现在就和YouTube一样快。



预览屏幕如下所示:





按Featured



标签显示的家庭视频目录的内容单击缩略图将显示以下屏幕:





在媒体服务器上查看单个剪辑



经过多年的工作,我非常高兴能给亲戚一个机会,就像我本来希望的那样,在与YouTube相同的用户友好界面上观看我们的视频。



奖金:成本降低到每月少于$ 1



您不会每隔几个月观看一次家庭视频。我的家人一年总共可以产生20个小时的流量,但是服务器全天候运行。我每月为一台服务器支付15美元,该服务器时间下降了99.7%。



在2018年末,谷歌发布了Cloud Run产品。杀手级功能是Docker容器的启动如此之快,以至于应用程序可以响应HTTP请求。也就是说,服务器可以保持待机模式-仅在有人要访问服务器时才启动。对于像我这样不经常发布的应用,成本从每月15美元下降到每年几美分。



由于某种原因,我已经不记得了,Cloud Run不适用于我的MediaGoblin映像。但是随着Cloud Run的出现,我想起了Heroku免费提供类似服务,其工具比Google的工具方便得多。



使用免费的应用程序服务器,您唯一的支出就是数据存储。Google的标准区域存储成本为2.3美分/ GB。视频档案为33 GB,因此我每月只需支付77美分。





该解决方案的成本仅为每月0.77美元



给那些想尝试的人的提示



显然,这个过程对我来说花了很长时间。但我希望本文能帮助您节省80-90%的数字化和发布家庭视频工作。在单独的部分中,您可以找到有关整个过程详细分步指南,但是这里有一些一般性提示:



  • 在数字化和编辑阶段,请保留尽可能多的元数据。
    • .
    • , .
    • , .
  • .
    • .
    • EverPresent ( , ).
  • , HDD.
  • - , .
    • , , . .
    • (, , ), , .
    • . , .
      • ?
      • ?
      • ?
  • .
    • , .
    • “best of” , .
  • , .
    • , . .
    • , . , .
  • .
    • , , .
    • , , .
  • .
  • .
    •  — .
    •  — . , Slow Snow The National, .



All Articles