当前位置: 首页 > news >正文

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中传输协议的数据格式
  • 数字化时代下如何做好事件营销?
  • 市场复盘总结 20240206
  • QT 应用程序中集成浏览器
  • 数据库学习笔记2024/2/5
  • 阅读笔记——《RapidFuzz: Accelerating fuzzing via Generative Adversarial Networks》
  • 算法学习——华为机考题库10(HJ64 - HJ69)
  • CTF-show WEB入门--web21
  • Oracle分析SQL执行调优
  • 为什么说Python语法简单?
  • Redis核心技术与实战【学习笔记】 - 28.Redis 6.0新特性(多线程、客户端缓存与安全)
  • NLP_词的向量表示Word2Vec 和 Embedding
  • MySQL 用户管理
  • 基于SSM的便民自行车管理系统的开发与实现(有报告)。Javaee项目。ssm项目。
  • 如何从dockerhub 中运行一个简单项目
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 分享一款快速APP功能测试工具
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • Lsb图片隐写
  • mysql_config not found
  • Objective-C 中关联引用的概念
  • Python_网络编程
  • Redis 中的布隆过滤器
  • spring cloud gateway 源码解析(4)跨域问题处理
  • vue:响应原理
  • vue中实现单选
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 分布式事物理论与实践
  • 机器学习中为什么要做归一化normalization
  • 聚簇索引和非聚簇索引
  • 两列自适应布局方案整理
  • 如何使用 JavaScript 解析 URL
  • 三栏布局总结
  • 说说动画卡顿的解决方案
  • 小而合理的前端理论:rscss和rsjs
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #FPGA(基础知识)
  • (13):Silverlight 2 数据与通信之WebRequest
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (安卓)跳转应用市场APP详情页的方式
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (译)计算距离、方位和更多经纬度之间的点
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .Net的C#语言取月份数值对应的MonthName值
  • .net的socket示例
  • .NET企业级应用架构设计系列之技术选型
  • .net网站发布-允许更新此预编译站点
  • .NET委托:一个关于C#的睡前故事
  • .NET中的Exception处理(C#)