如何用批处理脚本为目录中所有*.ts文件生成m3u8播放列表
生成非连续TS分片的HLS播放列表(批处理方案)
你说得对,单纯用dir命令只能生成文件名列表,而有效的HLS播放列表需要包含特定的M3U8标签(比如头部信息、分片时长标记等)。这里给你写一个完整的批处理脚本,能自动生成符合标准的HLS播放列表,还可以选择获取真实的分片时长。
基础版本(固定分片时长)
如果你的TS分片时长都比较接近,或者暂时不需要精确时长,可以用这个版本:
@echo off setlocal enabledelayedexpansion :: 配置HLS参数 set "hls_version=3" :: HLS版本,一般用3即可 set "target_duration=10" :: 分片最大时长(秒),设为你分片的最长时长或稍大值 :: 创建播放列表并写入头部 echo #EXTM3U > playlist.m3u8 echo #EXT-X-VERSION:%hls_version% >> playlist.m3u8 echo #EXT-X-TARGETDURATION:%target_duration% >> playlist.m3u8 :: 遍历按名称排序的TS文件,写入分片信息 for /f "delims=" %%f in ('dir /o:n /b *.ts') do ( echo #EXTINF:%target_duration%, >> playlist.m3u8 echo %%f >> playlist.m3u8 ) :: 写入结束标记 echo #EXT-X-ENDLIST >> playlist.m3u8 echo 已生成有效HLS播放列表:playlist.m3u8 endlocal
怎么用:
- 把这段代码复制到记事本,保存为
generate_hls.bat(注意保存类型选“所有文件”) - 把这个批处理文件放到你的TS分片所在的目录里
- 双击运行它,就会生成
playlist.m3u8
进阶版本(自动获取真实分片时长)
如果需要精确的分片时长(播放器会更准确地控制播放节奏),可以用这个版本(需要提前安装ffmpeg并添加到系统环境变量):
@echo off setlocal enabledelayedexpansion set "hls_version=3" set "max_duration=0" :: 先遍历所有分片,获取最长时长作为TARGETDURATION for /f "delims=" %%f in ('dir /o:n /b *.ts') do ( for /f "tokens=1-3 delims=:. " %%a in ('ffmpeg -i "%%f" 2^>^&1 ^| findstr /i "Duration"') do ( set /a "current=%%a*3600 + %%b*60 + %%c" if !current! gtr !max_duration! set "max_duration=!current!" ) ) :: 创建播放列表头部 echo #EXTM3U > playlist.m3u8 echo #EXT-X-VERSION:%hls_version% >> playlist.m3u8 echo #EXT-X-TARGETDURATION:%max_duration% >> playlist.m3u8 :: 再次遍历分片,写入每个分片的精确时长 for /f "delims=" %%f in ('dir /o:n /b *.ts') do ( for /f "tokens=1-3 delims=:. " %%a in ('ffmpeg -i "%%f" 2^>^&1 ^| findstr /i "Duration"') do ( set /a "total=%%a*3600 + %%b*60 + %%c" ) echo #EXTINF:!total!, >> playlist.m3u8 echo %%f >> playlist.m3u8 ) echo #EXT-X-ENDLIST >> playlist.m3u8 echo 已生成带精确时长的HLS播放列表:playlist.m3u8 endlocal
关键说明:
#EXTM3U:必须是播放列表的第一行,标记这是一个M3U8文件#EXT-X-VERSION:指定HLS版本,不同版本支持的特性不同,v3是兼容性较好的选择#EXT-X-TARGETDURATION:告诉播放器所有分片的最大时长,必须大于等于所有分片的实际时长#EXTINF:时长,:每个分片的前置标记,后面跟分片的时长(秒),逗号不能省略#EXT-X-ENDLIST:标记播放列表结束,播放器读到这里就知道没有更多分片了
注意事项:
- 进阶版本需要安装ffmpeg:你可以从ffmpeg官网下载,然后把ffmpeg.exe所在的路径添加到系统的
PATH环境变量里,这样批处理才能调用它 - 如果你的TS文件名有特殊字符(比如空格),脚本也能正常处理,因为用了
delims=保留完整文件名 - 脚本会自动按文件名排序(
dir /o:n),和你之前的命令一致
内容的提问来源于stack exchange,提问作者iPog
相关产品推荐
相关产品推荐

