‘SVideo’视频上传

作者 : 开心源码 本文共4273个字,预计阅读时间需要11分钟 发布时间: 2022-05-12 共252人阅读

对于视频上传与图片上传没有多大区别,主要在我们对视频的解决,如截取某一帧作为封面图,获取视频时长等。

//视频上传        //对登录客户上传视频进行解决        if(_file.isEmpty()) {            return APIResultJson.getFailInstance("视频不能为空!");        } else {            //获取当前上传文件的文件名称            String originalFileName = _file.getOriginalFilename();            //获取文件后缀名            String fileSuffix = getExtName(originalFileName, '.');            //文件新名称            String newFileName = getUUIDFileName(originalFileName);            //获取文件上传hash算法路径            String fileSaveAllPath = makePath(newFileName);            //绝对路径            String absolutePath = fileSaveRootPath + fileSaveAllPath;            //封装上传文件位置的全路径            File uploadPath = new File(absolutePath, newFileName);            //把本地文件上传到封装上传文件位置的全路径            try {                _file.transferTo(uploadPath);            } catch (IOException e) {                APIResultJson.getFailInstance("视频发布失败,请稍后尝试!");                e.printStackTrace();            }            //获取客户上传视频路径,fileSaveAllPath + "\" + newFileName            //获取视频秒数            Long videoTimes = VideoUtils.getVideoTime(uploadPath);            //截取视频中某一针,将其保存为视频封面图            BufferedImage bi =  VideoUtils.interceptPictureByVideo(uploadPath);            //重绘图片时先将案例图保存到视频目录下            String picName = newFileName.substring(0, newFileName.lastIndexOf('.')) + ".jpg";            String interceptPicturePath = absolutePath + "\\" + picName;            try {                ImageIO.write(bi, "jpg", new File(interceptPicturePath));            } catch (IOException e) {                APIResultJson.getFailInstance("视频截取图片失败,请重写上传!");            }            //保存视频信息到数据库            VInfo vi = new VInfo();            vi.setsName(_name);//视频名称            vi.setsPath(fileSaveAllPath + "\\" + newFileName);//视频存储路径            vi.setnSeconds(videoTimes);//视频秒数            vi.setcDesc(_desc);//视频形容            vi.setsCoverPath(fileSaveAllPath + "\\" + picName);//视频封面图存储路径            vi.settPubdate(new Date());//发布时间            vi.setiWcs(Long.valueOf(_wcs));//谁可见            vi.setcComment(_comment);//能否允许评论            vi.setcStatus("1");//视频状态            vi.setiUid(cui.getId());            vi.settEdit(new Date());            int result = vis.insertSelective(vi);            if(result <= 0) {                return  APIResultJson.getFailInstance("视频发布失败!");            }        }

对视频解决我们使用到了JavaCV

1. pom.xml引入Jar
        <dependency>            <groupId>org.bytedeco</groupId>            <artifactId>javacv</artifactId>            <version>1.4.1</version>        </dependency>        <dependency>            <groupId>org.bytedeco</groupId>            <artifactId>javacpp</artifactId>            <version>1.4.1</version>        </dependency>        <dependency>            <groupId>org.bytedeco.javacpp-presets</groupId>            <artifactId>opencv-platform</artifactId>            <version>3.4.1-1.4.1</version>        </dependency>        <dependency>            <groupId>org.bytedeco.javacpp-presets</groupId>            <artifactId>ffmpeg-platform</artifactId>            <version>3.4.2-1.4.1</version>        </dependency>
2.获取指定帧截取为图片
    /**     * 获取指定视频的帧截取为图片     * @param file  源视频文件     * @return     */    public static BufferedImage interceptPictureByVideo(File file) {        //FFmpegFrameGrabber可以了解为解码器,也可以了解为帧收集器        FFmpegFrameGrabber ffg = new FFmpegFrameGrabber(file);        try {            //启动            ffg.start();            //获取视频帧长度            int videoLength = ffg.getLengthInFrames();            int i = 0;            Frame frame = null;            while (i < videoLength) {                //过滤前5帧,避免出现全黑的图片                frame = ffg.grabFrame();                if((i > 5) && (frame.image != null)) {                    break;                }                i++;            }            Java2DFrameConverter converter = new Java2DFrameConverter();            BufferedImage srcBi = converter.getBufferedImage(frame);            int owidth = srcBi.getWidth();            int oheight = srcBi.getHeight();            //对截取的帧进行等比例缩放            int width = 800;            int height = (int) ((double)(width / owidth) * oheight);            BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);            bi.getGraphics().drawImage(srcBi.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);            ffg.stop();            return bi;        } catch (FrameGrabber.Exception e) {            e.printStackTrace();            return null;        }    }
3. 获取视频时长
    /**     * 获取视频时长,单位为秒     * @param file     * @return     */    public static Long getVideoTime(File file) {        Long times = 0L;        FFmpegFrameGrabber ffg = new FFmpegFrameGrabber(file);        try {            ffg.start();            times = ffg.getLengthInTime() / (1000 * 1000);            ffg.stop();        } catch (FrameGrabber.Exception e) {            e.printStackTrace();            return times;        }        return times;    }

对文件名进行解决,使用hash算法打散存储防止目录下出现太多文件

    /**     * 上传文件到服务器时,为防止一个目录下出现太多文件,使用hash算法打散存储     * @param fileName  文件名称     * @return     */    public String makePath(String fileName) {        //得到文件名的hashCode的值,得到的就是fileName这个字符串对象在内存中的地址        int hashCode = fileName.hashCode();        int dirOPath = hashCode & 0xf;//0--15        int dirTPath = (hashCode & 0xf0) >> 4;//0-15        String path = dirOPath + "\\" + dirTPath;        //构造新的保存目录        String newPath = fileSaveRootPath + path;        //File就可代表文件也可以代表目录        File file = new File(newPath);        //假如目录不存在,则创立        if(!file.exists()) {            file.mkdirs();        }        return path;    }

使用UUID对文件名做解决,防止重复

    /**     * 将文件名转换成uuid表示,防止文件名上传重复     * @param fileName     * @return     */    private String getUUIDFileName(String fileName) {        UUID uuid = UUID.randomUUID();        StringBuilder sb = new StringBuilder(100);        sb.append(uuid.toString()).append(".").append(this.getExtName(fileName, '.'));        return sb.toString();    }

获取文件后缀

    /**     * 获取文件后缀名     * @param s     * @param split     * @return     */    private String getExtName(String s, char split) {        int i = s.lastIndexOf(split);        int leg = s.length();        return i > 0 ? (i + 1) == leg ? " " : s.substring(i + 1, s.length()) : " ";    }

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » ‘SVideo’视频上传

发表回复