2021-01-27

JAVA压缩视频,降低码率和分辨率(windows)



提示:以下是本篇文章正文内容,下面案例可供参考

一、使用的插件JAVE

JAVE是基于ffmpeg的封装插件

二、使用步骤

1.引入依赖

		<!--压缩视频-->
       <dependency>
           <groupId>ws.schild</groupId>
           <artifactId>jave-core</artifactId>
           <version>3.0.0</version>
       </dependency>
       <dependency>
           <groupId>ws.schild</groupId>
           <artifactId>jave-nativebin-win64</artifactId>
           <version>3.0.0</version>
       </dependency>

2.检查

如果是发布服务器(检查一下ffmpeg.exe文件是否在指定文件夹中,如果没有,从未发布前的本地maven库中找到jave-nativebin-win64里面找到,如下图,将jar文件解压打开)在这里插入图片描述在这里插入图片描述
发布在服务器端,控制台如果报未找到或未运行ffmpeg.exe的错误,根据报错的路径打开查看是否存在ffmpeg.exe,我默认的会在如图tomcat下的位置:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.上代码

注意:本段代码只是工具类的一个静态方法,该段代码具体百度有很多,稍微整理了一下,原作者看到可以联系我我标明,我看到的也不是原作者写的,其中在里面加了audio/video的判断,分辨率宽度的奇偶,因为使用过程中,发现被处理过的视频分辨率会出现1280 X 523的情况,该插件就会在日志里面看到 XXX cannot be divisible by 2

/**
     * 传视频File对象,返回压缩后File对象信息
     * @param
     */
    public static File compressionVideo(String filePath,String picName) {

        //获取文件对象
        File source = new File(filePath);
        if(source == null){
            return null;
        }

        //创建目标对象
        String newPath = source.getAbsolutePath().substring(0, source.getAbsolutePath().lastIndexOf(File.separator)).concat(File.separator).concat("a" + picName);
        File target = new File(newPath);
        try {
            //根据路径获取媒体对象(视频/音频)
            MultimediaObject object = new MultimediaObject(source);

            //TODO 标准属性配置
            int maxBitRate = 128000;
            int maxSamplingRate = 44100;
            int bitRate = 800000;
            int maxFrameRate = 20;
            int maxWidth = 1280;

            //实例化音频/视频对象
            AudioAttributes audio = new AudioAttributes();
            VideoAttributes video = new VideoAttributes();

            /**
             * 音频属性(类似于MP3文件压缩)
             * TODO 注意判断视频/音频是否为null来选择Video还是Audio
             */
            if(object.getInfo().getAudio() != null){
                //创建音频对象
                AudioInfo audioInfo = object.getInfo().getAudio();
                if(audioInfo.getBitRate() > maxBitRate){
                    audio.setBitRate(new Integer(maxBitRate));//比特率越高,清晰度/音质越好,文件越大
                }
                audio.setChannels(audioInfo.getChannels());//(1 =单声道,2 = 双声道(立体声))。如果未设置任何声道值,则编码器将选择默认值 0
                //audio.setVolume(256);//默认为0,如果256,则音量值不会改变
                if(audioInfo.getSamplingRate() > maxSamplingRate){
                    audio.setSamplingRate(maxSamplingRate);//采样率越高声音的还原度越好,文件越大,单位:赫兹 hz
                }
            }
            /**
             * 视频属性(类似于MP4文件压缩)
             * TODO 注意判断视频/音频是否为null来选择Video还是Audio
             */
            if(object.getInfo().getVideo() != null){
                ws.schild.jave.info.VideoInfo videoInfo = object.getInfo().getVideo();
                video.setCodec("h264");
                if(videoInfo.getBitRate() > bitRate){
                    video.setBitRate(bitRate); //设置视频比特率,单位:b (比特率越高,清晰度/音质越好,文件也就越大)
                }
                if(videoInfo.getFrameRate() > maxFrameRate){
                    video.setFrameRate(maxFrameRate);//设置视频帧率(帧率越低,效果越差,FPS)或“赫兹”(Hz)。
                }
                // 限制视频宽高
                int width = videoInfo.getSize().getWidth();
                int height = videoInfo.getSize().getHeight();
                int hr = 0;
                if(width > maxWidth){
                    float rat = (float) width / maxWidth;
                    hr = (int)(height/rat);
                    if (hr % 2 != 0) {  
                        hr = hr - 1;
                    }
                    video.setSize(new VideoSize(maxWidth,hr));
                }
            }
            //将设置好的视频/音频对象填充到压缩对象
            EncodingAttributes attr = new EncodingAttributes();
            attr.setAudioAttributes(audio);
            attr.setVideoAttributes(video);
            //创建压缩对象
            Encoder encoder = new Encoder();
            //开始压缩
            encoder.encode(new MultimediaObject(source), target, attr);
            return target;
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if(target.length() > 0){
                source.delete();
            }
        }
        return source;
    }

2.调用

根据自己的实际业务情况,路径,文件名传入即可
在这里插入图片描述


总结

插件简单,插件中很多配置参数一定要知道他的作用,好像该插件可以加速压缩,但是我查阅他的官方文档好像没有—jave官网

感兴趣的可以多搜集一下资料研究一下加速压缩,或者有经验的老哥不吝赐教,最后说一下他的压缩效率。实测80m压缩9m左右,时间69s;40多m压缩完760k,时间20s左右。对于服务器内存吃紧的可以考虑使用,以时间换空间,最最最后说一句,报错第一时间看日志,看日志,这个插件会将相应的所有错误打印出来,记得翻译翻译。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值