FFMPEG 合理的默认设置

5

我正在使用ffmpeg和vfilters来给视频加上PNG水印,方法如下:

ffmpeg -i 26.wmv -vcodec libx264 -acodec copy -vf "movie=logo.png [watermark]; [in][watermark] overlay=10:10 [out]" 26_w.mkv

不过,输入文件的质量和比特率都不同,我希望输出文件与输入文件的质量和比特率相似。我该如何做到这一点呢? 此外,我对ffmpeg几乎一无所知,有哪些选项是明智设置以获得良好的质量:文件大小比率呢?

2个回答

18
通常希望输出与输入的“质量相同”是人们总是想要的一件事。不幸的是,当使用有损编码器时,这是不可能的,即使使用无损编码器也可能由于色彩空间转换、色度抽样和其他问题而无法提供相同的质量。然而,当使用有损编码器时,您可以实现视觉上无损(或几乎无损)的输出;这意味着它可能看起来与输出品质相同,但从技术上讲并非如此。此外,尝试使用与输入相同的比特率和其他参数很可能无法达到您想要的效果。
示例:
ffmpeg -i input -codec:v libx264 -preset medium -crf 24 -codec:a copy output.mkv

您需要调整的两个选项是-crf-preset。CRF(恒定码率因子)是质量级别。数值越小表示质量越高。预设是一组选项,可以在编码速度与压缩之间进行权衡。较慢的预设会导致编码速度变慢,但会获得更高的压缩率(压缩是指每个文件大小的质量)。基本用法如下:
  1. 使用最高的crf值,同时保持所需质量。
  2. 使用您耐心等待的最慢预设(请参阅x264--help以获取预设列表,忽略“安慰剂”预设,因为它是一个玩笑)。
  3. 将这些设置应用于其余视频。

其他注意事项:

  • 您不必对整个视频进行编码以测试质量。您可以使用-ss-t选项选择随机部分进行编码,例如-ss 30 -t 60,这将跳过前30秒并创建60秒的输出。

  • 在此示例中,音频流复制而不是重新编码。

  • 请记住,每个编码器都是不同的,适用于x264的方法不适用于其他编码器。

  • 如果输出在像QuickTime这样的傻瓜播放器中无法播放,请添加-pix_fmt yuv420p

另请参阅:


这是否意味着您希望在质量较低的输入视频中使用更高的CRF值? - Cameron Martin
CRF决定了你的输出质量。为了简化问题,忽略输入并不断降低(或增加)CRF值,直到达到输出的可接受质量水平。一个良好的起始值是24。 - llogan
你可以制作一个应用程序,在文件上传时设置自己的质量因素,或者像YouTube一样制作2或3个不同质量的相同电影副本,然后查看哪个最适合。当然,这会带来高昂的资源成本,包括CPU和空间。 - Mike

0

这里有一组非常好的示例http://ffmpeg.org/ffmpeg.html#Examples

这是我制作的一个脚本,用于将文件转换为FLV视频并添加预览图像

<?php 
$filename = "./upload/".$_GET['name'].".".substr(strrchr($_FILES['Filedata']['name'], '.'), 1);
move_uploaded_file($_FILES['Filedata']['tmp_name'], $filename);
chmod($filename, 0777);
exec ("ffmpeg -i ".$filename." -ar 22050 -b 200 -r 12 -f flv -s 500x374 upload/".$_GET['name'].".flv");
exec ("ffmpeg -i ".$filename." -an -ss 00:00:03 -an -r 1 -s 300x200 -vframes 1 -y -pix_fmt rgb24 upload/".$_GET['name']."%d.jpg");
?>

我不想让输出文件具有恒定的比特率,而是希望输出文件与输入文件具有相同的“质量”(无论如何衡量),当然还要具有相同的分辨率。 - Cameron Martin
看一下我给你的链接。你会在那里找到这个 ‘-s[:stream_specifier] size (input/output,per-stream)’ 设置帧大小。格式为 ‘wxh’(默认值 - 与源相同)。以下缩写被识别:... 所有你需要的参数都在那里,而且还有很好的例子。 - Mike
好的,那么如何将输出流的质量设置为与输入流相同的质量呢?我需要找出源的比特率,然后将其作为输出的比特率吗?还是有一种方法可以让FFmpeg自动完成这个过程? - Cameron Martin
我不是想将__帧大小__设置为与源相同,而是想将__比特率__设置为与源相同。 - Cameron Martin
我现在想不出一个具体的方法来做这件事,因为ffmepg可以让你自己使用-b 1200来指定比特率,或者如果你没有明确指定比特率,它会自己计算输出文件类型的默认比特率。要设置输出文件类型,你可以使用类似这样的代码-target vcd file.mpg,可能的选项包括:vcd、svcd、dvd、dv、pal-vcd或ntsc-svcd。 - Mike
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接