ffmpeg裁剪合并视频

标签: 多媒体技术 | 发表时间:2012-07-06 16:23 | 作者:macaque1101
出处:http://hi.baidu.com/injava

这里裁剪是指时间轴裁剪,不是空间裁剪。

 

比如说,你想把视频的从一分20秒开始,30秒的视频裁剪出来,保存成一个视频。这是这个文章要讨论的问题。

 

一  裁剪视频

 

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 合并 视频] 推荐:

ffmpeg裁剪合并视频

- - inJava
这里裁剪是指时间轴裁剪,不是空间裁剪. 比如说,你想把视频的从一分20秒开始,30秒的视频裁剪出来,保存成一个视频. ffmpeg提供简单的命令参数:. -ss 开始时间,如: 00:00:20,表示从20秒开始;. -t 时长,如: 00:00:10,表示截取10秒长的视频;. -i 输入,后面是空格,紧跟着就是输入视频文件;.

使用ffmpeg合并视频文件的三种方法

- - biAji HeRe
ffmpeg合并视频的方法有三种. 其实在ffmpeg的 FAQ文档中有比较详细的说明. 使用concat协议进行视频文件的合并. 这种方式的适用场景是:视频容器是MPEG-1, MPEG-2 PS或DV等可以直接进行合并的. 换句话说,其实可以直接用cat或者copy之类的命令来对视频直接进行合并.

ffmpeg 视频转码例子集合

- - 开源软件 - ITeye博客
-muxrate 复用码率,设置之后整体码率模式才是CBR. -c:v mpeg2video MPEG2视频编码. -flags ildct+ilme 隔行扫描. -top 隔行扫描前场/后场优先模式 ,1是前场(顶场),0是后场(底场). -streamid 设置视频、音频PID,0视频,1音频.

如何用FFMpeg生成视频

- - 掘金 后端
FFMpeg读做“FF Mpeg”, “FF”指的是 “Fast Forward”,而“Mpeg”指的是 Moving Picture Experts Group(动态图像专家组). 根据官方介绍,FFMpeg是一个完整的、跨平台的音频和视频录制、转换和流媒体解决方案. 简单来说,只要涉及 音视频开发,基本绕不开这个工具.

ffmpeg 录制udp电视信号,视频文件

- - 开源软件 - ITeye博客
ffmpeg -i udp://@:6980  -map 0:p:254  -acodec copy -vcodec copy -sameq  254.ts -map 0:p:255  -acodec copy -vcodec copy -sameq   255.ts  -map 0:0 -map 0:0.

[原]FFmpeg续篇:截取视频片段转成GIF动画

- - 呦呦鹿鸣
前段时间写过 一篇文章,介绍了FFmpeg的几个常用的命令行. 最近,项目里需要做一个把视频片段转成GIF动画的功能,便于用户分享到微博. 惊奇地发现,原来强大的FFmpeg是支持的. 可以简单地执行下面的命令行:. 意思是:将D:\Media目录下的源文件bear.wmv,从第25秒的位置开始,截取10秒长度的视频转成GIF文件,保存为D:\a.gif.

视频直播方案(nginx-rtmp-module ffmpeg) - Andrew's BlogAndrew's Blog

- -
视频直播方案(nginx-rtmp-module ffmpeg). 本文将介绍如何从零搭建流媒体服务器作为直播方案. 一般视频录像板或者网络摄像头仅支持RTSP服务,或自己的私有协议. 因为RTSP是基于TCP的协议一般浏览器是无法支持创建Socket与其他服务相连前端无法播放. 私有协议仅能在IE浏览器下调用OCX插件播放视频,兼容性太差.

利用ffmpeg和SDL实现一个跨android版本的音视频播放器

- - ITeye博客
绝对原创:转载请注明出处. 1:从 http://www.libsdl.org/tmp/下载SDL for android 版本(我下载的是 SDL-1.3.tar.gz ). 2:从 https://github.com/havlenapetr/FFMpeg下载 havlenapetr 的ffmpeg for android版本.

采用FFmpeg从视频中提取音频(声音)保存为mp3文件

- - 行业应用 - ITeye博客
采用FFmpeg从视频中提取音频(声音)保存为mp3文件. 采用FFmpeg从视频中提取音频(声音)保存为mp3文件. 作者:雨水,日期:2016年1月9日 CSDN博客:http://blog.csdn.net/gobitan. 摘要:看到好的视频文件,如果想把其中的音频(声音)提取出来. 网络上肯定有不少类似工具,但作为技术人员提到音视频处理,肯定会想到FFmpeg.

OpenAI Whisper + FFmpeg + TTS:动态实现跨语言视频音频翻译 - 掘金

- -
本文作者系360奇舞团前端开发工程师. 本文介绍了如何结合 OpenAI Whisper、FFmpeg 和 TTS(Text-to-Speech)技术,以实现将视频翻译为其他语言并更换声音的过程. 我们将探讨如何使用 OpenAI Whisper 进行语音识别和翻译,然后使用 FFmpeg 提取视频音轨和处理视频,最后使用 TTS 技术生成新的语音并替换原视频的音轨.