首页 > 解决方案 > 如何从 mp4 视频 url(存储在 amazon S3 中)创建 m3u8 播放列表并将视频块(.ts 文件)和 .m3u8 文件存储回另一个 S3?

问题描述

我正在构建一个应用程序,用户可以在其中上传视频,其他人可以稍后观看。我的目标是在客户端对视频进行 HLS 流式传输,其视频格式应为 .m3u8。我正在使用 node fluent-FFmpeg 模块进行处理,但是,我有一个很大的疑问,即如何确保所有 .ts 文件(块)也与 ffmpeg 处理后的 m3u8 文件一起存储在 s3 存储桶中mp4 文件?

因为ffmpeg命令只取m3u8文件的位置?当我希望输入和输出位置为 S3 时如何处理?

任何帮助将不胜感激。

我正在关注这个问题的答案Ffmpeg Creating m3u8 from mp4, video file size,这在我的本地机器上工作得非常好,如何为 s3 实现同样的效果?

标签: node.jsamazon-s3ffmpegmp4m3u8

解决方案


进行转换(mp4-in,m3u8-out),认识到本地 FS 快照 onComplete 不是您想要的。

您不想要,因为 as-output .m3u8 具有使用 LOCAL FS 和每个子 .ts 的相对路径的类似容器的引用(EXTINF:segments)

像这样:

 #EXTINF:4.0
   ./segment_0.ts     <<  relative path from .m3u8 output

您将需要一个后处理,将所有内容重新定位,重新引用到远程:

  1. 将 /tmp 中的所有本地 .ts 文件同步到 S3 上的 CDN

  2. 将每个 .ts 文件的新 .ts-S3 URI 保存/映射到 /tmp 中的旧本地 fsPath

  3. 更新 fluent 输出的 m3u8 文件以引用每个包含 CDN/URI 到 .ts 的 .ts 段的 CDN 副本

#EXTINF:4.0
https://${s3Domain}/${s3Bucket}/180_250000/hls/segment_0.ts
#EXTINF:4.0
https://${s3Domain}/${s3Bucket}/180_250000/hls/segment_1.ts
#EXTINF:4.0
https://${s3Domain}/${s3Bucket}/180_250000/hls/segment_2.ts
#EXTINF:4.0
  1. 将更新的 .m3u8 同步到 CDN

完成后,流式处理完成时本地 FS 快照中的所有引用都会更改,因此它们都可以从新的云位置工作。

这是蛮力解决方法

或者

您使用像“cloudfront”这样的服务来为您完成肮脏的工作。


推荐阅读