我正在尝试使用此命令拍摄一个 5 分钟的视频文件并生成一个 单个文件 HLS 播放列表
ffmpeg -i video.mp4 -codec copy -bsf:v h264_mp4toannexb -hls_time 4 -hls_flags single_file -hls_list_size 0 video.m3u8
产生一个像这样的播放列表:
#EXTM3U
#EXT-X-VERSION:4
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:5.338667,
#EXT-X-BYTERANGE:535424@0
video.ts
#EXTINF:5.338667,
#EXT-X-BYTERANGE:316592@535424
video.ts
#EXTINF:5.338667,
#EXT-X-BYTERANGE:285384@852016
video.ts
#EXT-X-ENDLIST
我想要什么:
#EXTM3U
#EXT-X-VERSION:4
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:5.338667,
#EXT-X-BYTERANGE:535424@0
video-0-535424.txt
#EXTINF:5.338667,
#EXT-X-BYTERANGE:316592@535424
video-535424-316592.txt
#EXTINF:5.338667,
#EXT-X-BYTERANGE:285384@852016
video-852016-285384.txt
#EXT-X-ENDLIST
或者:
#EXTM3U
#EXT-X-VERSION:4
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:5.338667,
#EXT-X-BYTERANGE:535424@0
video.txt#0-535424
#EXTINF:5.338667,
#EXT-X-BYTERANGE:316592@535424
video.txt#535424-316592
#EXTINF:5.338667,
#EXT-X-BYTERANGE:285384@852016
video.txt#852016-285384
#EXT-X-ENDLIST
我仍然想转换为单个.ts/或其他任何,只是想编辑它在video.m3u8中的写入方式。只用ffmpeg可以吗?如果可以的话,该怎么办呢?或者是否有任何 js/nodejs 模块可以将 video.m3u8 重写为
video.txt#range-here
所以你可以做的是,你可以使用 m3u8-parser
解析 .m3u8 文件您需要解析 .m3u8 文件,提取每一行并检查该行是否包含 .ts。如果包含,请将其替换为 .txt。这就是我在项目中所做的黑客攻击。
要更改段文件名,您可以在使用
single_file
标志时使用此参数
-hls_segment_filename video.txt
或者对于普通的hls
-hls_segment_filename video_%d.txt
您可以使用任何文件名或扩展名,FFmpeg 仍将以您选择的格式输出片段
实际上,不存在单文件 HLS 或 DASH 流这样的东西,至少不存在现成的。即使您执行字节范围请求,除了实际文件之外,您仍然会存储清单。而 Byte Range 请求的愚蠢之处在于,并非所有 JS 播放器都支持它……在大多数情况下,他们总是希望拥有独立的段。处理 HLS/DASH 时必须补偿的最大问题是补偿存储在磁盘或对象存储上的文件量。 ABR 流通常有许多不同分辨率的音频和视频源,想象一下您存储了 100 万首歌曲用于流式传输,每首歌曲都有 3-4 个不同的编解码器,它将生成大量文件,最终 AWS 和所有其他提供商将收费您存储的文件数量。因此,如果您的计划是以流格式存储许多媒体文件,您应该首先解决这个问题......