通过segment_format指定切片文件的格式
ffmpeg -re -i input.mp4 -c copy -f segment -segment_format mp4 test_outpout-%d.mp4
查看分片文件的开始时间跟结束时间
开始时间:
ffprobe -v quiet -show_packets -select_streams v test_outpout-0.mp4 2> x |grep pts_time |head -n 3
结束时间:
ffprobe -v quiet -show_packets -select_streams v test_outpout-0.mp4 2> x |grep pts_time |tail -n 3
本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓
segment_list与segment_list_type指定切片索引列表
使用segment切割文件时不仅仅可以切割MP4,同样也可以切割TS或者FLV等文件,生成的文件索引列表名称也可以指定,当然,列表不仅仅是M3U8,也可以是其他的格式:
生成ffconcat格式索引文:
ffmpeg -re -i inuput.mp4 -c copy -f segment -segment_format mp4 -segment_list output.lst test_output-%d.mp4
上面这条命令将生成ffconcat格式的索引文件名output.lst这个文件将会生成一个mp4切片的文件列表:
生成CSV格式索引文件
ffmpeg -re -i input.mp4 -c copy -f segment -segment_format mp4 -segment_list_type csv -segment_list filelist.csv out-%d.mp4
上述命令将会生成CSV格式的列表文件,列表文件中的内容分为三个字段,文件名,文件起始时间和文件结束时间
从输出的内容可以看到切片文件的信息生成到了CSV文件,CSV文件可以用类似于操作数据库的方式进行操作,也可以根据CSV生成的视图图像
生成M3U8格式索引文件
ffmpeg -re -i input.mp4 -c copy -f segment -segment_format mp4 -segment_list_sypr m3u8 -segment_list output.m3u8 test-output-%d.mp4
生成M3U8列表不仅仅可以生成MPEGTS格式文件,同样还可以生成其他格式:
从输出的内容可以看到输出的M3U8与使用HLS模块生成的M3U8基本相同
reset_timestamps使切片时间戳归0 使每一片的时间戳归0可使用reset_timestamps进行设置,命里行如下:
ffmpeg -re -i inuput.mp4 -c copy -f segment -segment_format mp4 -reser_timestamps 1 test_output-%d.mp4
命令执行完成之后,可以查看一下是否每一个切片的时间戳都从0开始
查看生成的切片文件:
然后查看一下第一片的结束时间:
然后查看第二片的开始时间:
从验证的效果来看,每一片的开始时间戳已归0,参数设置生效
segment_times按照时间点剪切
对文件进行切片时,也时候需要均匀的切片,有时候需要按照指定的时间长度进行切片,segment可以根据指定的时间点进行切片,下面列举说明:
ffmpeg -re -i input.mp4 -c copy -f segment -segment_format mp4 -segment_format mp4 -segment_times 3,9,12 out-%d.mp4
根据命令行的参数可以看到,切片的时间点分别为第3秒,第9秒,和第12秒,在这三个时间点进行切片
ffmpeg使用ss与t参数进行切片
在ffmpeg中,使用ss可以进行视频文件的seek定位,ss所传递的参数为时间值,t所传递的参数也为时间值,下面就来列举说明ss与t的作用
使用ss指定剪切开头部分
ss参数可以用作切片定位起始时间点,例如从一个视频文件的第10秒钟开始截取内容:
ffmpeg -ss 10 -i input.mp4 -c copy out.ts
命令执行之后,生成的output.ts将会比input.mp4的视频少8秒,英文output.ts是从input.mp4的第8秒开始截取的,使用前面介绍过的ffprobe分别获得input.mp4与output.ts的文件duration并进行对比。信息如下;
ffprobe -v quiet -show_format input.mp4 |grep duration ; ffprobe -v quiet -show_format out.ts |grep duration
duration=20.000000
duration=9.966667
使用t指定视频中长度
使用ffmpeg截取视频除了可以指定开始截取位置,
还可以指定截取数据的长度, ffmpeg的t参数可以指定截取的视频长度,例如截取input.mp4文件的前10秒的数据:
ffmpeg -i input.mp4 -c copy -t 10 -copyts output.mp4
命令执行完之后,会生成一个时间从0开始的output.mp4,查看input,mp4与output.mp4的起始时间与长度相关信息:
从两个文件的duration信息可以看到,input的start_time是0,duration是10,00,而output.mp4的start_time也是0,duration则是3.69,参数生效
使用output_ts_offset指定输出start_time
ffmpeg支持ss与t两个参数一同使用以达到切割视频的某一段的效果,但其并不能阻挡输出文件的start_time,而且也不希望时间戳归0,可以使用output_ts_offset来达到指定输出文件的start_timed目的
ffmpeg -i input.mp4 -c copy -t 10 -output_ts_offset 120 output.mp4
命令执行之后输出output.mp4的文件的start_time即将被指定为120,下面就来看一下其效果:
从输出的内容可以看到start_time是从120秒开始,而durations是10秒,指定开始时间与duration操作生效。
如果你对音视频开发感兴趣,或者对本文的一些阐述有自己的看法,可以在下方的留言框给我留言,一起探讨。
本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