FFMPEG可感知的默认值



我正在使用ffmpeg来使用vfilter为视频添加PNG文件的水印,比如:

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

然而,输入文件都具有不同的质量/比特率,并且我希望输出文件具有与输入文件相似的质量/位元率。我将如何实现这一点?此外,我对ffmpeg几乎一无所知,所以有什么选项可以合理地设置为提供良好的质量:文件大小比吗?

通常希望输出为"相同质量";因为输入是人们一直想要的假定的东西。不幸的是,当使用有损编码器时,这是不可能的,并且由于色空间转换、色度子采样和其他问题,即使是无损编码器也可能无法提供相同的质量。然而,当使用有损编码器时,您可以实现视觉上无损(或几乎如此)的输出;这意味着在你看来,输出的质量可能是一样的,但从技术上讲,事实并非如此。此外,尝试使用与输入相同的比特率和其他参数很可能无法达到您想要的效果。

示例:

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

另请参阅:

  • FFmpeg和x264编码指南
  • FFmpeg和AAC编码指南

这里有一组非常好的例子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");
?>

最新更新