文件上传遇到IO异常——解决Cannot run program "ffmpeg": CreateProcess error=2, 系统找不到指定的文件。

2024-07-29 14:53:07 浏览数 (2)

在解决这个报错之前,我们要知道ffmpeg到底是干什么的

FFmpeg(Fast Forward MPEG)是一个开源的多媒体处理工具集,它包含了音频和视频处理库、编码器、解码器、转码器等多种工具。可以进行音视频编解码、格式转换、流媒体处理、图像处理、剪辑和编辑、字幕处理、音频处理、实时视频处理等。

  • 使用ffmpeg生成缩略图主要分为以下步骤:
    1. 使用ffmpeg解码视频
    2. 帧格式转换
    3. 根据缩略图的数量从视频流中取帧
    4. 使用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官网

点击download点击download
选择哪个都行选择哪个都行
选择哪个都行选择哪个都行

下载好了之后解压到一个没有中文的目录

这样就安装好了

配置环境变量

当我们点进去会发现,有这些个文件夹

在bin目录中会有三个.exe文件

我们点击这里,复制这个路径(注意:一定要复制到带着bin的)

然后在此电脑里右键属性--->高级系统设置---->环境变量

找到系统变量中的path,点编辑

将我们复制的bin目录粘贴到path里即可

最后一步也是最重要的一步,一定要点确定后,重启!!!!!!!!!!

0 人点赞