在解决这个报错之前,我们要知道ffmpeg到底是干什么的
FFmpeg(Fast Forward MPEG)是一个开源的多媒体处理工具集,它包含了音频和视频处理库、编码器、解码器、转码器等多种工具。可以进行音视频编解码、格式转换、流媒体处理、图像处理、剪辑和编辑、字幕处理、音频处理、实时视频处理等。
- 使用ffmpeg生成缩略图主要分为以下步骤:
- 使用ffmpeg解码视频
- 帧格式转换
- 根据缩略图的数量从视频流中取帧
- 使用opencv建立画布并生成缩略图
在生成缩略图时,通常会使用如下方法
我们先来看一段代码
代码语言:java复制 fileTypeEnum = FileTypeEnums.getFileTypeBySuffix(fileSuffix);
if (FileTypeEnums.VIDEO == fileTypeEnum) {
cutFile4Video(fileId, targetFilePath);
//视频生成缩略图
cover = month "/" currentUserFolderName Constants.IMAGE_PNG_SUFFIX;
String coverPath = targetFolderName "/" cover;
// 视频生成封面图
ScaleFilter.createCover4Video(new File(targetFilePath), Constants.LENGTH_150, new File(coverPath));
} else if (FileTypeEnums.IMAGE == fileTypeEnum) {
//生成缩略图
cover = month "/" realFileName.replace(".", "_.");
String coverPath = targetFolderName "/" cover;
Boolean created = ScaleFilter.createThumbnailWidthFFmpeg(new File(targetFilePath), Constants.LENGTH_150, new File(coverPath), false);
// 如果生成缩略图失败,则使用原图改名
if (!created) {
FileUtils.copyFile(new File(targetFilePath), new File(coverPath));
}
}
代码语言:java复制 public static Boolean createThumbnailWidthFFmpeg(File file, int thumbnailWidth, File targetFile, Boolean delSource) {
try {
BufferedImage src = ImageIO.read(file);
//thumbnailWidth 缩略图的宽度 thumbnailHeight 缩略图的高度
int sorceW = src.getWidth();
int sorceH = src.getHeight();
//小于 指定高宽不压缩
if (sorceW <= thumbnailWidth) {
return false;
}
compressImage(file, thumbnailWidth, targetFile, delSource);
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
public static void compressImage(File sourceFile, Integer width, File targetFile, Boolean delSource) {
try {
String cmd = "ffmpeg -i %s -vf scale=%d:-1 %s -y";
ProcessUtils.executeCommand(String.format(cmd, sourceFile.getAbsoluteFile(), width, targetFile.getAbsoluteFile()), false);
if (delSource) {
FileUtils.forceDelete(sourceFile);
}
} catch (Exception e) {
log.error("压缩图片失败");
}
}
这段代码就是生成图片或视频的缩略图。缩略图命名是原图片的命名上加_
。
cmd里面定义了一个字符串模板,也就是生成ffmpeg命令,解释如下:
-i %s
: 输入文件。-vf scale=%d:-1
: 视频滤镜,指定缩放比例,宽度为指定值,高度自动计算。%s
: 输出文件。-y
: 覆盖输出文件(如果存在)。
在实现这段代码时,我们可能会遇到控制台抛出如下异常
这个异常怎么解决呢?
我这里用windows设备来演示
安装ffmpeg
首先进入FFmpeg官网
下载好了之后解压到一个没有中文的目录
这样就安装好了
配置环境变量
当我们点进去会发现,有这些个文件夹
在bin目录中会有三个.exe
文件
我们点击这里,复制这个路径(注意:一定要复制到带着bin的)
然后在此电脑里右键属性--->高级系统设置---->环境变量
找到系统变量中的path,点编辑
将我们复制的bin目录粘贴到path里即可
最后一步也是最重要的一步,一定要点确定后,重启!!!!!!!!!!