三种方法使用FFmpeg截取视频片断

2023-10-26

如何以 3 种简单的方式使用 FFmpeg 剪切视频(提取/修剪) 2020 年 10 月 12 日 Krishna Rao Vijayanagar FFmpeg

在本教程中,我们将了解如何使用 FFmpeg 以 3 种不同的方式剪切/修剪/提取视频文件的一部分。有一些快速的方法可以使用不太精确的查找和复制视频来实现这一点,并且有一种帧精确技术,虽然速度很慢,但可以选择重新编码视频。

寻找使用-ss参数

假设您要提取视频的一部分——比如从第 10 秒到第 20 秒。

您需要做的第一件事是告诉 FFmpeg搜索到第 10 秒,对吗?这是使用FFmpeg 命令行中的 -ss 参数实现的,语法为 –

./ffmpeg -ss <time> -i <inputvideo> ....... 

在这里,时间被指定为HH:MM:SS.MILLISECONDS。例如,您可以告诉 FFmpeg 寻找01:02:03——即电影 1 小时的第 2 分钟的第 3 秒!

本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg webRTC rtmp hls rtsp ffplay srs↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

指定结束时间

使用-ss,我们指定了开始时间。现在,让我们学习指定结束时间。而且,如果我们将这两者放在一起,我们可以使用 FFmpeg 有效地剪切/拼接视频。

-t范围
您可以使用参数指定所需剪辑的持续时间-t。例如,-ss 40 -t 10指示 FFmpeg 从第 40 秒开始提取 10 秒的视频。

-to范围
您可以使用参数指定结束时间-to。例如,-ss 40 -to 70指示 FFmpeg 从第 40 秒到第 70 秒提取 30 秒的视频。

注意:如果你同时使用 -t 和 -to,那么只有-t将被使用。

使用重新编码进行剪切/修剪

如果您在剪切/修剪时重新编码您的视频,那么您将获得一个精确到帧的剪切,因为 FFmpeg 将重新编码视频并从 I 帧开始。这是使用输出搜索的命令行。在此示例中,您将指示 FFmpeg 读取名为inputVideo.mp4 并提取 5 秒的视频,从第 3 秒开始到第 8 秒结束 - 同时使用libx264.

ffmpeg -i inputVideo.mp4 -ss 00:03 -to 00:08 -c:v libx264 -crf 30 trim_opseek_encode.mp4

您还可以使用此命令行以特定比特率或质量重新编码,使用crf更改分辨率等。

请记住,此选项将花费大量时间和资源,因为您正在执行重新编码。但是,它确实有不可忽视的优点。

我剪切了一个 5 秒的部分并使用libx264编码. 您可以看到它在请求的时间准确启动,没有任何卡顿或黑框。如果仔细观察,时间戳会表明这一点。

这是因为 FFmpeg 从一开始就对视频进行重新编码,并且可以根据需要插入 I 帧以生成视频的帧精确剪辑。

无需重新编码即可快速剪切/修剪(使用复制和输入搜索)

这是一个简单的命令行,您可以使用它来剪切/修剪/提取视频的一部分——快!

ffmpeg -ss 00:00:03 -i inputVideo.mp4 -to 00:00:08 -c:v copy -c:a copy  trim_ipseek_copy.mp4

参数很容易理解。您正在指示 FFmpeg 读取名为 inputVideo.mp4 并提取 5 秒的视频,该视频从第 3 秒开始到第 8 秒结束。

相关: 使用 FFmpeg 进行音频转码 - 使用 FFmpeg 轻松更改音频编解码器
此外,您告诉 FFmpeg 复制音频和视频而不执行重新编码——这非常快! 

将输入搜索参数-ss放在参数-i之前, 并且非常快,因为 FFmpeg 从I帧跳转到I帧以到达搜索点。

 

有什么问题吗?

由于搜索操作在 I 帧之间跳转,它不会准确地停止在您请求的帧(或时间)上。它将搜索最近的 I 帧并从该点开始复制操作。

使用不重新编码的输出搜索进行剪切/修剪
如果我们在-i参数之后插入-ss参数,则称为输出搜索。

ffmpeg -i inputVideo.mp4 -ss 00:00:03 -to 00:00:08 -c:v copy -c:a copy trimmedVideo.mp4

但是,这里又是一个问题。在视频压缩中,您拥有独立编码的 I 帧,并且您拥有依赖于其他帧进行解码的预测帧 (P, B)。

