有没有一种简单的方法(在命令行上 - 我想编写一个脚本来压缩文件夹中的所有视频)来减少视频文件的大小(几乎)而不会造成质量损失?有没有一种方法可以同样适用于不同的视频格式(mp4、flv、m4v、mpg、mov、avi)?
我应该提到,我想要压缩的大多数视频都是下载的网络视频(mp4,flv),因此不清楚是否还有进一步压缩的空间。
答案1
在巴布亚新几内亚这片神秘的土地上,靠近-无损压缩是使用几乎所有可能的设置组合来压缩图像并比较输出。这就是应用程序所做的pngcrush
。
从理论上讲,类似的流程没有理由行不通。但实际上,存在一些问题:
- 一次压缩视频的过程比编码 PNG 图像的过程要长得多。
- 配置组合的数量大约是1000倍。
- 这两个国家合谋让这一进程以指数级的速度延长。
- 它还会占用过多的磁盘空间、内存和 CPU 时间。
- 如果帧速率发生变化,帧就会混合;如果更改帧大小或裁剪,帧也会明显发生变化,这会使比较过程更加困难
最糟糕的是,你正在处理已经被伪影和编码污泥污染的内容。对于“是否存在简单的方法”这个问题,我的简单回答是“没有”。
但是如果你有大量低压缩率的视频,比如 FLV(就我的经验而言,这种格式的压缩率相当差),那么可能值得尝试ffmpeg
一下mencoder
FLV。下面这种方法可能会奏效:
find -iname '*.flv' -exec \
mencoder {} -o {}.recomp.avi -ovc x264 -x264encopts threads=9:bitrate=400 -oac mp3lame -lameopts abr:br=52 \;
但会有损失,你只需要判断多少是可以接受的。
答案2
avconv -i <sourcefile> -c:v libx264 -crf 23 output.mp4
您也可以使用 avconv 来实现这一点,您可以通过降低 crf 因子(示例中为 23)来向上调整质量,通过增加 crf 因子来向下调整质量。
您可以将值设置为 0 到 51 之间,值越低,质量越好(但文件大小会变大)。合理的值是 18 到 28 之间。x264 的默认值是 23,因此您可以将其用作起点。
一个脚本应该允许您更改为不同的格式而不会损失质量(但尺寸几乎没有或根本没有减少)
#!/bin/bash
echo "This script will attempt to copy the video and audio streams of all non-mkv files in the current directory to a mkv video container of the same name as the sources without overwriting."
read -p "Press any key to continue or CTRL-C to cancel"
for f in *.*
do
name=$(echo "$f" | sed 's/\.[^\.]*$//')
ext=$(echo "$f" | sed 's/^.*\.//')
echo "$f is made up of the base $name and ends with $ext"
target="$name.mkv"
echo target = $target
if [ "$f" = "$target" ];
then
echo "$f=$target skipping overwrite"
else
avconv -i "$f" -c:a copy -c:v copy "$name.mkv"
fi
done
请注意,此脚本中使用的音频和视频编解码器是copy
,因此不应进行重新编码。任何大小节省都将是微不足道的,并且只会是比以前使用的更高效的容器的结果。要减小大小,需要重新编码,您需要通过替换来调整脚本c:v copy
(-c:v libx264 -crf 23
如上所述调整 -crf 值以满足您的需求)。请随意注释掉或删除任何多余的回显行。
注意:您提到的格式“mp4、flv、m4v、mpg、mov、avi”是容器,与用于编码其中的流的编解码器几乎没有关系。关于重新编码以减小尺寸的讨论需要了解容器中包含的编解码器,并且必须根据具体情况进行评估。
资料来源:测试和http://slhck.info/articles/crf