node.js - 如何从 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 实现同样的效果?
解决方案
进行转换(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
您将需要一个后处理,将所有内容重新定位,重新引用到远程:
将 /tmp 中的所有本地 .ts 文件同步到 S3 上的 CDN
将每个 .ts 文件的新 .ts-S3 URI 保存/映射到 /tmp 中的旧本地 fsPath
更新 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
- 将更新的 .m3u8 同步到 CDN
完成后,流式处理完成时本地 FS 快照中的所有引用都会更改,因此它们都可以从新的云位置工作。
这是蛮力解决方法
或者
您使用像“cloudfront”这样的服务来为您完成肮脏的工作。
推荐阅读
- c# - 如何使用 smtp 从 noreply@example.com 内部向另一个人发送电子邮件
- python - 尝试设置 Flask 密钥时的奇怪输出
- twitter-bootstrap - 使 bootstrap-vue b-table 'Id' 列不可见
- c# - WPF位图透明背景变黑
- java - 同一集合中的spring data mongodb多个实体
- cmake - 嵌套的 cmake 生成器表达式仅被部分评估
- mysql - 带有左连接的 Mysql 查询 - NULL 记录被隐式类型转换
- iframe - 试图弄清楚为什么谷歌分析报告的用户比我们自己的堆栈多
- python - 未使用 .xs() 和 .get_level_values() 在切片上设置值
- c# - Unity3D - 我无法制作帐户创建系统