优化video文件大小而不会丢失质量

是否有一种简单的方法(在命令行上 – 我想编写一个压缩文件夹中所有video的脚本)来减少video的文件大小(几乎)而没有质量损失? 是否有一种方法适用于不同的video格式(mp4,flv,m4v,mpg,mov,avi)?

我应该提一下,我想要压缩的大部分video都是下载的网络video(mp4,flv),所以目前尚不清楚是否有进一步压缩的空间。

在PNG的神秘之地, 近乎无损压缩的最有效方法是使用几乎所有可能的设置组合压缩图像并比较输出。 这就像pngcrush这样的应用程序。

在纸上,没有理由说类似的过程不起作用。 在实践中,存在一些问题:

  • 压缩video一次比编码PNG图像要长得多。
  • 配置组合大约是1000倍。
  • 这两个人合谋使这个过程以几个权力成倍增长。
  • 它还会使用不合理的磁盘空间,内存和CPU时间。
  • 如果帧速率发生变化,帧会混合,如果更改帧大小或裁剪,帧会明显改变,从而使比较过程更加困难

最重要的是,你要处理已经因人工制品和编码污泥而中毒的内容。 我的简单回答“有一个简单的方法”必须是否定的。

但是如果你有一些像FLV这样的低压缩video(根据我的格式经验,这是一种相当垃圾的压缩),那么对于FLV来说,使用ffmpegmencoder可能是值得的。 这样的事情可能有用:

 find -iname '*.flv' -exec \ mencoder {} -o {}.recomp.avi -ovc x264 -x264encopts threads=9:bitrate=400 -oac mp3lame -lameopts abr:br=52 \; 

但是会有损失。 你只需要判断多少是可以接受的。

你也可以用avconv来完成这个
avconv -i-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 

请注意,此脚本中使用的音频和video编解码器是copy因此不应进行重新编码。 任何尺寸的节省都将是最小的,并且只是比以前使用的更有效的容器的结果。 要缩小大小,需要重新编码,您需要通过将-c:v libx264 -crf 23替换为c:v copy来调整脚本(根据您的需要调整-crf值,如上所述)。 随意注释或删除任何多余的回声线。

注意:您提到的格式“mp4,flv,m4v,mpg,mov,avi”是容器,对用于对其中的流进行编码的编解码器几乎没有影响。 关于重新编码以减小尺寸的讨论将需要知道容器中包含的编解码器,并且必须根据具体情况进行评估。

来源:测试和http://slhck.info/articles/crf