stu*_*ent 6 command-line video compression
有没有一种简单的方法(在命令行上 - 我想编写一个压缩文件夹中所有视频的脚本)来减少视频的文件大小(几乎)而不会降低质量?有没有一种方法对不同的视频格式(mp4、flv、m4v、mpg、mov、avi)同样有效?
我应该提一下,我想压缩的大多数视频都是下载的网络视频(mp4、flv),所以不清楚是否有进一步压缩的空间。
在 PNG 的神秘土地上,近乎无损压缩的最有效方法是使用几乎所有可能的设置组合来压缩图像并比较输出。这就是类似应用程序pngcrush
所做的事情。
从纸面上看,类似的过程没有理由行不通。在实践中,存在以下几个问题:
最重要的是,您正在处理已经被人工制品和编码污泥毒害的内容。我对“有没有简单的方法”的简单回答是“没有”。
但是,如果您有大量像 FLV 这样的低压缩视频(根据我对这种格式的经验,这是一种相当垃圾的压缩),那么使用FLV可能ffmpeg
值得。mencoder
像这样的事情可能会起作用:
find -iname '*.flv' -exec \
mencoder {} -o {}.recomp.avi -ovc x264 -x264encopts threads=9:bitrate=400 -oac mp3lame -lameopts abr:br=52 \;
Run Code Online (Sandbox Code Playgroud)
但会有损失。您只需判断多少是可以接受的。
您还可以使用 avconv 来实现此目的,因为
avconv -i <sourcefile> -c:v libx264 -crf 23 output.mp4
您可以通过减少 cRF 因子(示例中为 23)来向上调整质量,并通过增加它来向下调整质量。
您可以将值设置在 0 到 51 之间,其中较低的值会带来更好的质量(但代价是文件大小较大)。Sane 值介于 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
Run Code Online (Sandbox Code Playgroud)
请注意,此脚本中使用的音频和视频编解码器是copy
这样的,因此不应进行重新编码。任何尺寸上的节省都是最小的,并且只是比以前使用的容器更高效的结果。为了减小大小,需要重新编码,并且您需要通过替换来调整脚本c:v copy
(-c:v libx264 -crf 23
如上所述根据需要调整 -crf 值)。请随意注释或删除任何多余的回显线。
注意:您提到的“mp4、flv、m4v、mpg、mov、avi”格式是容器,对用于对其中的流进行编码的编解码器影响很小或没有影响。关于重新编码以减少大小的讨论需要了解容器中包含的编解码器,并且必须根据具体情况进行评估。
来源:测试和http://slhck.info/articles/crf