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