FFmpeg命令分隔视频

news/2024/7/10 19:17:08 标签: 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

      执行结果如下图所示:

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

#! /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


http://www.niftyadmin.cn/n/5213972.html

相关文章

Android Frameworks 开发总结之七

1.修改android 系统/system/下面文件时权限不够问题 下面提到的方式目前在Bobcat的userdebug image上测试可行&#xff0c;还没有在user上测试过. 修改前: leifleif:~$ adb root restarting adbd as root leifleif:~$ adb disable-verity verity is already disabled using …

Linxu 进程替换

进程替换的背景&#xff1a; 进程的替换我们需要调用execl这个接口,exxecl在3号手册&#xff0c;属于系统接口。 调用系统命令 execl 为了方便理解execl的作用&#xff0c;我们写一个程序&#xff1a; 单进程替换 我们发现运行结果是通过c库里的exec接口把系统命令 "l…

树的两种遍历

1 树的序遍历 前序遍历、中序遍历、后序遍历 1.1 遍历方式 都有点抽象&#xff0c;需要结合代码和画图来看 递归遍历非递归遍历&#xff1a;都是用栈来解决 前序遍历 用一个栈&#xff0c;先进右再进左 中序遍历 用一个栈&#xff0c;先进左&#xff0c;左出&#xff0c;再…

Zookeeper(一):在WSL单机搭建Zookeeper伪集群

目录 Zookeeper1 启动单个Zookeeper实例1.1 下载Zookeeper安装包并解压1.2 添加环境变量1.3 修改默认配置1.4 新建数据存储目录和日志目录1.5 启动Zookeeper1.6 停止Zookeeper 2 搭建Zookeeper集群2.1 新建集群目录2.2 配置环境变量2.3 创建节点目录2.4 修改配置2.5 创建节点ID…

《斯坦福数据挖掘教程·第三版》读书笔记(英文版)Chapter 3 Finding Similar Items

来源&#xff1a;《斯坦福数据挖掘教程第三版》对应的公开英文书和PPT It is therefore a pleasant surprise to learn of a family of techniques called locality-sensitive hashing, or LSH, that allows us to focus on pairs that are likely to be similar, without hav…

基于单片机压力传感器MPX4115检测-报警系统proteus仿真+源程序

一、系统方案 1、本设计采用这51单片机作为主控器。 2、MPX4115采集压力值、DS18B20采集温度值送到液晶1602显示。 3、按键设置报警值。 4、蜂鸣器报警。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 /*********************************…

map和set的底层结构 --- AVL树的实现(万字图文详解)

AVL树的实现 底层结构1. AVL的概念2. AVL树节点的定义3. AVL树的插入分析 4. AVL树的旋转4.1 新节点插入较高右子树的右侧---右右&#xff1a;左单旋4.2 新节点插入较高左子树的左侧---左左&#xff1a;右单旋4.3 新节点插入较高右子树的左侧---右左&#xff1a;先右单旋再左单…

LuatOS-SOC接口文档(air780E)--protobuf - ProtoBuffs编解码

示例 -- 加载 pb 文件, 这个是从pbtxt 转换得到的 -- 转换命令: protoc.exe -operson.pb --cpp_outcpp person.pbtxt -- protoc.exe 下载地址: https://github.com/protocolbuffers/protobuf/releases protobuf.load(io.readFile("/luadb/person.pb")) local tb {n…