利用FFmpeg进行视频文件进行分割

2023-10-30


利用FFMPEG命令进行文件分割

ffmpeg -ss 00:00:00 -i input.mp4 -c copy -t 60 output.mp4

-ss 表示视频分割的起始时间,-t 表示分割时长,同时也可以用 00:01:00表示

注意 :-ss 要放在 -i 之前

对于普通的视频分割这个命令可能够用了

但是

如果你想要连续风格一段视频,简单的使用此命令就会发现一个问题:连续分割的视频之间存在细微的交集

原因:

视频的开始都是一个关键帧,如果视频的第一帧不是关键帧就会导致视频播放的前面简短画面模糊不清,所以为了让视频不会出现开始画面模糊的情况,就会从所开始时间定位到其对应帧,如果该帧不是关键帧,则在其位置附近找关键帧的位置,然后从该关键帧处开始复制视频帧。

  • 根据起始时间定位到的帧不是关键帧,而是位于两个关键帧中间的B帧或P帧上,那么是从前一个关键帧开始还是后一个关键帧开始呢?

  • 截至时间定位的帧同样可能处于非关键帧处,这时候不一定要向两边找关键帧?

这时候起始帧如果找前面的关键帧作为起始帧开始复制,就会导致本段视频的和前面视频有重复帧:重复帧数为起始关键帧和上一段截至帧之间的帧数。

如果起始帧找后面的关键帧开始复制,就会导致两段连续分割的视频可能出现跳帧现象


利用ffmpeg提供的库自己实现不重复不跳帧分割


利用上述分析,我们在分割的时候自己统一设置分割视频的截止帧为截止时间对应帧(假设此帧为非关键帧,否则为此帧的前一帧)附近前面关键帧的前一帧,而下一段分割视频就从该关键帧开始。

关键代码

