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

Posted 音视频开发老舅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三种方法使用FFmpeg截取视频片断相关的知识,希望对你有一定的参考价值。

如何以 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↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓ 

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

ffmpeg合并视频的方法有三种。国内大多数仅介绍了其中之一。于是觉得有必要翻译一下。其实在ffmpeg的 FAQ文档中有比较详细的说明。

  1. 使用concat协议进行视频文件的合并

    这种方式的适用场景是:视频容器是MPEG-1, MPEG-2 PS或DV等可以直接进行合并的。换句话说,其实可以直接用cat或者copy之类的命令来对视频直接进行合并。很多文章介绍了这种方法,但适用性却没有提及。这并不是一个通用的方法。典型的命令示例如下:

    ffmpeg -i concat:"intermediate1.mpg|intermediate2.mpg" -c copy intermediate_all.mpg
  2. 使用concat demuxer进行视频文件的合并

    这种合并方式的适用场景是:当容器格式不支持文件层次的合并,而又不想(不需要)进行再编码的操作的时候。这种方式对源视频同样有同格式同性质的要求。其详细语法参见 这里。典型的命令示例如下:

    ffmpeg -f concat -i Cam01.txt -c copy Cam01.mp4

    其中,Cam01.txt 为包含了输入文件的描述文件。

  3. 使用concat滤镜(filter)进行视频文件的合并:

    当需要进行任意程度的重新编解码时,官方推荐使用的方法即是用concat滤镜来进行视频文件的合并处理。详细说明参见 这里。典型命令示例如下:

    ffmpeg -i opening.mkv -i episode.mkv -i ending.mkv -filter_complex   ‘[0:0] [0:1] [0:2] [1:0] [1:1] [1:2] [2:0] [2:1] [2:2]
       concat=n=3:v=1:a=2 [v] [a1] [a2]‘   -map ‘[v]‘ -map ‘[a1]‘ -map ‘[a2]‘ output.mkv

    这段命令目的是将三段双语格式的视频合并至最终的一段视频(output.mkv)。参数n=3说明待合成的视频有三段,v=1说明视频流为一,a=2说明音频流为二。 -map参数的详细说明可以从Filtergraph文档中找到。

以上是关于三种方法使用FFmpeg截取视频片断的主要内容,如果未能解决你的问题,请参考以下文章

php ffmpeg截取视频第一帧保存为图片的方法

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

如何利用ffmpeg将一小段视频截取成图片

如何用ffmpeg截取视频片段&截取时间不准确的坑

FFmpeg-截取视频图片

FFmpeg的使用——PHP转换视频截取视频以及JW Player播放器控制