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.mzph.cn/news/664905.shtml

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

相关文章

正点原子--STM32定时器学习笔记(2)

书接上文,本篇是对基本定时器实验部分进行的总结~ 实验目标:通过TIM6基本定时器定时500ms,让LED0每隔500ms闪烁。 解决思路:使用定时器6,实现500ms产生一次定时器更新中断,在中断里执行“翻转LED0”。 定时…

排序(6)——冒泡排序、计数排序

七、冒泡排序 1.简介 冒泡排序可以说是我们的老朋友了,是一种很简单的排序方法。冒泡就是泡泡在水中向上漂,很形象的名字和贴合它的思路,通过一趟趟的冒泡每一次将最大的元素冒到最后的位置处,这样就完成了数据的排序。 2.思路与…

基于YOLOv8的船舶目标检测系统(Python源码+Pyqt6界面+数据集)

博主简介 AI小怪兽,YOLO骨灰级玩家,1)YOLOv5、v7、v8优化创新,轻松涨点和模型轻量化;2)目标检测、语义分割、OCR、分类等技术孵化,赋能智能制造,工业项目落地经验丰富; …

项目02《游戏-04-开发》Unity3D

基于 项目02《游戏-03-开发》Unity3D , 因前三集资源以及代码冗余问题,本次项目对前三集进行了重做,资源及代码如下, 首先导入场景及人物资源, 为人物添加动画控制器Animator组件, 创建动画控…

人工智能基础-matplotlib基础

绘制图形 import numpy as np x np.linspace(0, 10, 100) y np.sin(x) import matplotlib as mpl import matplotlib.pyplot as plt plt.plot(x, y) plt.show()绘制多条曲线 siny y.copy() cosy np.cos(x) plt.plot(x, siny) plt.plot(x, cosy) plt.show()设置线条颜色 …

Jasperreport 生成 PDF之省纸模式

省纸模式顾名思义就是节省纸张,使用 Jasper 去生成 PDF 的时候如果进行分组打印的时候,一页 A4 纸只会打印一组数据。这种情况下,如果每组数据特别少,只有几行,一页 A4 纸张根本用不了,就会另起一页继续打印…

【傻瓜式教程】docker运行facechain

首选,为了防止后期docker满,Docker容器 - 启动报错:No space left on device,更换一下docker存储位置 1、停止Docker服务 首先停止Docker守护进程,可以使用以下命令: sudo systemctl stop docker 备份现有…

旧衣物回收小程序开发,互联网模式下的营收有多大?

在当下快节奏的生活中,人们不仅生活水平在提高,消费水平也在逐渐提高,从而导致了闲置衣物的增加。为了减少浪费,旧衣服回收行业受到了大众的广泛关注,成为循环利用的一大方式。 当然,在当下网络时代&#…

时间复杂度为 O(n) 的排序算法

大家好,我是 方圆。本文介绍线性排序,即时间复杂度为 O(n) 的排序算法,包括桶排序,计数排序和基数排序,它们都不是基于比较的排序算法,大家重点关注一下这些算法的适用场景。 桶排序 桶排序是分治策略的一…

kingbase控制文件重建

背景: 测试版本:V008R006C005B0023 sys_control文件在数据目录的global下 若sys_control文件损坏或被删,会导致库无法启动 处理方式: 所在目录为数据目录 1、尝试dryrun touch global/sys_control sys_resetwal -l 00000001…

Jenkins任意文件读取漏洞(CVE-2024-23897)复现

Jenkins 有一个内置的命令行界面CLI,在处理 CLI 命令时Jenkins 使用args4j 库解析 Jenkins 控制器上的命令参数和选项。此命令解析器具有一个功能,可以将参数中后跟文件路径的字符替换为文件内容 ( expandAtFiles)。具有Overall/Read权限的攻击者可以读取…

PeakCAN连接到WSL2 Debian

操作步骤 按照以下步骤进行操作: 在Windows下安装PeakCAN驱动并安装,地址是https://www.peak-system.com/PCAN-USB.199.0.html?&L1 在Windows下安装usbipd,地址是https://github.com/dorssel/usbipd-win/releases,最新版是…

小米服务治理——客户端熔断器(Google SRE客户端熔断器)

目录 前言 一、什么是Google SRE熔断器 二、Google SRE 熔断器的工作流程: 三、客户端熔断器 (google SRE 熔断器) golang GRPC 实现 四、客户端熔断器 (google SRE 熔断器) golang GRPC单元测试 大家可以关注个人博客:xingxing – Web Developer …

nest.js实现登录验证码功能(学习笔记)

安装express-session npm i express-session 引入 注册session import * as session from express-session;import { NestFactory } from nestjs/core; import {DocumentBuilder,SwaggerModule, } from nestjs/swagger;import { AppModule } from ./app.module;async functio…

解决iCloud备份显灰问题的完全指南

目录 ​编辑 引言 问题背景 可能的原因 1 网络连接问题 2 ICloud账户异常 3 存储空间不足 4 备份设置问题 5 iOS版本问题 解决方法 3.1 检查网络连接 3.2 检查ICloud账户 3.3 检查存储空间 3.4 检查备份设置 3.5 更新iOS版本 3.6 重启设备 3.7 重置ICloud设置 …

CSC联合培养博士申请亲历|联系外导的详细过程

在CSC申报的各环节中,联系外导获得邀请函是关键步骤。这位联培博士同学的这篇文章,非常详细且真实地记录了申请过程、心理感受,并提出有益的建议,小编特推荐给大家参考。 2024年国家留学基金委公派留学项目即将开始,其…

简单说说redis分布式锁

什么是分布式锁 分布式锁(多服务共享锁)在分布式的部署环境下,通过锁机制来让多客户端互斥的对共享资源进行访问/操作。 为什么需要分布式锁 在单体应用服务里,不同的客户端操作同一个资源,我们可以通过操作系统提供…

【计网·湖科大·思科】实验六 IP数据报的发送和转发流程、默认路由和特定主机路由

🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要&…

用 Easysearch 帮助大型车企降本增效

最近某头部汽车集团需要针对当前 ES 集群进行优化,背景如下: ES 用于支撑包括核心营销系统、管理支持系统、财务类、IT 基础设施类、研发、自动驾驶等多个重要应用,合计超 50 余套集群,累计数据超 1.5PB 。 本文针对其中一个 ES 集…

Compose | UI组件(十二) | Lazy Layout - 列表

文章目录 前言LazyListScope作用域 用来干什么?LazyColumn组件含义?LazyColumn的基本使用LazyColumn Padding设置边距LazyColumn 设置边距 (contentPadding)LazyColumn 为每个子项设置边距 (Arrangement.spacedBy())LazyColumn 根据 rememberLazyListSta…