FFmpeg命令分隔视频

      有一个视频如a.mp4,此视频采用帧率为30生成,共有299帧,这里通过FFmpeg命令分隔成1秒一个个的小视频,即每个小视频帧数为30帧。

      用到的FFmpeg参数如下所示:

      (1).-i:指定输入视频文件的名称;
      (2).-c:指定编解码器;copy是一个特殊编解码器,它直接复制输入流到输出流中,不会改变其内容,不进行重新编码;指定copy可保持质量,进行无损复制
      (3).-map:指定输入文件的映射;指定输入文件的索引号或名称,索引号从0开始,可以是多个输入文件中的一个;
      (4).-segment_time:指定每个输出文件的时长,默认值为2秒;注意:仅使用此参数有时可能分隔不准确
      (5).-reset_timestamps:在每个视频段的开头重置时间戳;它的目的是简化生成的视频段的播放;它为bool类型,默认为0;
      (6).-g:设置帧率,指定每秒视频中包含的帧的数量,会影响视频的播放速度;或用于设置GOP(group of picture)大小,即用来设置多少帧插入一个关键帧(I帧);
      (7).-sc_threshold:场景切换阈值(scene change threshold),默认值为0;这个阈值的设定会影响到关键帧的插入频率,较小的阈值会导致更频繁地插入关键帧,而较大的阈值则会减少关键帧的插入;
      (8).-f:force format,后跟segment用于将多媒体数据流分隔成多个独立的输出文件;
      (9).-segment_time_delta:用于设置分隔时间的近似值;在选择分隔的开始时间时指定准确时间,默认值为0;此选项在分割视频内容时非常有用,视频内容始终在GOP边界处分割,以防在指定分割时间之前找到关键帧;
      当指定delta时,如果关键帧(key-frame)的PTS(Presentation Time Stamp, 音视频帧在时间轴上的展示时间点,它通常以毫秒为单位,表示从文件开始播放到当前帧的时间间隔)满足以下关系,则关键帧将开始一个新的分隔:
      PTS >= start_time - time_delta
      (10).-loglevel:用于控制日志的详细程度;后可跟的参考可为:quiet:只显示致命错误;fatal:显示致命错误和错误;debug:显示调试信息;等
      (11).output%03d.mp4:输出文件命名格式,其中%03d是一个占位符,用于生成具有三位数字编号的文件名,如生成的视频文件,依次为output000.mp4, output001.mp4...

      执行分隔的命令如下所示:

ffmpeg -i a.mp4 -c copy -map 0 -segment_time 1 -segment_time_delta 9999999 -reset_timestamps 1 -g 30 -sc_threshold 0 -loglevel debug  -f segment output%03d.mp4

      执行结果如下图所示:

FFmpeg命令分隔视频_第1张图片

      分隔正确与不正确时输出信息对比如下:还没有分析出对segment_time_delta设置不同的值会产生不同结果的原因a.mp4共299帧,不添加segment_time_delta参数,第一个分隔的视频为60帧;添加此参数,当值很小时,还是第一个分隔的视频为60帧;当此值设为0.05时,第二个分隔的视频为60帧;当此值设为0.1时,第四个分隔的视频为60帧;当此值设为0.2时,第7个分隔的视频为60帧;当此值设为0.25时,第8个分隔的视频为60帧;当此值设为0.27时,第9个分隔的视频为59帧;当此值为0.3时,可完全正确分隔;当此值很大时,如为9999999,也可完全正确分隔。

FFmpeg命令分隔视频_第2张图片

      获取每个视频的总帧数的脚本show_video_frames_number.sh如下:

#! /bin/bash

if [ $# != 1 ]; then
	echo "it takes an input parameter: mp4 video file directory"
fi

tmp_file=tmp.txt
find $1 -name "*.mp4" > ${tmp_file}

while IFS='' read -r line || [[ -n "$line" ]]; do
	echo -n "video file: ${line}:  "
	./ffprobe.exe -v error -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 ${line}
	sleep .2
done < ${tmp_file}

rm ${tmp_file}

      当segment_time_delta分别设置为0.2和0.3时分隔的结果如下所示:

FFmpeg命令分隔视频_第3张图片

      注:
      (1).通过执行:ffmpeg.exe -h full ,可获取每个参数的介绍;
      (2).可在https://ffmpeg.org/ffmpeg-formats.html 中查看参数的详细介绍。

      GitHub:https://github.com/fengbingchun/OpenCV_Test

你可能感兴趣的:(ffmpeg)