视频头信息设置

    AVOutputFormat *ofmt = NULL;
    int ret;
    ofmt = ofmtCtx->oformat;
    for (int i = 0; i < ifmtCtx->nb_streams; i++) {

        //根据输入流创建输出流
        AVStream *in_stream = ifmtCtx->streams[i];

        AVStream *out_stream = avformat_new_stream(ofmtCtx, in_stream->codec->codec);
        if (!out_stream) {
            return false;
        }
        //复制AVCodecContext的设置
        ret = avcodec_copy_context(out_stream->codec, in_stream->codec);
        if (ret < 0) {
            return false;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

利用FFmpeg进行视频文件进行分割 的相关文章

  • C# 静态类型不能用作参数

    public static void SendEmail String from String To String Subject String HTML String AttachmentPath null String Attachme
  • C# 中一次性对象克隆会导致内存泄漏吗?

    检查这个代码 class someclass IDisposable private Bitmap imageObject public void ImageCrop int X int Y int W int H imageObject
  • 2个对象,完全相同(除了命名空间)c#

    我正在使用第三方的一组网络服务 但遇到了一个小障碍 在我手动创建将每个属性从源复制到目标的方法之前 我想我应该在这里寻求更好的解决方案 我有 2 个对象 一个是 Customer CustomerParty 类型 另一个是 Appointm
  • 如何修复错误:“检测到无法访问的代码”

    我有以下代码 private string GetAnswer private int CountLeapYears DateTime startDate return count String answer GetAnswer Respo
  • 混合模型优先和代码优先

    我们使用模型优先方法创建了一个 Web 应用程序 一名新开发人员进入该项目 并使用代码优先方法 使用数据库文件 创建了一个新的自定义模型 这 这是代码第一个数据库上下文 namespace WVITDB DAL public class D
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • 用于在标头更改时重新编译的简单 C 项目的示例 makefile

    有谁有完整的 makefile 可以执行以下操作 如果 HEADER 文件发生更改 则重建项目 cpp 文件在 makefile 中列出 头文件未在 makefile 中列出 头文件允许与 cpp 文件具有不同的名称 部分cpp文件没有头文
  • Linux 上的 RTLD_LOCAL 和dynamic_cast

    我们有一个由应用程序中的一些共享库构成的插件 我们需要在应用程序运行时更新它 出于性能原因 我们在卸载旧插件之前加载并开始使用新插件 并且只有当所有线程都使用旧插件完成后 我们才卸载它 由于新插件和旧插件的库具有相同的符号 我们dlopen
  • 来自嵌入图像的 BitmapSource

    我的目标是在 WPF 窗口上重写 OnRender 方法中绘制图像 someImage png 它是嵌入资源 protected override void OnRender System Windows Media DrawingCont
  • 条件类型定义

    如果我有一小段这样的代码 template
  • C# 获取数据表中所有重复行的计数

    我通过运行存储过程来填充数据集 并且从数据集中填充数据表 DataSet RawDataSet DataAccessHelper RunProcedure storedprocedureName this will just return
  • 让网络摄像头在 OpenCV 中工作

    我正在尝试让我的网络摄像头在 Windows 7 64 位中的 OpenCV 版本 2 2 中捕获视频 但是 我遇到了一些困难 OpenCV 附带的示例二进制文件都无法检测到我的网络摄像头 最近我发现这篇文章表明答案在于重新编译一个文件 o
  • 读取依赖步行者输出

    I am having some problems using one of the Dlls in my application and I ran dependency walker on it i am not sure how to
  • C:设置变量范围内所有位的最有效方法

    让我们来int举个例子 int SetBitWithinRange const unsigned from const unsigned to To be implemented SetBitWithinRange应该返回一个int其中所有
  • 如何编写一个接受 int 或 float 的 C 函数?

    我想用 C 语言创建一个扩展 Python 的函数 该函数可以接受 float 或 int 类型的输入 所以基本上 我想要f 5 and f 5 5 成为可接受的输入 我认为我不能使用if PyArg ParseTuple args i v
  • 在 C# 的 WebAPI 中的 ApiController 上使用“传输编码:分块”提供数据

    我需要服务分块传输使用编码数据API控制器 因为我无权访问HttpContext or the Http请求 我有点不知道在哪里写入响应以及在哪里刷新它 设置如下 public class MyController ApiControlle
  • winform c# 中的弹出窗口

    我正在开发一个需要弹出窗口的项目 但问题是我还希望能够通过表单设计器在此弹出窗口中添加文本框等 所以基本上我有一个按钮 当您单击它时 它将打开我在表单设计器中设计的另一个窗口 我一直在谷歌搜索 但还没有找到我需要的东西 所以我希望你们能帮助
  • .Net Reactive Extensions Framework (Rx) 是否考虑拓扑顺序?

    Net 反应式扩展框架是否按拓扑顺序传播通知以最大限度地减少更新量 就像 Scala Rx 所做的那样 Net 反应式扩展 Rx 是否可以 https github com lihaoyi scala rx wiki How it Work
  • 从后面的代码添加外部 css 文件

    我有一个 CSS 文件 例如 SomeStyle css 我是否可以将此样式表文档从其代码隐藏应用到 aspx 页面 您可以将文字控件添加到标头控件中 Page Header Controls Add new System Web UI L
  • ContentDialog Windows 10 Mobile XAML - 全屏 - 填充

    我在项目中放置了一个 ContentDialog 用于 Windows 10 上的登录弹出窗口 当我在移动设备上运行此项目时 ContentDialog 未全屏显示 并且该元素周围有最小的填充 在键盘上可见 例如在焦点元素文本框上 键盘和内

随机推荐

  • unity3d鼠标移动、旋转物体

    为了从不同角度观察物体 需要使用鼠标改变物体的位置及角度 在unity3d中Input GetMouseButton 获得鼠标键 Input GetAxis 函数获得鼠标的移动的方向和距离 其中Mouse X表示X方向 Mouse Y表示Y
  • Java 一个简单的线程定时 (守护线程)

    守护线程也叫精灵线程 当程序只剩下守护线程的时候 程序就会退出 守护线程的作用类似在后台静默执行 比如JVM的垃圾回收机制 应用场景 实例化socket连接时需要判断连接成功与否 一般来说 如果连接成功就是片刻的事 如果不成功的话jvm会判
  • python如何读取文件夹下的子文件夹

    import os 创建文件夹 def mkdir path if os path exists path False os mkdir path else pass 根目录 root path C Users man wang Deskt
  • Js(一)Error [ERR_MODULE_NOT_FOUND]: Cannot find package ‘uuid‘ imported

    前言 本章主要讲述js报错之 Error ERR MODULE NOT FOUND Cannot find package uuid imported from xxx的解决 一 问题描述 问题 顾名思义 根据错误信息翻译 该文件路径下找不
  • 【华为OD机试真题 JS】贪吃蛇

    标题 贪吃蛇 时间限制 1秒 内存限制 262144K 语言限制 不限 贪吃蛇是一个经典游戏 蛇的身体由若干方格连接而成 身体随蛇头移动 蛇头触碰到食物时 蛇的长度会增加一格 蛇头和身体的任一方格或者游戏版图边界碰撞时 游戏结束 下面让我们
  • 一个java源文件中只能有一个public类

    java文件只有一个public类 1 每个编译单元 文件 只能有一个public 类 这么做的意思是 每个编译单元只能有一个公开的接口 而这个接口就由其public 类来表示 2 java程序的入口是main方法 所以被定为public的
  • Spring Cloud Sleuth 2.0概要使用说明

    Sleuth Zipkin和Brave 先说一下Spring Cloud Sleuth Zipkin和Brave三者之间的关系 首先 对于Spring Cloud Sleuth来说 大家或许接触的比较多 它是Spring框架家族 在这里为什
  • maven可执行jar及加载文件

    1 使用maven assembly plugin插件打包 1 1 代码 地址 https gitee com xixingzhe2 learn tree master jar exe test demo pom xml
  • CommonJS, AMD 和 RequireJS之间的关系(转载)

    先说说CommonJS CommonJS 大家是不是觉得JavaScript仅仅是一个客户端的编译语言 其实JavaScript设计之初不仅仅是针对客户端设计的语言 后来只是由于Web的迅速流行 加之Netscape和微软之间之争过早的将J
  • 每年等额本金,计算复利的方法

    最近正在学理财 就顺手写了个复利的计算方法 小记一下 public class CompoundInterestCalculation public static void main String args 计算公式V P 1 i 1 i
  • springmvc+mybatis+maven项目框架搭建

    项目的目录 1 配置web xml
  • Unity游戏开发之游戏动画(Unity动画系统)

    文章目录 Unity动画系统 动画片段 Animation Clip 在Unity中制作动画 动画复用 替身系统 Avatar Animator 组件 Animator Component 动画状态机 Animator Controller
  • vue axios 上传文件 xhr.addEventListener is not a function(…) 问题修复 不用卸载 mockjs

    vue axios 上传文件 xhr addEventListener is not a function 问题修复 不用卸载 mockjs 无法上传的原因是因为 mockjs 将 axios请求 的 XhrRequest 修改成了Mock
  • 解决”/bin/rm: Argument list too long”删除文件错误

    执行rm后出现 bin rm Argument list too long 报错 应该是目录中的文件太多 处理时间太长导致的 ls xargs n 10000 rm rf 通过xargs命令 将文件10个分成一组 然后分批删除 这样就不会出
  • 5.3 分布式 Git - 维护项目

    5 3 分布式 Git 维护项目 版本说明 版本 作者 日期 备注 0 1 loon 2019 3 28 初稿 目录 文章目录 5 3 分布式 Git 维护项目 版本说明 目录 维护项目 1 在特性分支中工作 2 应用来自邮件的补丁 3 使
  • 字节跳动视频编解码面经

    引言 本文主要是记录一下面试字节跳动的经历 三四月份投了字节跳动的实习 图形图像岗位 然后hr打电话过来问了一下会不会opengl c shador 当时只会一点c 其他两个都不会 也就直接被拒了 七月初内推了字节跳动的提前批 因为内推没有
  • MybatisPlus中的的BaseMapper接口的认识

    接上一篇博客 还是在接手别人的代码的时候 看到了如下的代码 当时自己只是查询了以下wrapper构造器的用法 这里其实还有一个MybatisPlus中的BaseMapper接口的用法 上面这句代码的意思其实就相当于 SELECT COUNT
  • Spring boot+Vue3博客平台:文章发布与编辑功能的技术实现

    本文将详细介绍如何实现一个博客平台中的文章发布与编辑功能 包括前端的Vue组件设计和后端的Spring Boot接口实现 在阅读本文后 您将了解如何设计和实现高效 易用的文章发布与编辑功能 一 发布文章 设计思路 在设计文章发布功能时 我们
  • 【Python脚本进阶】1.2、python脚本基础知识(中)

    目录 一 异常处理 1 1 简介 1 2 示例 二 函数 2 1 简介 2 2 示例1 2 3 示例2 三 迭代 3 1 简介 3 2 示例1 3 3 示例2 3 4 示例3 3 5 示例4 我所用为python3 pycharm 一 异常
  • 利用FFmpeg进行视频文件进行分割

    利用FFMPEG命令进行文件分割 ffmpeg ss 00 00 00 i input mp4 c copy t 60 output mp4 ss 表示视频分割的起始时间 t 表示分割时长 同时也可以用 00 01 00表示 注意 ss 要