在今年的任务计划中有一项是做一个视频网站,当然其中需要的就是将mp4转 m3u8 格式,为啥要转为m3u8呢?这是因为m3u8以片段的形式储存,快进的时候拉到哪就看哪,如果是完整的mp4文件,则需要全部下载,浪费服务器带宽和用户时间。
1、下载ffmpeg
https://ffmpeg.zeranoe.com/builds/
下载完成后解压到任务目录(尽量不要有中文)
然后设置bin目录到系统环境变量(path)
2、对视频进行转码(转为MP4)
为啥要转码呢?
将视频文件转为视频编码h.264,音频编码aac格式的mp4文件
ffmpeg -i out.mp4 -c:v libx264 -strict -2 real.mp4
out.mp4 是待转码的文件(可以是其他格式,比如avi......之类的)
real.mp4 是转码输出文件
libx264 转为 h.264编码
这里我为啥要讲mp4再转码一次呢?因为我这个mp4视频文件不是h.264编码,所以需要再转一次,不然到后面切片的时候会遇到很多莫名其妙的问题。
这个过程一般比较长,根据电脑CPU和视频长度决定。当然也可以使用GPU进行转码,这样更快~
3、将MP4转换为ts格式文件(单个ts)
命令格式如下:
ffmpeg -y -i 待转换mp4文件路径 -c copy -vbsf h264_mp4toannexb 目标ts文件 ffmpeg -i real.mp4 -c copy -vbsf h264_mp4toannexb output.ts
转码成功后会生成ts文件
4、将ts切片,并生成m3u8文件
命令格式
ffmpeg -i output.ts -c copy -map 0 -f segment -segment_list playlist.m3u8 -segment_time 5 output%03d.ts
output.ts 已生成的ts文件
playlist.m3u8 待生成的m3u8文件名
5 切片时间,表示隔几秒进行切一个文件
output%03d.ts 生成切割ts文件名,output%03d.ts 代表生成output001.ts、output002.ts这样的格式,03d 可以随意修改,占位符。
这里我新建一个文件夹用了存放切片的m3u8 和 output.ts 文件,那么命令则是
ffmpeg -i output.ts -c copy -map 0 -f segment -segment_list void/playlist.m3u8 -segment_time 5 void/output%03d.ts
这样就算切片成功了,视频被切割成以5秒大小的ts文件。
参考文章:
https://blog.csdn.net/hejjunlin/article/details/71001593(FFmpeg总结(九)用ffmpeg进行切片生成m3u8索引文件)
https://blog.csdn.net/yeyinglingfeng/article/details/7874932(使用ffmpeg将视频转为x264编码的mp4文件)