ffmpeg 时间裁剪之-ss -t与滤镜中trim=start=*:duration=*的区别和联系

背景

工作中遇到的呗。记下来贡着。

滤镜重置时间戳:setpts=PTS-STARTPTS

在FFmpeg中,setpts=PTS-STARTPTS是一种用于调整视频时间戳(PTS)的滤镜表达式。这个表达式通常用于视频编辑和处理过程中,用于修改视频的时间轴。

让我们解释一下这个表达式的各个部分:

PTS:表示当前帧的原始时间戳(针对滤镜的输入而言,而非原始文件)。时间戳是用于确定视频中每一帧的时刻的数值。在ffmpeg执行过程中,这是个动态值

STARTPTS:表示流的开始时间戳。这是输入流的第一帧的时间戳。在一个处理链中,STARTPTS用于引用流的初始时间戳,而不是每一帧的时间戳。这是个确定的值,等于滤镜拿到的「视频流的开始时间戳」,在ffmpeg执行过程中,恒定不变。这里强调一下,滤镜内trim指定的起始时间(不指定则默认0)如果还没有出现视频流,则STARTPTS会一直向后找到视频流,把遇到的首帧时间戳作为其值。

PTS-STARTPTS(相减):这部分表示当前帧相对于开始时间戳的偏移量。使用这个表达式会将视频的时间轴重新设置,以使第一帧的时间戳为零,后续帧的时间戳相对于第一帧进行调整。

setpts:这是一个滤镜指令,用于设置帧的新时间戳。通过将setptsPTS-STARTPTS结合使用,可以重新计算和调整视频帧的时间戳。

综合起来,setpts=PTS-STARTPTS的效果是将视频的时间轴重新调整,使第一帧的时间戳为零,后续帧相对于第一帧进行相应的时间调整。这在一些视频处理场景中很有用,例如剪辑、拼接或进行时间轴变换。

在这里插入图片描述

另外,滤镜的输入,是-ss -t 等参数裁剪完之后的结果,这个结果的时间戳从0开始。所以对于滤镜来说,滤镜拿到的输入文件的时间戳总是起始于0。但是,视频流却未必起始于0。例如,-ss -t裁剪完,传给滤镜的文件 总时长10秒,但视频流只在7~10秒(也就是前7秒没画面),那么STARTPTS值恒为7,PTS值为变量,即每一帧的时间戳(起始于STARTPTS)。

案例一:滤镜不重置时间戳

ffmpeg -ss 10 -stream_loop -1 -i dongwu_25min.mp4 -t 30 -filter_complex "[0:v]scale=1920:1080,trim=start=5.000000:duration=10.000,showinfo[node1_f2_media1]" -map "[node1_f2_media1]" -y output.mp4

注意:滤镜中的duration=10.000会严格取视频流的持续时长,如有空白则跳过。

打印中间信息:

