近期做视频点播,要求将视频文件切片成ts文件。经搜索得到以下两个命令,可完成这个任务。
一 首先将视频文件转为视频编码h264,音频编码aac格式的mp4文件
1.可以预先使用ffprobe查看文件编码方式
ffprobe input.mkv
如果得到音视频编码为h264/aac则执行
ffmpeg -i input.mkv -acodec copy -vcodec copy out.mp4
否则执行
ffmpeg -i input.mkv -acodec libfaac -vcodec libx264 out.mp4
二 将mp4文件转为ts文件并生成m3u8
1. 将mp4转为完整的ts
命令来自:百度知道
ffmpeg -i out.mp4 -c copy -bsf h264_mp4toannexb output.ts
上面错误,下面修正命令
ffmpeg -i out.mp4 -vcodec copy -vbsf h264_mp4toannexb output.ts
2. 将ts切片,并生成m3u8文件
命令来自:http://www.mworkbox.com/wp/work/491.html
ffmpeg -i output.ts -c copy -map 0 -f segment -segment_list playlist.m3u8 -segment_time 10 output%03d.ts
注:output.ts是源文件名,playlist.m3u8是生成的m3u8文件名,10 是切片秒数,output%03d.ts是输出文件名
OK完成!
强制每10秒一个关键帧,文件时长不变 ,参考https://blog.csdn.net/u014552102/article/details/103302731
ffmpeg -i abc.ts -force_key_frames "expr:gte(t,n_forced*10)" -strict -2 -c:a aac -c:v libx264 -hls_time 10 -f hls out.m3u8
ffmpeg -i abc.ts -force_key_frames "expr:gte(t,n_forced*10)" -strict -2 -hls_time 10 -f hls out.m3u8
第一个引入-c:a aac -c:v libx264
第二个不引入
因强制每10秒一个关键帧后造成生成m3u8不全的话,也可先强制关键帧转码生成.ts文件后再切片,代码如果
第一条命令是强制每10秒一个关键帧转码成.ts文件(此转码过程可加水印logo等,命令自测)
ffmpeg -i test.mp4 -force_key_frames "expr:gte(t,n_forced*10)" -strict -2 -c:a aac -c:v libx264 test.ts
第二条命令是无需转码每10秒快速切片生成m3u8列表文件
ffmpeg -i test.ts -c copy -map 0 -f segment -segment_list playlist.m3u8 -segment_time 10 output%03d.ts
注:现在用这个命令,不转码不关键帧快速hls切片,解决强制每10秒一个关键帧后生成m3u8不全的问题
ffmpeg -i 3.mp4 -vcodec copy -acodec copy -hls_time 10 -hls_list_size 0 out.m3u8