HLS (HTTP Live Streaming)是苹果推出的视频流协议,HLS格式的视频包含一个m3u8文本文件,以及众多的.ts的视频片段,而m3u8文本文件的作用就是将这些ts片段索引起来。 因为HLS协议是将视频切分成很多小的ts片段,这些小片段很适合放到cdn上,有很多视频文章都使用了hls格式传输视频。今天我在这里教大家如何用ffmpeg将mp4格式的视频转为HLS(m3u8)格式。
如果不对视频重新编码的话,命令也很简单,如下:
ffmpeg -i input.mp4 -c:v copy -hls_time 2 -hls_segment_filename %d.ts -f hls output/playlist.m3u8
这里用到了几个参数,作用分别如下:
参数 作用
-i 指定输入的文件名
-c:v 指定视频的编码格式,copy的意思是复用原始视频的编码信息,不重新编码
-hls_time 指定切分的ts文件时长,单位秒
-hls_segment_filename ts文件的命名格式
-f 指定输出的文件格式,实测这个参数可以省略
这里有个坑,当我用上面命令行生成hls视频后,我发现每个ts的时长不是我指定的2s,而是10s。查阅资料后发现,ts切片的大小严格依赖于原始视频的GOP大小,因为必选保证一个ts内至少包含一个GOP,否则这个ts分片就无法使用。当然解决方式也很简单,我们只需要再新增一个参数 -force_key_frames "expr:gte(t,n_forced*2)" 这个参数的作用就是让视频GOP大小为2s,这样就能保证ts分片大小是我们想要的2s了。 完整命令如下:
ffmpeg -i input.mp4 -c:v copy -force_key_frames "expr:gte(t,n_forced*2)" -hls_time 2 -hls_segment_filename %d.ts -f hls output/playlist.m3u8