[Parsed_showinfo_2 @ 0x6000026b0160] n:   1 pts:  64538 pts_time:5.04203 duration:    512 duration_time:0.04    pos:  6978739 fmt:yuv420p sar:1/1 s:1920x1080 i:P iskey:1 type:I checksum:6E67BBE3 plane_checksum:[4C14CFED 616C9631 542B55B6] mean:[114 114 140] stdev:[46.7 10.5 8.2]
[Parsed_showinfo_2 @ 0x6000026b0160] color_range:tv color_space:bt709 color_primaries:bt709 color_trc:bt709
[Parsed_showinfo_2 @ 0x6000026b0160] n:   2 pts:  65050 pts_time:5.08203 duration:    512 duration_time:0.04    pos:  7073379 fmt:yuv420p sar:1/1 s:1920x1080 i:P iskey:0 type:B checksum:7F7442B0 plane_checksum:[5183AB5E C054091B A25D8E28] mean:[114 114 140] stdev:[46.9 10.5 8.3]
[Parsed_showinfo_2 @ 0x6000026b0160] color_range:tv color_space:bt709 color_primaries:bt709 color_trc:bt709
[Parsed_showinfo_2 @ 0x6000026b0160] n:   3 pts:  65562 pts_time:5.12203 duration:    512 duration_time:0.04    pos:  7082240 fmt:yuv420p sar:1/1 s:1920x1080 i:P iskey:0 type:B checksum:A5B5226D plane_checksum:[EC5F922E 1D3CB01D 4CF5E004] mean:[113 114 140] stdev:[47.0 10.5 8.3]# .........[Parsed_showinfo_2 @ 0x6000026b0160] n: 248 pts: 191002 pts_time:14.922  duration:    512 duration_time:0.04    pos: 11124238 fmt:yuv420p sar:1/1 s:1920x1080 i:P iskey:0 type:P checksum:2DD2E7F0 plane_checksum:[C0E163CA 3CD3F5D4 0B798E43] mean:[118 116 138] stdev:[38.6 7.5 6.8]
[Parsed_showinfo_2 @ 0x6000026b0160] color_range:tv color_space:bt709 color_primaries:bt709 color_trc:bt709
[Parsed_showinfo_2 @ 0x6000026b0160] n: 249 pts: 191514 pts_time:14.962  duration:    512 duration_time:0.04    pos: 11221829 fmt:yuv420p sar:1/1 s:1920x1080 i:P iskey:0 type:B checksum:46C2FCF7 plane_checksum:[129AED32 F4604F36 708DC080] mean:[118 116 138] stdev:[38.6 7.5 6.8]
[Parsed_showinfo_2 @ 0x6000026b0160] color_range:tv color_space:bt709 color_primaries:bt709 color_trc:bt709
frame=  375 fps= 60 q=-1.0 Lsize=    4848kB time=00:00:14.88 bitrate=2669.2kbits/s dup=125 drop=0 speed=2.39x
video:4843kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.104424%
[libx264 @ 0x128006460] frame I:2     Avg QP:17.26  size: 95752

产出视频总时长15秒,前5秒静止为首帧。原因是时间戳保留为滤镜的输入,即输入流从第5秒才开始出现。

案例二:滤镜重置时间戳

ffmpeg -ss 10 -stream_loop -1 -i dongwu_25min.mp4 -t 30 -filter_complex "[0:v]scale=1920:1080,trim=start=5.000000:duration=10.000,setpts=PTS-STARTPTS,showinfo[node1_f2_media1]" -map "[node1_f2_media1]" -y output.mp4

由于设置了setpts=PTS-STARTPTS,视频流导出后的时间戳从0开始。注意-t最好给足,不然滤镜拿到的视频流可能不够用而导致产出视频变短。

案例三:讨论-i -ss -t 顺序问题

情况1: -ss -t -i (可能不符合预期)

ffmpeg -ss 8 -t 4 -i _part1.mp4 -y output.mp4

-ss是截取输入文件的时间戳,-t视频流的最大持续时长。如果-ss指定的开始时间有一段时间不含视频流,那么-t的截取会跳过这段空白,直到找到视频流才计算时长。

在这里插入图片描述

如图视频的视频流是第10秒才开始有,则-ss 8 -t 4 -i a.mp4的情况下,实际产物总时长6秒,且只有后4秒有视频流。

情况2: -ss -i -t (强烈推荐使用)

ffmpeg -ss 8 -i _part1.mp4 -t 4 -y output.mp4

-ss是截取输入文件的时间戳,-t输出文件的最大持续时长。如果-ss指定的开始时间有一段时间不含视频流,那么-t的截取不会跳过这段空白。
在这里插入图片描述

-t-i之前和之后的区别

-t-i之前,则持续时长是针对-i输入文件的流而言;-i-t之前,则持续时长是针对输出文件而言。

情况3:-i -ss -t(慎用)

ffmpeg -i _part1.mp4  -ss 14:8 -t 4 -y output.mp4

-ss是截取输入文件解码后的时间戳,-t输出文件的最大持续时长。

