我正在使用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几乎一无所知,那么有没有什么选择可以提供良好的质量:文件大小比例?
答案 0 :(得分:16)
通常希望输出与输入“相同的质量”是人们总是想要的假设。不幸的是,当使用有损编码器时这是不可能的,甚至无损编码器也可能由于色彩空间转换,色度子采样和其他问题而无法提供相同的质量。但是,使用有损编码器时,您可以实现视觉无损(或接近)输出;这意味着它看起来好像输出质量与您的眼睛相同,但从技术上讲它并非如此。此外,尝试使用相同的比特率和其他参数作为输入很可能无法达到您想要的效果。
ffmpeg -i input -codec:v libx264 -preset medium -crf 24 -codec:a copy output.mkv
您要调整的两个选项是-crf
和-preset
。 CRF(恒定速率因子)是您的质量水平。较低的值是较高的质量。预设是一组选项,可以提供特定的编码速度与压缩权衡。较慢的预设将编码较慢,但将实现更高的压缩(压缩是每个文件大小的质量)。基本用法是:
x264 --help
预设列表,并忽略安慰剂预设,因为这是一个笑话)。 您无需对整个视频进行编码即可测试质量。您可以使用-ss
和-t
选项来选择要编码的随机部分,例如-ss 30
-t 60
,它将跳过前30秒并创建60秒输出。
在此示例中,音频为stream copied,而不是重新编码。
请记住,每个编码器都不同,适用于x264的编码器不适用于其他编码器。
如果输出无法在QuickTime这样的愚蠢播放器中播放,请添加-pix_fmt yuv420p
。
答案 1 :(得分: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");
?>