前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >文件上传遇到IO异常——解决Cannot run program "ffmpeg": CreateProcess error=2, 系统找不到指定的文件。

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

原创
作者头像
xiao李
发布2024-07-29 14:53:07
2720
发布2024-07-29 14:53:07
举报
文章被收录于专栏:Java相关我吃香菜青椒不挑食

在解决这个报错之前,我们要知道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里即可

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 我们先来看一段代码
  • 安装ffmpeg
  • 配置环境变量
相关产品与服务
媒体处理
媒体处理(Media Processing Service,MPS)是智能、强大、全面的多媒体数据处理服务,行业支持最全面的音视频编码标准,基于自研编码内核和AI算法,提供音视频转码和增强、媒体智能、质检评测等能力,帮助您提升媒体质量、降低成本,满足各类场景的音视频处理需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档