ffmpeg 视频剪切与合并,时间不精确的问题

news/2024/7/10 21:20:31 标签: ffmpeg, 音视频

在工作中,需要将长视频对目标片段进行剪辑后测试,我们使用 ffmpeg 命令就可以很容易实现,这里也记录下我们使用过程中遇到的坑,希望对大家也有所帮助。

举个例子:

ffmpeg_3">一、当我们要截取视频文件中 input.mp4 的第100秒到第150秒时,ffmpeg命令行可以这么写:
ffmpeg -ss 100 -to 150 -i input.mp4 -c:v copy output.mp4
# 这里的参数-c:v copy 指的是复用原始视频的编码格式,如果想切换视频编码也可以直接指定,比如-c:v libx264 (使用命令ffmpeg -codecs可以查看编码列表)。
二、另外 -ss 和 -to 后面也可以写成时:分:秒的格式,比如要截取视频00:01:40开始到00:02:30的视频,命令行就可以写成如下:
ffmpeg -ss 00:01:40 -to 00:02:30 -i input.mp4 -c:v copy output.mp4
三、如果先从某个时间点开始,截取之后的多少秒视频,我们可以将 -to参数替换为-t参数,比如我想从视频的00:12:01开始截取之后的60秒视频,命令行就也这么写:
ffmpeg -ss 00:01:40 -t 50 -i input.mp4 -c:v copy output.mp4
# 这里需要注意的是如果你同时使用了-t和-to参数,那么ffmpeg会优先使用-t参数的值,-to参数无效
四、提示:-ss指定起始时间点不准确的问题

这里补充一个我们使用中遇到的坑,就是视频截取时间点不准确的问题,以上命令行在短视频中还能正常使用,但随着我们输入的视频时长越来越长,我们发现截取出来的视频时间点越来越不准确,比如我想从第5分钟截取到第10分钟,结果上面命令行给截出来的是第6分钟到第11分钟的视频。
   后来查阅 man ffmpeg 手册发现,-ss参数有注意事项,其放在-i前和后的效果不一样,是这么介绍-ss参数的:

-ss position (input/output)
           When used as an input option (before "-i"), seeks in this input file to position. Note that in most formats it is not possible to seek exactly, so ffmpeg will seek to the closest seek point before position.  When
           transcoding and -accurate_seek is enabled (the default), this extra segment between the seek point and position will be decoded and discarded. When doing stream copy or when -noaccurate_seek is used, it will be
           preserved.

           When used as an output option (before an output url), decodes but discards input until the timestamps reach position.

           position must be a time duration specification, see the Time duration section in the ffmpeg-utils(1) manual.

当-ss放在-i参数前,其搜索到的时间点是从文件中搜索到的位置是不准确的。当-ss参数在-i参数之后,ffmpeg会将视频重新解码,然后丢弃目标直到指定搜索的时间戳。
   所以以上几条命令,要想在任何输入下拿到更精确的结果,就应该这么写:

ffmpeg -i input.mp4 -ss 100 -to 150 -c:v copy output.mp4 
ffmpeg -i input.mp4 -ss 00:01:40 -to 00:02:30 -c:v copy output.mp4  
ffmpeg -i input.mp4 -ss 00:01:40 -t 50 -c:v copy output.mp4

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

相关文章

uni-app使用HBuilder X编辑器本地打包apk步骤说明

1.下载安装Android Studio 下载地址官方地址:Android Studio 下载文件归档 | Android 开发者 | Android Developers 安装Android SDK和Google USB Driver即可,后者主要是为了后期使用USB设置的,如果不需要可以不点。 2.下载uni-app提供…

.NET实现多线程拷贝文件

一、帮助类 using System; using System.IO; using System.Threading; using Microsoft.Win32.SafeHandles; using System.Runtime.InteropServices; using System.Diagnostics;namespace FastCopyClass {public class FastCopy{private const short FILE_ATTRIBUTE_NORMAL 0…

构建自己的物料解决方案——构建物料库,实现前端设计

01: 数据拦截简化数据获取流程 /** * 响应拦截器: * 服务端返回数据之后,前端 .then 之前被调用 */ service.interceptors.response.use((response) > {const { success, message, data } response.dataif (success) {return data}// TODO&#xff…

supervisor守护python进程报FATAL错 spawn error

出现问题 我们在使用supervisor守护使用虚拟python环境的时候可能会碰到如下的报错内容。 touchFish FATAL Exited too quickly (process log may have details)当我们使用sudo supervisorctl status查看这个进程的状态的时候,有可能还会返回包含一个spawn er…

网络编程-UDP协议(发送数据和接收数据)

需要了解TCP协议的,可以看往期文章 https://blog.csdn.net/weixin_43860634/article/details/133274701 TCP/IP参考模型 通过此图,可以了解UDP所在哪一层级中 代码案例 发送数据 package com.hidata.devops.paas.udp;import java.io.IOException; …

Python 用列表实现模拟手机通讯录(简易版)

"""列表实现好友管理系统知识点:1、列表存储信息2、列表增删改查3、嵌套循环4、字符串分割和拼接(重点)5、列表索引"""# 暂存好友信息(程序结束数据删除) friend_info list()input_buf…

【JVM】类加载子系统——自问自答

1、类加载的过程: java的类加载过程,是把字节码文件(.class file) 转换到JVM中运行时数据区内的过程。 类加载的过程由 类加载器子系统完成(Class Loader). 字节码文件可以像我们日常开发时在特定文件夹路径下的jar包里,也可以从网络中获取…

城市智慧公厕:引领科技创新的新时代

城市智慧公厕已经成为当下社会治理模式的升级范式,催生了无限的科技创新。如智慧公厕源头厂家广州中期科技有限公司,所推出的智慧公厕整体解决方案,除基本的厕位监测与引导、环境监测与调节、安全防范与管理、保洁考勤管理、多媒体交互、综合…