我有一个管网站,我正在使用此功能从视频文件生成拇指
$thumbwidth = 240; //thumb width
$thumbheight = 180; //thumb height
$imagick_command = "-modulate 110,102,100 -sharpen 1x1 -enhance";
shell_exec("$ffmpeg_path -ss $first -i \"".$row[file]."\" -vcodec mjpeg -vframes 1 -an -f rawvideo -s ".$thumbwidth."x".$thumbheight." \"$image\"");
shell_exec("/usr/local/bin/mogrify $imagick_command $image");
这是拇指的结果,这个图像正是我需要的,没有边框等等。
但有时依赖于视频,我有像这样的拇指
什么是从拇指中移除此黑色空间的最佳方法,但需要保持拇指大小240x180
答案 0 :(得分:1)
你需要:
使用保持宽高比的ffmpeg调整图像大小,使其不添加任何边框。以下是-vf scale=".$thumbwidth.":trunc(ow/a/2)*2
。
将图像调整为您想要的确切尺寸。以下是-resize ".$thumbwidth."x".$thumbheight."\!
。
所以新的命令集应如下所示:
$thumbwidth = 240; //thumb width
$thumbheight = 180; //thumb height
$imagick_command = "-modulate 110,102,100 -sharpen 1x1 -enhance -resize ".$thumbwidth."x".$thumbheight."\!";
shell_exec("$ffmpeg_path -ss $first -i \"".$row[file]."\" -vcodec mjpeg -vframes 1 -an -f rawvideo -vf scale=".$thumbwidth.":trunc(ow/a/2)*2 \"$image\"");
shell_exec("/usr/local/bin/mogrify $imagick_command $image");
使用上一个Sept的构建版本对ffmpeg进行测试,并将参数设置为实际值,以便于阅读:
ffmpeg -ss 1 -i GOPR9876.MP4 -vcodec mjpeg -vframes 1 -an -f rawvideo -vf scale=240:trunc\(ow/a/2\)*2 "foo.jpg"
答案 1 :(得分:0)
使用ffmpeg缩放滤镜创建一个溢出240x180像素区域的缩略图。
想象一下,你有一个320x256像素的视频。要获得240的宽度,您需要使用因子0.75进行缩放。要获得180的高度,您需要使用0.70进行缩放。如果您最多使用两个因子,您将获得尺寸为240x192的缩略图,溢出目标区域而没有任何黑色边框。
接下来做中央裁剪以获得完美的240x180缩略图,上下移动6px。
如果视频高度大于宽度,则数学运算相同。调整大小后,您将获得一个高度为180且宽度稍大的缩略图,裁剪将采用它的中心部分,使其完美。
使用ffmpeg,您可以在过滤器链中使用缩放和裁剪过滤器:
-vf scale='iw*max(240/iw\, 180/ih):-1', crop=240:180`
从外部输入创建命令行字符串时,应使用escapeshellarg()
。这是您可以使用的PHP代码:
<?php
// static configuration - safe
$thumbwidth = 240;
$thumbheight = 180;
$ffmpeg_path = 'ffmpeg';
// foreign input - unsafe
$first = '00:00:30';
$row = array('file' => '/home/goran/File Name.avi');
$image = '/home/goran/File Name.jpg';
$cmd = sprintf('%s ' .
'-ss %s -i %s -vcodec mjpeg -vframes 1 -an -f rawvideo ' .
'-vf scale=\'iw*max(%d/iw\, %d/ih):-1\', crop=%d:%d '.
'%s',
$ffmpeg_path,
escapeshellarg($first), escapeshellarg($row['file']),
$thumbwidth, $thumbheight, $thumbwidth, $thumbheight,
escapeshellarg($image));
shell_exec($cmd);