ffmpeg命令用于创建缩略图精灵

时间:2015-07-04 18:28:43

标签: unix ffmpeg

要从ffmpeg输出单帧,我可以这样做:

ffmpeg -i input.flv -ss 00:00:14.435 -vframes 1 out.png

为了每秒输出一张图像,我可以这样做:

ffmpeg -i input.flv -vf fps=1 out%d.png

是否有办法从这些输出创建缩略图精灵,以帮助创建一个用于拇指寻找位置的vtt文件?

3 个答案:

答案 0 :(得分:1)

对于vtt文件,我不完全确定你需要/卑鄙的精灵,但是有一个很好的工具可以让你将单个图像组合成一个大概览图片:

ImageMagick附带了一个名为montage

的便捷工具
  

蒙太奇 - 通过组合多个单独的图像来创建合成图像。图像在合成图像上平铺,可选地装饰有边框,框架,图像名称等。

您可以使用以下命令将缩略图放在一个或多个图像上:

montage *.png -tile 4x4 overview.png

它会自动生成所需图片的数量,以便为您提供概述。

答案 1 :(得分:1)

一个小改进建议于answer given by MR_1204:如果最终的子画面是一个PNG,我会避免因JPG压缩和而保存临时缩略图作为PNG图像的质量下降:

ffmpeg -i sprite/MyVideoFile.mp4 -r 1 -s 280x180 -f image2 sprite/thumbs/thumb-%%d.png

此外,保存到PNG通常比保存到JPG一(微型)得快一点。

相反,保持下载小,它可能是有意义的(只)最终精灵图像保存为JPG,这在PHP和GD的情况下,只需要更换imagepng(...)与imagejpeg(... ).

答案 2 :(得分:0)

这里是一个示例,该示例使用ffmpeg从mp4视频创建jpeg文件(280x180),然后使用PHP gd2 +为视频播放器编写VTT文件将这些缩略图组合成sprite(png格式)。

首先使用ffmpeg每秒创建1张图片:

ffmpeg -i sprite/MyVideoFile.mp4 -r 1 -s 280x180 -f image2 sprite/thumbs/thumb-%%d.jpg

然后创建sprite文件+ vtt文件(例如PHP):

$dirToScan      =   'thumbs/';
$filePrefix     =   'thumb-';
$fileSuffix     =   '.jpg';
$thumbWidth     =   280;
$thumbHeight    =   180;
$imageFiles     =   array();
$spriteFile     =   'sprite.png';
$imageLine      =   20;
$vttFile        =   'sprite.vtt';
$dst_x          =   0;
$dst_y          =   0;


# read the directory with thumbnails, file name in array
foreach (glob($dirToScan.$filePrefix.'*'.$fileSuffix) as $filename) {
    array_push($imageFiles,$filename);
}

natsort($imageFiles);
#calculate dimension for the sprite 
        $spriteWidth =  $thumbWidth*$imageLine;
        $spriteHeight   =   $thumbHeight*(floor(count($imageFiles)/$imageLine)+1);

        # create png file for sprite
        $png = imagecreatetruecolor($spriteWidth,$spriteHeight);

        # open vtt file
            $handle =   fopen($vttFile,'wb+');
            fwrite($handle,'WEBVTT'."\n");

        # insert thumbs in sprite and write the vtt file
            foreach($imageFiles AS $file)   {
                $counter        =   str_replace($filePrefix,'',str_replace($fileSuffix,'',str_replace($dirToScan,'',$file)));
                $imageSrc = imagecreatefromjpeg($file);
                imagecopyresized ($png, $imageSrc, $dst_x , $dst_y , 0, 0, $thumbWidth, $thumbHeight, $thumbWidth,$thumbHeight);

                $varTCstart =   gmdate("H:i:s", $counter-1).'.000';
                $varTCend   =   gmdate("H:i:s", $counter).'.000';

                $varSprite  =   $spriteFile.'#xywh='.$dst_x.','.$dst_y.','.$thumbWidth.','.$thumbHeight;

                fwrite($handle,$counter."\n".$varTCstart.' --> '.$varTCend."\n".$varSprite."\n\n");

create new line after 20 images
                if ($counter % $imageLine == 0) {
                    $dst_x=0;
                    $dst_y+=$thumbHeight;
                }
                else    {
                    $dst_x+=$thumbWidth;
                }

            }
            imagepng($png,$spriteFile);
            fclose($handle);

VTT文件如下:

WEBVTT
1
00:00:00.000 --> 00:00:01.000
sprite.png#xywh=0,0,280,180

2
00:00:01.000 --> 00:00:02.000
sprite.png#xywh=280,0,280,180

3
00:00:02.000 --> 00:00:03.000
sprite.png#xywh=560,0,280,180
...