如果您指定的开始时间落在预测帧上,则复制操作将从该帧开始(称为 X)。输出中可能缺少“X”需要解码的帧!因此,在到达第一个 I 帧之前,输出视频可能不会顺利启动,并且可能会出现一些卡顿或黑色视频。

这是输出。

您可以看到时间戳从第 5 秒左右开始,一直持续到第 8 秒。同样,类似于输入搜索,它无法找到 I 帧来执行准确的剪辑。

结论

有了它——使用 FFmpeg 剪切、修剪、提取部分视频的三种简单方法。这三种方法都满足不同的需求,所以一定要尝试一下,了解您的要求,并为您的项目使用正确的方法!

如果你对音视频开发感兴趣,觉得文章对您有帮助,别忘了点赞、收藏哦!或者对本文的一些阐述有自己的看法,有任何问题,欢迎在下方评论区与我讨论!

原文地址:https://ffmpeg.0voice.com/forum.php?mod=viewthread&tid=1709

本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg webRTC rtmp hls rtsp ffplay srs↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓ 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

三种方法使用FFmpeg截取视频片断 的相关文章

  • 在 Android 中处理多个回收器视图 [Kotlin]

    我遇到过这样的情况 一个布局上有 3 个 RecyclerView 他们以某种方式相互依赖 数据来自房间数据库 问题原型 问题陈述 假设您有类似 Floor1 Floor2 Floor3 等 的楼层 并且每个楼层内都有类似 Room1 Ro
  • Sense 手机上的 Android 应用程序主题

    我在有关感应手机上的应用程序的 UI 项目上遇到了障碍 我无法在谷歌或SO上制作搜索查询来找到我所追求的任何参考 有没有办法让我的应用程序主题的 UI 样式与手机当前应用的样式相匹配 我基本上追求不同 UI 小部件 复选框 微调器 按钮等
  • JavaScript接口注入漏洞修复

    我收到了来自 Google Play 管理中心的警告 提示我这一页 https support google com faqs answer 9095419因为我在我的应用程序中使用了 JavaScript 接口 并建议两个选项来解决该问题
  • LiveData无法观察到变化

    我正在更新一个ViewModel 中 DialogFragment 的 LiveData 值 但无法获取Fragment中的值 视图模型 class OtpViewModel private val otpUseCase OtpUseCas
  • 允许我的应用程序用户从单个帐户发布推文

    我有一个小应用程序 可以显示我的小国家 比利时的公共交通交通问题 例如 我在应用程序中创建了一个系统 允许用户在火车延误时警告所有人 我想做的是允许我信任的用户从我的帐户发布类似 用户 X 说 123456 号列车晚点 3 分钟 之类的推文
  • 如何在android中动态添加项目到listview

    有谁能够帮助我 我正在尝试在 Android 中创建一个 ListView 并且我正在尝试使用代码 不使用 XML 将项目加载到其中 这是我到目前为止的代码 tweetList ListView this findViewById R id
  • 如何在列表视图中每行右侧显示 4 个图标

    我想在列表视图的每一行右侧设置 3 个图标 我正在制作购物应用程序 我希望在列表视图中用户选择任何产品时 这样他 她可以以 3 种方式查看产品 就像用户选择图标一样1 这样用户可以在网格视图中看到产品 如果用户选择图标 2 这样用户可以在图
  • Android 谷歌地图圆圈平滑改变半径

    我想控制按进度条循环 但是谷歌地图APIsetRadius变化并不顺利 如何平滑改变圆半径 这是我的源代码 private Circle circle public void onMapReady final GoogleMap googl
  • 使用 Android 浏览器的 HTML5 离线存储

    我正在研究如何使用 Android 设备来创建需要离线使用的网站 我还没有找到很多关于Android浏览器如何处理HTML5的localStorage和WebSQL的信息 有人知道这些的尺寸限制吗 它们是否可以更改 我知道移动 Safari
  • 为什么找不到ImageView类?

    当我转到图形布局时 我在创建第一个 Android 应用程序 pdf Android Application Development for For Dummies 中的静默切换模式 时遇到了麻烦 在 main xml 文件中插入了 Ima
  • 在 Android 10 上使用 RNFetchBlob 的下载管理器 React Native 下载文件

    我需要使用 React Native 应用程序将文件下载到用户的下载目录rn 获取 blob https www npmjs com package rn fetch blob 但似乎与 Android 10 不兼容 因为我收到错误 首先我
  • 无法加载(查找)j2v8_android_x86 库

    我有一个使用的 gradle 项目j2v8 android 2 2 1 http mvnrepository com artifact com eclipsesource j2v8 j2v8 android 2 2 1库 为 V8 JS 引
  • 带 Retrofit 的简单登录表单

    我开始使用 Retrofit 但我坚持这个简单的步骤 我有一个登录表单 我正在尝试通过服务器进行身份验证 但我无法发送请求 这是我尝试过的 我的改造客户 private static OkHttpClient Builder httpCli
  • 来自公共字符串的 Android RSA 加密

    我正在开发一个 Android 应用程序 我希望用户能够使用其他人的公钥加密消息 系统将生成公钥 私钥对 然后可以将消息秘密发送给其他用户 我正在创建一个加密类 它将处理消息的加密 解密 不幸的是我遇到了一些问题 在这种方法中 我想传递用户
  • 如何在Fragment之间传递数据?

    对于所有那些投反对票并投票决定关闭这个问题的人 认为它与 textview 的范围有关 然后看看 它与 textview 的范围无关 无法在片段之间传递数据 应用程序崩溃 我不知道我做错了什么 我点击了此链接http manishkpr w
  • setShadowLayer Android API 差异

    我为我的应用程序开发了一个自定义视图组件 并且正在努力向圆圈添加阴影 这是我的类扩展 View 的代码 public class ChartView extends View public ChartView Context context
  • ExpandableListView 和复选框

    我正在 Android 中编写简单的过滤器并想使用ExpandableListAdapter与复选框 我创建列表或检查复选框没有问题 但我真的不知道如何记住选择 关闭组并再次打开后或当我尝试打开不同的组时 复选框会发生变化 我尝试在网上阅读
  • 我想分享带有单个标题的多张图片

    我想分享带有单个标题的多张图片 该标题显示在一张图像上而不是所有图像上 但标题会显示在一次共享的每张照片上 这是我的代码 private void pic with data Intent shareIntent new Intent sh
  • 在所有布局方法之后调用哪个 Activity 方法?

    我需要做一些事情Activity调用所有布局方法后 所有Views 已就位并且Activity已准备好显示 哪种方法可以做到这一点 如果你想获得视图的宽度或其他东西 这应该有效 将其添加到您的 Activity 的 onCreate 中 V
  • Android 列表视图布局 类似于 Google play

    我想实现一个类似于 Google Play 的列表布局 其中每个行都有菜单 请帮助我创建这个 我是否需要创建一个弹出菜单或者有任何选项可以实现此目的 Thanks 看起来您正在尝试完全按照图中所示的方式进行操作 我只是举一个例子来说明我如何

