ffmpeg裁剪合并视频

 

ffmpeg提供简单的命令参数:

ffmpeg -ss START -t DURATION -i INPUT -vcodec copy -acodec copy OUTPUT

对上面的命令稍做个解释。

-ss 开始时间,如: 00:00:20,表示从20秒开始;

-t 时长,如: 00:00:10,表示截取10秒长的视频;

-i 输入,后面是空格,紧跟着就是输入视频文件;

-vcodec copy 和 -acodec copy表示所要使用的视频和音频的编码格式,这里指定为copy表示原样拷贝;

INPUT,输入视频文件;

OUTPUT,输出视频文件;

比如:

ffmpeg -ss 00:00:20 -t 00:00:10 -i D:/MyVideo.mpg -vcodec copy -acopy copy D:/Split.mpg

这个命令就是从20秒开始裁剪到20+10=30秒结束,总共10秒的视频。这个命令执行很快,因为只是原始数据的拷贝,中间没有什么编码和解码的过程。

执行这个命令后你能得到Split.mpg这个输出文件。你可以用视频播放软件播放这个视频看看。可能有些视频裁剪后的效果,如期望一致,20秒开始,30秒结束,总共10秒的视频,但是有些视频裁剪后你会发现可能开始和结束都不是很准确,有可能是从18秒开始,33秒结束。这是为什么呢?

因为这些视频里20秒和30秒处地方刚好不是关键帧,而ffmpeg会在你输入的这两个时间点附近圆整到最接近的关键帧处,然后做接下来的事情。如果你不懂什么是关键帧,没关系,这也不影响你使用这个命令。

如果你的要求能够接受几秒的误差,那么这个命令完全就可以满足你的需要,接下来的内容你也没有必要往下看了。

但是在我项目里要求很严格,一定要到确定的时间。所以要用另外一种方式。

上面的造成那样的原因是所选的时间不是关键帧,那如果我们将输入的视频先转换成所有的帧都为关键帧的视频,其实就是将所有的帧的编码方式转为帧内编码(不理解帧内编码也没关系,你就当没看见它,接着往下看),这个问题就有解了。ffmpeg也可以帮我们完成这个事情。

ffmpeg -i INPUT -sameq -intra OUTPUT

-i 输入,后面是空格,紧跟着就是输入视频文件;

INPUT 输入文件;

-sameq 表示保持同样的视频质量;

-intra, 帧内编码;

OUTPUT 输出文件名。

如:

ffmpeg -i D:/MyVideo.mpg -sameq -intra D:/temp.mpg

这个命令的结果文件就是D:/temp.mpg.这个文件的视频和D:/MyVideo.mpg是一样的,但是你会发现这个文件会比D:/MyVideo.mpg大很多倍,原因就是转换前一般采用的帧间编码,转换后变成了帧内编码。这里我们说是一般,原因是有些视频文件本身就采用了帧内编码。

接下来我们就开始裁剪。

ffmpeg -ss START -vsync 0 -t DURATION -i INPUT -vcodec VIDEOCODEC-acodec AUDIOCODEC OUTPUT

-ss 开始时间,如: 00:00:20,表示从20秒开始;

-t 时长,如: 00:00:10,表示截取10秒长的视频;

-i 输入,后面是空格,紧跟着就是输入视频文件;

-vcodec 视频的编码格表示所要使用的视频式;

-acodec 音频的编码格表示所要使用的视频式;

INPUT,输入视频文件;

OUTPUT,输出视频文件;

如:

ffmpeg -ss 00:00:30 -vsync 0 -t 00:00:30 -i D:/temp.mpg -vcodec libx264-acodec libfaac D:/result.mpg

这里音频和视频分别采用了aac和h264.

这样就得到了我们最终想要的结果。

二 合并视频

上面我们可以将一个视频中感兴趣的部分裁剪出来,比如我们裁剪出3段视频,而裁剪出来的视频,我们不想它是一个一个的,而是一整个。总的需求就是给定一个视频,用户可以挑选出自己喜欢的一些时间段,然后开始裁剪,最后得到那些挑选的时间段组成的视频。

要完成这个任务,有了前面我们裁剪视频的基础就好办多了,利用前面的方法将各个感兴趣的视频裁剪出了,这样得到多个小视频,然后再用下面的方法就可以实现:

现在这里声明一下,下面红色的部分是我早之前的版本,是错误,因此误导了大家,非常的抱歉。

所以直接忽略红色的部分,看后面的内容

【合并成一个完整的视频:

ffmpeg -i INPUT1 -i INPUT2 -f FORMAT -acodec AUDIOCODEC -vcodec VIDEOCODEC -sameq OUTPUT

这里的几乎所有用到的参数已经在上面做过解释,除了-f.

-f FORMAT, 表示视频的格式。如-f MP4, 那么我们的视频格式就是MP4。

另外,你几个想要的合并的视频就加入几个-i [Input file], 例如下面我有2个视频要合并.

ffmpeg -i D:/MyVideo1.avi -i D:/MyVideo2.avi -f mp4 -acodec libfaac -vcodec libx264 -sameq D:/Result.avi

这里的Result.avi, 你也可以改成是Result.mp4, 也没有问题。

如果你发现执行完上面的命令后,结果视频(result.avi)不是2个视频的合并,可能是前面你合并视频的时候2个视频的格式不一致导致,或者你所使用ffmpeg的版本有这个bug,你可以换下面的方法再尝试。

1. 将要合并的视频先转换成统一的格式,包括编码格式,帧率,尺寸。

ffmpeg -i [input] -f mpeg -r 25 [out]

2. 让后用copy或者cat命令合并。】

1. 首先将各个视频全部转换为mpeg格式:

ffmpeg  -i INPUT -f mpeg  OUTPUT

例如:

