要将视频转为hls流媒体,需生成m3u8播放列表:可用ffmpeg一键切片编码并生成playlist.m3u8;或手动编写含extinf时长标签的纯文本m3u8文件;亦可用php脚本动态生成,但须确保ts片段时长准确。

你需要把一段视频变成能在网页、手机或智能电视上边下载边播放的流媒体,就得先生成一个标准的 m3u8 播放列表文件——它不存画面声音,只告诉播放器“下一个片段在哪、多长、用什么码率播”。
用 FFmpeg 命令一键生成(含切片)
这是最常用、最可控的方式,适用于本地视频转 HLS 流。要求已安装 FFmpeg 并加入系统环境变量。
第一步:打开终端(macOS/Linux)或命令提示符(Windows),进入视频所在目录。
第二步:执行以下命令:
ffmpeg -i input.mp4 -c:v libx264 -c:a aac -f hls -hls_time 10 -hls_list_size 0 -hls_segment_filename "video%03d.ts" playlist.m3u8
这条命令会同时完成三件事:把视频转成 H.264+AAC 编码、切成每段 10 秒的 .ts 文件、生成 playlist.m3u8 列表。其中 【-hls_list_size 0】 表示不限制播放列表中保留的分片数量,适合点播;若做直播,可设为正整数(如 5)自动轮滚旧条目。
注意:output 目录需有写入权限,否则命令会静默失败且不报错。
手动编写纯文本 m3u8 文件(适合已有 ts 文件)
当你已经有一批命名规则统一的 .ts 文件(比如 video001.ts、video002.ts……),可以直接手写列表,无需编码或切片。
方法一:用记事本新建文本文件 → 输入以下内容 → 保存为 UTF-8 编码 → 文件名后缀改为 .m3u8(如 playlist.m3u8):
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
video001.ts
#EXTINF:10.0,
video002.ts
#EXTINF:10.0,
video003.ts
#EXT-X-ENDLIST
关键点:【#EXTINF 后面的秒数必须与实际 ts 片段时长一致】,否则播放器会卡顿或跳帧;最后一行必须是 #EXT-X-ENDLIST(点播必需,直播则去掉)。
方法二:用 Excel 快速生成大批量条目——在 A1 输入 video001.ts,A2 输入 video002.ts,向下拖满;B1 输入 #EXTINF:10.0,,B2 同样下拉;C1 输入 =CONCATENATE("video",TEXT(ROW()-1+1,"000"),".ts"),再复制粘贴为值;最后用“替换”功能批量加换行和标签,导出为 .txt 再改后缀。
用 PHP 脚本动态生成(适合网站后台)
如果你在搭建视频服务,需要用户上传后自动生成播放列表,PHP 是轻量级首选。
① 创建 PHP 文件(如 generate.php),写入:
$ts_files = glob('*.ts');
sort($ts_files);
$m3u8 = "#EXTM3U\n#EXT-X-VERSION:3\n#EXT-X-TARGETDURATION:10\n#EXT-X-MEDIA-SEQUENCE:0\n";
foreach ($ts_files as $file) {
$duration = round(ffprobe($file, 'duration'), 1); // 需自行实现或调用 ffprobe 获取时长
$m3u8 .= "#EXTINF:{$duration},\n{$file}\n";
}
$m3u8 .= "#EXT-X-ENDLIST\n";
file_put_contents('playlist.m3u8', $m3u8);
?>
② 把该脚本和所有 .ts 文件放在同一目录,浏览器访问 generate.php 即生成 playlist.m3u8。
注意:ffprobe 不是 PHP 内置函数,需用 exec() 调用系统命令获取时长,或直接按固定值写死(如全部设为 10.0)——但【时长不准会导致播放器缓冲异常】,务必校验。











