Php Imagemagick创建拇指

Php Imagemagick创建拇指,php,imagemagick,Php,Imagemagick,我有一个tube站点,我使用这个功能从视频文件生成拇指 $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

我有一个tube站点,我使用这个功能从视频文件生成拇指

$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

您需要:

  • 使用ffmpeg调整图像大小,保持纵横比,使其不添加任何边框。这是下面的
    -vf scale=“.$thumbwidth.”:trunc(ow/a/2)*2

  • 将图像大小调整为所需的精确大小。这是
    -调整“$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");
    
    在ffmpeg上测试,从去年9月开始构建,参数设置为实际值,以便于阅读:

    ffmpeg -ss 1 -i GOPR9876.MP4 -vcodec mjpeg -vframes 1 -an -f rawvideo -vf scale=240:trunc\(ow/a/2\)*2 "foo.jpg"
    

    使用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);
    

    Hmm这行
    shell\u exec(“$ffmpeg\u path-ss$first-i\”.$row[file]。“\”-vcodec mjpeg-vframes 1-an-f rawvideo-vf scale=“.$thumbwidth.”:trunc(ow/a/2)*2\“$image\”日志显示:每秒创建thumb#0:1…失败!无法创建缩略图!是的,我已经在尝试使用
    scale=240:trunc\(ow/a/2\)*2
    ,但不知道这里有什么问题您的ffmpeg版本可能不支持它-让我们来测试一下我的ffmpeg版本,使用固定大小的
    ffmpeg-ss 1-i GOPR9876.MP4-vcodec mjpeg-vframes 1-an-f rawvideo-s 400x100“foo3.jpg”
    我没有黑色边框。这很奇怪。你的源视频是被设置为变形的还是什么的?或者更有趣的是,实际视频上有黑色边框?你的意思是从命令行
    ffmpeg-ss50-i2.flv-vcodec mjpeg-vframes 1-an-f rawvideo-vf scale='iw*max(240/iw\,180/ih):-1'-vf crop='240:180'“1.jpg”
    ?是的,拇指被创建了,但同样带有黑色边框。。。六羟甲基三聚氰胺六甲醚。。也许我需要创建和youtube上相同尺寸的拇指,如果我能看到youtube生成16:9的拇指?尝试使用
    -vf scale='iw*max(240/iw\,180/ih):-1',裁剪=240:180