要从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文件?
答案 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
...