ffmpeg无损裁剪合并视频

Posted 皮尔斯巴巴罗

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ffmpeg无损裁剪合并视频相关的知识,希望对你有一定的参考价值。

我用的版本是
ffmpeg version git-2020-06-23-ce297b4

官方文档

https://ffmpeg.org/ffmpeg-utils.html#time-duration-syntax
时间格式

[-][HH:]MM:SS[.m...][-]S+[.m...][s|ms|us]

裁剪视频

假设需要裁剪视频aaa.mp4,第5秒到第15秒

ffmpeg -ss 5 -to 15 -i aaa.mp4 -c copy output.mp4

这里要注意参数-ss、-to需要放在-i之前,否则就是另外的意义,而且实际试下来,时间总是有点误差

合并视频

非MPEG容器,但是MPEG编码器(H.264、DivX、XviD、MPEG4、MPEG2、AAC、MP2、MP3 等),先包装进TS容器,再进行合并
例如要将aaa.mp4、bbb.mp4合并成一个视频output.mp4

ffmpeg -i aaa.mp4 -c copy -vbsf h264_mp4toannexb input1.ts
ffmpeg -i bbb.mp4 -c copy -vbsf h264_mp4toannexb input2.ts
ffmpeg -i "concat:input1.ts|input2.ts" -c copy -absf aac_adtstoasc output.mp4

其他视频转码、编辑软件(有损)

HandBrake,单纯转码
https://handbrake.fr/
Shotcut,视频编辑
https://www.shotcut.org/

参考

https://blog.csdn.net/weixin_46021205/article/details/105078552
https://blog.csdn.net/doublefi123/article/details/47276739
https://blog.csdn.net/qq_36292543/article/details/116466013
https://blog.csdn.net/qq_16504067/article/details/114575615

使用 FFmpeg 将 JPEG 图像序列无损合并到网格中

【中文标题】使用 FFmpeg 将 JPEG 图像序列无损合并到网格中【英文标题】:Merge a sequence of JPEG images into a grid losslessly with FFmpeg 【发布时间】:2020-01-19 23:52:50 【问题描述】:

我有一系列图像,它们是较大图像的块,它们共同构成了整个图像。这些块是沿均匀间隔的水平和垂直线分割原始图像的结果,因此它们没有奇怪的尺寸。

有没有办法在不重新编码图像的情况下将它们与 FFmpeg(或 ImageMagick 之类的其他东西)结合起来?

This answer 建议使用hstackvstack FFmpeg 过滤器,但我的图像块不一定是原始图像的全宽或全高。


像这样:

也许这可以通过使用hstackvstack 的多个FFmpeg 命令来实现(不过我更喜欢一个命令)。还是使用复杂的过滤器?


例如


编辑:我尝试将filter_complex 与 FFmpeg 一起使用:

ffmpeg -i 0.jpg -i 1.jpg -i 2.jpg -i 3.jpg -i 4.jpg -i 5.jpg \
-filter_complex "[0][1]hstack=inputs=2[row 0]; \
                 [2][3]hstack=inputs=2[row 1]; 
                 [4][5]hstack=inputs=2[row 2]; 
                 [row 0][row 1][row 2]vstack=inputs=3[out]" \
-map "[out]" -c copy out.jpg

但它不能同时过滤和复制流。

【问题讨论】:

大多数工具会解压缩和重新压缩您的 JPG,因此您会损失一些质量。 ImageMagick 可以使用 convert 和 append 来组合你的网格。但是 ImageMagick 会如上所述解压缩和重新压缩您的 JPG。 我似乎记得 libvips 的工作原理是拆分图像,分别压缩宏块,然后将数据重新合并在一起。您可能会在其源代码中找到一些有用的东西。 libvips.github.io/libvips @Brad 抱歉,libvips 会像 ImageMagick 一样解压缩和重新压缩。 我在 jpegtran 中发现了这个有趣的补丁——它添加了两个 jpg 图像的无损附加:puhuri.iki.fi/src/libjpeg 你也许可以从中解决一些问题。 @jcupitt Lol,就像魔术一样,你在这个线程上停下来。 :-) 是的,我的建议不是他们直接使用 libvips,而是他们看到你是如何在 JPEG 中进行宏块重组的。我的记忆是否正确,因为您分别对每个块进行压缩然后重新组装? 【参考方案1】:

您可以使用 ImageMagick 做到这一点。但是,它将解压缩并重新压缩您的 jpg 文件。你会失去一些品质。

IM 6 的 Unix 语法:

convert \
\( 0.jpg 1.jpg +append \) \
\( 2.jpg 3.jpg +append \) \
\( 4.jpg 5.jpg +append \) \
-append \
mona_lisa.jpg

如果使用 Windows,请从括号中删除 \ 并将行尾替换为 ^。

如果使用 IM 7,请将 convert 替换为 magick。

【讨论】:

+append 是 hstack,而 -append 是 vstack。整洁!【参考方案2】:

我发现了一个有趣的patch from 2010 against libjpeg,它将这个功能添加到jpegtran。它不会拆分块,因此您的图像需要在每个轴上是 8 甚至 16 像素的倍数。

不幸的是,它违反了为 ubuntu10 分发的 libjpeg 6b。这包括来自 8d 的一些补丁,并且与任何官方 libjpeg 版本(据我所知)并不完全对应。

您需要下载 ubuntu10.04 源,解压缩它们的 libjpeg,然后对其进行修补。步骤是:

wget http://old-releases.ubuntu.com/releases/releases/10.04/release/source/ubuntu-10.04-src-1.iso

现在打开该 ISO 并从ubuntu/pool/main/libj/libjpeg6b 中提取文件。存档管理器可以做到这一点,也许还有一些可编写脚本的工具。

现在运行:

# original sources
tar xf libjpeg6b_6b.orig.tar.gz
cd jpeg-6b

# apply ubuntu patches
zcat ../libjpeg6b_6b-15ubuntu1.diff.gz | patch

# apply jpegtran patches
patch < ../append-jpeg6b.patch

./configure
make
sudo make install

这会将修改后的jpegtran 安装到/usr/local

给定0.jpg1.jpg

你可以这样运行它:

jpegtran -appright 1.jpg 0.jpg > join.jpg

制作:

【讨论】:

以上是关于ffmpeg无损裁剪合并视频的主要内容,如果未能解决你的问题,请参考以下文章

ffmpeg使用filter crop 裁剪视频

FFMPEG 视频分割和合并

ffmpeg视频剪切时长不正确

使用 FFMPEG 以毫秒为单位的无损视频修剪

视频文件太大?使用FFmpeg来无损压缩它

使用 FFMPEG 裁剪视频时出错