0

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

$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

4

2 回答 2

1

你需要:

  1. 使用 ffmpeg 调整图像大小,保持纵横比,使其不添加任何边框。这是-vf scale=".$thumbwidth.":trunc(ow/a/2)*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");

使用去年 9 月的构建在 ffmpeg 上进行了测试,参数设置为实际值,以便于阅读:

ffmpeg -ss 1 -i GOPR9876.MP4 -vcodec mjpeg -vframes 1 -an -f rawvideo -vf scale=240:trunc\(ow/a/2\)*2 "foo.jpg"
于 2013-05-14T02:29:13.290 回答
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);
于 2013-05-14T03:12:53.607 回答