ffmpeg视频截取切片

发布于:2022-12-19 ⋅ 阅读:(456) ⋅ 点赞:(0)

通过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↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓


网站公告

今日签到

点亮在社区的每一天
去签到