ffmpeg  -i D:/temp1.avi -f mpeg  D:/result1.mpg

ffmpeg  -i D:/temp2.mp4 -f mpeg  D:/result2.mpg

2. 通过copy或者cat命令合并视频

copy -b INPUT+INPUT OUTPUT

例如:

copy /b "D:/result1.mpg"+"D:/result1.mpg" "D:/result.mpge"

3. 将合并的视频进行编码生成最终的结果视频

ffmpeg -i INPUT -f FORMAT OUTPUT

例如:

ffmpeg -i "D:/result.mpge" -f mp4 "D:/result.mp4"

ffmpeg剪视频的更多相关文章

  1. ffmpeg为视频添加时间戳 - 手动编译ffmpeg

    FFMPEG给视频加时间戳水印 项目中需要给视频添加时间戳,理所当然最好用的办法是ffmpeg.在找到正确的做法前,还被网上的答案timecode给水了一下(水的不轻,在这里转了2天),大概是这样写的 ...

  2. 利用FFmpeg生成视频缩略图 2.1.6

    利用FFmpeg生成视频缩略图 1.下载FFmpeg文件包,解压包里的\bin\下的文件解压到 D:\ffmpeg\ 目录下. 下载地址 http://ffmpeg.zeranoe.com/build ...

  3. C# 利用ffmpeg 对视频转换系类操作 (1) 基本分析

    最近公司做一个项目,开发一个视频站点.项目需求中有很多视频转换的需求,如:格式转换(flv,Mp4),视频水印,视频截图,视频合成,获取视频的基本信息(时间戳,视频大小等).经过网络的收集资料以及自己 ...

  4. 使用ffmpeg 对视频截图,和视频转换格式

    //执行CMD命令方法 public static void CmdProcess(string command)//调用CMD        {            //实例化一个进程类      ...

  5. NET 2.0(C#)调用ffmpeg处理视频的方法

    另外:ffmpeg的net封装库 http://www.intuitive.sk/fflib/ NET 2.0 调用FFMPEG,并异步读取输出信息的代码...public void ConvertV ...

  6. C#使用FFmpeg 将视频格式转换成Gif图片示例

    根据EFmpeg封装的视频转换gif工具:https://my.oschina.net/tianma3798/blog/825317 一.本次使用参数说明 /* * 参数说明: * -i 源文件位置 ...

  7. 使用FFMPeg对视频进行处理

    FFMPeg处理视频的核心操作方式是命令,无论是在Windows上还是Linux上.那么下边就简单介绍下,常见的处理命令. 示例1:截取一张352×240尺寸大小的,格式为jpg的图片: ffmpeg ...

  8. python+ffmpeg切割视频

    什么是ffmpeg 1.1 简介 FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件).它提供了录制.转换以及流化音视频的完整解决方案.它包 ...

  9. Java Web 中使用ffmpeg实现视频转码、视频截图

    Java Web 中使用ffmpeg实现视频转码.视频截图 转载自:[ http://www.cnblogs.com/dennisit/archive/2013/02/16/2913287.html  ...

随机推荐

  1. 20210716考试-NOIP19

    u,v,w. 这场考过. T1 u 差分裸题 #include<bits/stdc++.h> using namespace std; const int N=5000; int n,m; ...

  2. golang sync.noCopy 类型 —— 初探 copylocks 与 empty struct

    问题引入 学习golang(v1.16)的 WaitGroup 代码时,看到了一处奇怪的用法,见下方类型定义: type WaitGroup struct { noCopy noCopy ... } ...

  3. 用python的pandas读取excel文件中的数据

    一.读取Excel文件   使用pandas的read_excel()方法,可通过文件路径直接读取.注意到,在一个excel文件中有多个sheet,因此,对excel文件的读取实际上是读取指定文件.并 ...

  4. ldconfig与 /etc/ld.so.conf

    现在我们知道了动态与静态函数库,也知道了当前的Linux大多是将函数库做成动态函数库,下面来讨论增加函数库读取性能的方法.我们知道,内存的访问速度是硬盘的好几倍,所以,如果将常用的动态函数库加载到内存 ...

  5. python-引用/模块

    导入文件,先从当前目录下找,找不到从环境变量中找 1.导入模块,实质是把制定的py文件执行一遍. 自己写的模块:要导入的文件在当前目录下的:form 文件夹.py文件名 import 函数名 标准模块 ...

  6. 328 day07线程池、Lambda表达式

    day07[线程池.Lambda表达式] 主要内容 等待与唤醒案例 线程池 Lambda表达式 教学目标 -[ ] 能够理解线程通信概念 -[ ] 能够理解等待唤醒机制 -[ ] 能够描述Java中线 ...

  7. Java基础系列(39)- 二维数组

    多维数组 多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组. 二维数组 int a[][]=new int[2][5]; 解析:以上二维数组a可以看成一个 ...

  8. python 文件夹扫描

    扫描指定文件夹下的文件.或者匹配指定后缀和前缀的函数. 假设要扫描指定文件夹下的文件,包含子文件夹,调用scan_files("/export/home/test/") 假设要扫描 ...

  9. Fiddler抓HTTPS接口数据,安装证书并不复杂,超详细的图文解说,不信你看!

    @ 目录 前言 安装环境 配置网络 IP 端口 配置网络 浏览器打开下载链接 下载证书 安装证书 证书安装坑 前言 抓包是我测试工作中必须要学会的一个工具,我们都知道,抓取HTTPS接口里需要安装证书 ...

  10. IdentityServer4[2]:启动一个新的IdentityServer项目

    启动一个新的IdentityServer项目 从头开始,从基础开始,然后变得更加复杂,循序渐进的学习 工具:VS2017 15.9.8 .Net Core2.2 基本过程 创建一个新的ASP.NET ...