随机推荐

  • Android Arouter 框架子类Autowired 报错的问题解决

    对于子类继承父类 父类再继承BaseActivity BaseActivity中使用inject 方法的情况下 需要在父类中写入 Autowired open lateinit var hardware HardWare 在子类中写入 Au
  • 两个小案例

    今天收获了两个小案例 其实对工作都很有启发 把案例和心得在这里记录下来 希望对别人也有帮助 案例1 测试人员在测试系统发现在系统A和系统B之间通过总线通讯 偶尔会出现timeout现象 反馈开发后 开发难以重现 根据简要分析后 认为是测试系
  • Eclipse的中文字体很小

    1 Preferences General Appearance Colors and Font 2 在右侧界面中选择 Basic 展开 找到 Text Font 双击打开 3 设置字体为 Courier New 即可
  • ORAN专题系列-22:O-RU全球前20的主要供应商调研报告

    目录 第1章 O RU新家族概述 第2章 O RU设备供应商详解 2 1 中国 大陆 香港 台湾 2 2 欧洲 2 3 印度 2 4 日本 2 5 韩国 2 6 美国 英国 第1章 O RU新家族概述 可以这样说 O RAN变化最大之一就是
  • 从caffe中新增layer(cpp版本)

    在caffe 中增加一个什么都不做的layer 不考虑forward backward算法 只考虑打通流程 英文教程 https github com BVLC caffe wiki Development developing new l
  • 【工业视觉-CCD相机和CMOS相机成像的本质区别】

    工业视觉 CCD相机和CMOS相机成像的本质区别 1 CCD的功耗高 CMOS的功耗低 2 CCD速度较CMOS慢 3 CCD的画质优于CMOS 4 CCD的高感画质低于CMOS 在学习工业视觉的起初 一般都是先去了解光源 镜头 相机等概念
  • 肿瘤诊断(PAT)

    题目链接 https www patest cn contests gplt L3 004 一道很裸的bfs 一开始以为会超时 抱着试一试的心态交了一发竟然过了 include
  • 华为手机上的网上邻居怎么用_华为手机上的网上邻居怎么用_HUAWEI Mate 8 网络邻居 使用教程...

    本帖最后由 爱奔跑的蜗牛 于 2016 1 19 23 54 编辑 有根数据线 手机连接电脑传输管理文件算不上什么秘密 但总有那么一两天 忘记带数据线 又急需拷贝电脑文件到手机上 除了问别人借数据线 难道就不能 自力更生 了吗 当然不是 拥
  • 1033 旧键盘打字 (20 分)*输入有可能是空串

    旧键盘上坏了几个键 于是在敲一段文字的时候 对应的字符就不会出现 现在给出应该输入的一段文字 以及坏掉的那些键 打出的结果文字会是怎样 输入格式 输入在 2 行中分别给出坏掉的那些键 以及应该输入的文字 其中对应英文字母的坏键以大写给出 每
  • FreeRTOS操作系统理论知识笔记(全网最详细的亲笔手写的理论知识!我敢保证,你一定会懂!)(持续更新)

    目录 零 ARM架构与C语言汇编指令 1 ARM架构 2 汇编指令 一 什么是FreeRTOS 为什么要学它 1 第一个问题的回答 2 第二个问题的回答 二 RTOS的任务是什么 RTOS怎么实现多任务的管理 1 第一个问题的回答 gt 分
  • HIVE SQL 进行 Join 和 group by的具体原理及分区方式

    HIVE SQL 实现Join和group by 具体原理 1 JOIN 在map的输出value中为不同表的数据打上tag标记 在reduce阶段根据tag判断数据来源 MapReduce的过程如下 2 GROUP BY HIVE SQL
  • JDBC使用TNS连接多节点Oracle

    JDBC使用TNS连接多节点Oracle 为了使用tns方式连接 只需要写出tns连接的rul即可 tns连接的url写法如下 未加注释的TNS连接串 jdbc oracle thin description ADDRESS LIST ad
  • webpack高级应用篇(九):tree shaking(usedExports) 与 sideEffects

    目录 tree shaking usedExports tree shaking 前 tree shaking 后 sideEffects 副作用 解释 tree shaking 和 sideEffects 结论 tree shaking
  • html制作精美导航栏

    文章目录 一 效果展示 二 实现步骤 1 html 2 css 3 js 一 效果展示 二 实现步骤 1 html 代码如下 示例 div class navcontainer div
  • intellij idea Entity类报错“Cannot resolve table”

    intellij idea 报如下图的错 解决方法如下 1 点击菜单 view gt Tool Windows gt Persistence 2 右击项目 选择Assign Data Source 3 Data Source 选择数据库
  • MATLAB实现BO-CNN-GRU贝叶斯优化卷积门控循环单元多输入分类预测

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 matlab项目合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 更多Matlab仿真内容点击 智能优化算法 神经网络预测 雷达通信 无线传感器 电力系统 信号
  • Linux常识型试题

    http www linuxdiyf com viewarticle php id 202718 一 填空题 1 链接分为 和 2 安装Linux系统对硬盘分区时 必须有两种分区类型 和 3 内核分为进程管理系统 I O管理系统和 等四个子
  • anki插件【Enhance main window】配置

    book symbol cap value null color empty red color empty descendant green color zero false columns absolute true color be3
  • TCP/IP三次握手

    序列号seq 占4个字节 用来标记数据段的顺序 TCP把连接中发送的所有数据字节都编上一个序号 第一个字节的编号由本地随机产生 给字节编上序号后 就给每一个报文段指派一个序号 序列号seq就是这个报文段中的第一个字节的数据编号 确认号ack
  • 三种方法使用FFmpeg截取视频片断

    如何以 3 种简单的方式使用 FFmpeg 剪切视频 提取 修剪 2020 年 10 月 12 日 Krishna Rao Vijayanagar FFmpeg 在本教程中 我们将了解如何使用 FFmpeg 以 3 种不同的方式剪切 修剪