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...

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

bash 复制代码
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

执行结果如下图所示:

分隔正确与不正确时输出信息对比如下:还没有分析出对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,也可完全正确分隔。

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

bash 复制代码
#! /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时分隔的结果如下所示:

注:

(1).通过执行:ffmpeg.exe -h full ,可获取每个参数的介绍;

(2).可在https://ffmpeg.org/ffmpeg-formats.html 中查看参数的详细介绍。

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

相关推荐
Maxwin11 小时前
Manim 竖屏画布选 9×16 还是 4.5×8?从 font_size 和每单位像素数说起
python·ffmpeg
FlightYe13 小时前
音视频修炼之容器与协议(一):MP4和MOV的box剖析
android·linux·c++·ffmpeg·音视频
开开心心就好4 天前
手机虚拟化学实验室,混合燃烧都能模拟
jupyter·智能手机·ffmpeg·计算机外设·电脑·音视频·visual studio
VidDown5 天前
用户说“卡顿“,服务器一切正常:播放质量监测与 QoE 指标
运维·服务器·ffmpeg·音视频·视频
开开心心就好5 天前
手机电池健康怎么查?看容量温度循环次数
spring·智能手机·ffmpeg·计算机外设·电脑·maven·音视频
智能直播6 天前
网络RTMP拉流不卡顿、声音不同步,一文讲透缓冲区、时间戳
开发语言·ffmpeg·php·音视频·视频编解码
八月的雨季 最後的冰吻6 天前
FFmepg-- 42-ffplay.c 线程安全机制深度分析
c语言·安全·ffmpeg
开开心心就好7 天前
把手机变成电脑麦克风,WiFi连接就能用
智能手机·ffmpeg·计算机外设·电脑·word·音视频
@嵌入式扫地僧8 天前
FFmpeg 解码 H.264 流提取 SEI 用户数据实战
ffmpeg·h.264·流媒体开发·sei 解析·自定义 sei
VimorphTech8 天前
ffmpeg.wasm 实战:浏览器提取视频音频,如何处理进度、取消和资源释放?
ffmpeg