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

相关推荐
「QT(C++)开发工程师」4 小时前
【FFmpeg应用场景概述】
ffmpeg
cuijiecheng20184 小时前
音视频入门基础:AAC专题(6)——FFmpeg源码中解码ADTS格式的AAC的Header的实现
ffmpeg·音视频·aac
yunhuibin4 小时前
ffmpeg面向对象——参数配置秘密探索及其设计模式
学习·设计模式·ffmpeg
superconvert1 天前
主流流媒体的综合性能大 PK ( smart_rtmpd, srs, zlm, nginx rtmp )
websocket·ffmpeg·webrtc·hevc·rtmp·h264·hls·dash·rtsp·srt·flv
cuijiecheng20181 天前
音视频入门基础:AAC专题(8)——FFmpeg源码中计算AAC裸流AVStream的time_base的实现
ffmpeg·音视频·aac
0点51 胜1 天前
[ffmpeg] 视频格式转换
ffmpeg
Jerry 二河小鱼2 天前
在Linux中安装FFmpeg
linux·运维·服务器·ffmpeg
0点51 胜2 天前
[ffmpeg] 音视频编码
ffmpeg·音视频
0点51 胜3 天前
[ffmpeg]音频格式转换
开发语言·c++·ffmpeg
PlumCarefree3 天前
基于鸿蒙API10的RTSP播放器(五:拖动底部视频滑轨实现跳转)
华为·ffmpeg·音视频