-ss-i之前和之后的区别

-ss-i之前,则截取的起始是针对-i输入文件(不是流)而言;-i-ss之前,则截取起始时间是针对解码后加粗样式的文件而言,比如-ss 20:00会浪费性能为前20分钟解码。

关于滤镜中的duration和PTS

滤镜中的duration会严格截取视频流的时长,有空白则跳过。

时间戳PTS如果设的超出预期时长,则还是会按时间戳播放,从而导致总时长变长。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/250695.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

重写Sylar基于协程的服务器(4、协程调度模块的设计)

重写Sylar基于协程的服务器(4、协程调度模块的设计) 重写Sylar基于协程的服务器系列: 重写Sylar基于协程的服务器(0、搭建开发环境以及项目框架 || 下载编译简化版Sylar) 重写Sylar基于协程的服务器(1、日…

【数据结构】链表OJ面试题2(题库+解析)

1.前言 前五题在这http://t.csdnimg.cn/UeggB 休息一天,今天继续刷题! 2.OJ题目训练 1. 编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前 。链表分割_牛客题霸_牛客网 思路 既然涉及…

关于爬取所有哔哩哔哩、任意图片、所有音乐、的python脚本语言-Edge浏览器插件 全是干货!

这些都是现成的并且实时更新的!从次解放双手! 首先有自己的edge浏览器基本上都有并且找到插件选项 1.哔哩哔哩视频下载助手(爬取哔哩哔哩视频) bilibili哔哩哔哩视频下载助手 - Microsoft Edge Addons 下面是效果: 2.图…

【Android Studio 启动出错】

Android Studio版本:2022.3.1 出错前操作: 昨晚开着三四个项目,然后太晚了直接关机睡觉,第二天起来开机,启动Android Studio,就出现了这个问题: Internal error. Please refer to https://co…

phpMyAdmin 未授权Getshell

前言 做渗透测试的时候偶然发现,phpmyadmin少见的打法,以下就用靶场进行演示了。 0x01漏洞发现 环境搭建使用metasploitable2,可在网上搜索下载,搭建很简单这里不多说了。 发现phpmyadmin,如果这个时候无法登陆,且也…

vue 适配大屏 页面 整体缩放

正常应该放在app.vue 里面。我这里因为用到element-ui 弹框无法缩放,所以加在body上面 (function (doc, win) {var docEl doc.documentElement,resizeEvt orientationchange in window ? orientationchange : resize,recalc function () {var clientWidth docE…

vscode实时预览markdown效果

安装插件 Markdown Preview Enhanced 上面是搜索框 启动预览 右键->Open Preview On the Side 效果如下: 目录功能 目录功能还是使用gitee吧 push后使用gitee,gitee上markdown支持侧边生成目录

Springboot 自定义参数配置化,密钥,密码,文件保存路径

application.properties 和 application.yml 都是一样的配置方法,只是格式不一样 定义配置文件 server.port8080 image.save.pathE:\ #自定义文件保存路径读取配置文件 Value("${image.save.path}")private String filePath;//E:\优化配置文件 如果我参…

云计算HCIE备考经验分享

大家好,我是来自深圳信息职业技术学院22级鲲鹏3-1班的刘同学,在2023年9月19日成功通过了华为云计算HCIE认证,并且取得了A的成绩。下面把我的考证经验分享给大家。 转专业进鲲鹏班考HCIE 大一上学期的时候,在上Linux课程的时候&…

AD24-Class、飞线、PCB Nets的管理及添加、层的管理

一、Class 1、Class介绍 2、Class添加与显示 ①添加 ②显示通过Panels-PCB,即可将创建的类显示再左上方窗口 3、Class的编辑管理 ①概述 ②颜色更改 二、飞线 1、概述 2、 飞线的打开、关闭 打开:Alt左上角滑动 N:可以针对性的显示和隐…

SQL 函数(十二)

SQL 函数(十二) 一、函数分类 1.1 单行函数 单行函数仅对单个行进行运算,并且每行返回一个结果。 常见的函数类型: 字符、数字、日期、转换 1.2 多行函数 多行函数能够操纵成组的行,每个行组给出一个结果&#x…

【讲座分享】| 复旦大学张奇教授——《自然语言发表论文如何打怪升级?NLP顶会论文发表》

文章目录 1 基础关1.1 基础书籍1.2 提高书籍1.3 课程链接1.4 编程实战 2 阅读关2.1 分层过滤2.2 集团作战,信息获取2.3 论文如何泛读 3 动机 方向关3.1 快速发论文3.2 好的研究 4 写作关4.1 论文写作流程4.2 从读者角度出发4.3 每一部分怎么写4.3.1 Abstract摘要4.3…

rust gui开发框架选择

作为一个系统编程强大语言,怎么能少得了图形界面的开发 实际上写这篇前我也不知道,于是我问了ai大模型,文心3.5和chatgpt4.0 答案实际上不能满意,最后我做了下筛选 参考博文: rust开发环境配置:链接 一、…

【大数据】Flink SQL 语法篇(三):窗口聚合(TUMBLE、HOP、SESSION、CUMULATE)

Flink SQL 语法篇(三):窗口聚合 1.滚动窗口(TUMBLE)1.1 Group Window Aggregation 方案(支持 Batch / Streaming 任务)1.2 Windowing TVF 方案(1.13 只支持 Streaming 任务&#xff…

nginx+nginx-rtmp-module+ffmpeg进行局域网推流rtmp\m3u8

局域网推流的简单方式 这里以ubuntu为例 一、先下载安装包 nginx、nginx-rtmp-module,再一起安装 # 下载nginx # 这里我安装的是 nginx-1.10.3 版本 cd /usr/software wget http://nginx.org/download/nginx-1.25.0.tar.gz tar -zxvf nginx-1.25.0.tar.gz# 下载ng…

java基础:带参数的成员方法

上一篇博客中的成员方法是无参的,但成员方法其实是可以有参数的,可以增加代码的灵活性和健壮性。 本文以带一个参数的成员方法和带2个参数的成员方法为案例,加深对知识点的理解。 第一个成员方法(带一个参数)&#xf…

Linux 系统开始配置

文章目录 备份源为root 设置密码安装基本工具切换root 用户删除snap从 Ubuntu 移除 Snap 后使用 deb 文件安装软件商店和 Firefox在 Ubuntu 系统恢复到 Snap 软件包总结 删除 vim安装neovim在线安装neovim压缩安装neovim安装lazyvim安装剪切板 安装qt配置 Qt 环境不在sudoers文…

张维迎《博弈与社会》威胁与承诺(1)威胁的可信与不可信

动态博弈的描述 前两章分析的博弈中,所有参与人都同时行动,这样的博弈被称为静态博弈。这一章我们开始关注动态博弈。不同于静态博弈,动态博弈中的参与人行动有先后顺序,后行动者在先行动者做出决策之后再选择自己的行动。生活中大…

分类预测 | Matlab实现GAF-PCNN-MATT格拉姆角场和双通道PCNN融合多头注意力机制的分类预测/故障识别

分类预测 | Matlab实现GAF-PCNN-MATT格拉姆角场和双通道PCNN融合多头注意力机制的分类预测/故障识别 目录 分类预测 | Matlab实现GAF-PCNN-MATT格拉姆角场和双通道PCNN融合多头注意力机制的分类预测/故障识别分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现G…

【开源】基于JAVA+Vue+SpringBoot的陕西非物质文化遗产网站

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 设计目标2.2 研究内容2.3 研究方法与过程2.3.1 系统设计2.3.2 查阅文献2.3.3 网站分析2.3.4 网站设计2.3.5 网站实现2.3.6 系统测试与效果分析 三、系统展示四、核心代码4.1 查询民间文学4.2 查询传统音乐4.3 增改传统舞…