使用jave进行视频转码

最近在做项目的时候发现,使用jwplayer播放视频会出现只有声音没有画面的情况,经过调查发现是视频的编码格式问题造成的,简单的解决方式是下载一个格式工厂,将视频格式设置为h264就可以正常播放了。如何想实现在上传的时候进行转码,请往下看。

  1. 首先是判断上传的视频编码格式是否是h264
    1. 需要使用我们的工具类jave,详细的介绍请看JAVE - Java Audio Video Encoder e Transcoder
    2. 下载地址JAVE - DownloadJAVE binaries and sources, licensed under the GPL.icon-default.png?t=M666http://www.sauronsoftware.it/projects/jave/download.php
      <!-- https://mvnrepository.com/artifact/it.sauronsoftware/jave -->
      <dependency>
          <groupId>it.sauronsoftware</groupId>
          <artifactId>jave</artifactId>
          <version>1.0.2</version>
      </dependency>
      
    3. 下载完成后,我们对源码进行进一步的扩展,在it.sauronsoftware.jave.Encoder中重载了getInfo方法,具体功能是获取视频的编码格式
public MultimediaInfo getInfo(File source, File desc) throws InputFormatException, EncoderException {
        FFMPEGExecutor ffmpeg = this.locator.createExecutor();
        ffmpeg.addArgument("-i");
        ffmpeg.addArgument(source.getAbsolutePath());
        String imagePath = "";
        if (desc != null && (desc.getPath().endsWith(".jpg") || desc.getPath().endsWith(".jpeg"))) {
            ffmpeg.addArgument("-y");
            ffmpeg.addArgument("-f");
            ffmpeg.addArgument("image2");
            ffmpeg.addArgument("-ss");
            ffmpeg.addArgument("1");
            ffmpeg.addArgument("-t");
            ffmpeg.addArgument("0.001");
            ffmpeg.addArgument(desc.getAbsolutePath());
            imagePath = desc.getPath();
        }

        try {
            ffmpeg.execute();
        } catch (IOException var12) {
            imagePath = "";
            throw new EncoderException(var12);
        }

        MultimediaInfo var7;
        try {
            RBufferedReader reader = null;
            reader = new RBufferedReader(new InputStreamReader(ffmpeg.getErrorStream()));
            MultimediaInfo info = this.parseMultimediaInfo(source, reader);
            info.setImagePath(imagePath);
            var7 = info;
        } finally {
            ffmpeg.destroy();
        }

        return var7;
    }

  1. 然后调用该方法, sourceVideoPath指视频文件的位置
 Encoder encoder = new Encoder();
 String fileName = sourceVideoPath.substring(sourceVideoPath.lastIndexOf("/"));
 String videoCover = fileName.substring(0, fileName.lastIndexOf("."))+".jpg";
 try {
    MultimediaInfo info = encoder.getInfo(new File(sourceVideoPath), new File(sourceVideoPath.substring(0, sourceVideoPath.lastIndexOf("/")) +"/changeToH264/"+videoCover));
    if(info.getVideo() == null || info.getVideo().getDecoder().indexOf("h264") == -1){
         System.out.println("info.getVideo().getDecoder(): "+info.getVideo().getDecoder());
    }
 } catch (EncoderException e) {
    e.printStackTrace();
 }

  1. 如果是h264文件,不需要转码
  2. 然后如果不是,进行转码
    1. 转码前要判断一下当前视频的类型是否支持转码,参数是视频文件的路径,如果返回值为0,代表支持转码,否则不支持,需要先将文件转为支持的类型,此处暂时没有做处理,因为项目要求只能上传MP4格式的视频
private int checkContentType(String sourceVideoPath) {
        String type = sourceVideoPath.substring(sourceVideoPath.lastIndexOf(".") + 1).toLowerCase();
        // ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
        if (type.equals("avi")) {
            return 0;
        } else if (type.equals("mpg")) {
            return 0;
        } else if (type.equals("wmv")) {
            return 0;
        } else if (type.equals("3gp")) {
            return 0;
        } else if (type.equals("mov")) {
            return 0;
        } else if (type.equals("mp4")) {
            return 0;
        } else if (type.equals("asf")) {
            return 0;
        } else if (type.equals("asx")) {
            return 0;
        } else if (type.equals("flv")) {
            return 0;
        }
        // 对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等),
        // 可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.
        else if (type.equals("wmv9")) {
            return 1;
        } else if (type.equals("rm")) {
            return 1;
        } else if (type.equals("rmvb")) {
            return 1;
        }
        return 9;
    }

  1. 如果视频支持转码,,调用process方法开始进行转码,传入视频文件和转码后的目录文件,返回转码后文件路径
    private static final String FORMAT = "mp4";
    private static final String VIDEO_CODE = "libx264";//视频编码格式
    private static final String AUDIO_CODE = "libmp3lame";//音频编码格式

private String process(File sourceFile, File targetFile) {
        int type = checkContentType(sourceFile.getPath());
        if (type == 0) {

            VideoAttributes videoAttributes = new VideoAttributes();
            videoAttributes.setCodec(VIDEO_CODE);
            videoAttributes.setBitRate(new Integer(180000));
            videoAttributes.setFrameRate(new Integer(1));

            AudioAttributes audio = new AudioAttributes();
            audio.setCodec(AUDIO_CODE);
            audio.setBitRate(new Integer(64000));
            audio.setChannels(new Integer(1));
            audio.setSamplingRate(new Integer(22050));

            EncodingAttributes attrs1 = new EncodingAttributes();
            attrs1.setVideoAttributes(videoAttributes);
            attrs1.setAudioAttributes(audio);
            attrs1.setFormat(FORMAT);
            Encoder encoder = new Encoder();

            try {
                String path = targetFile.getPath();
                targetFile = new File(path + File.separator + sourceFile.getName());
                encoder.encode(sourceFile, targetFile, attrs1);

                if (targetFile.exists()) {
                    return targetFile.getAbsolutePath();
                }
            } catch (EncoderException e) {
                e.printStackTrace();

            }

        }

        return "";
    }

  1. 具体转码时可以设置的参数,请详见JAVE - Manual
  2. 可以根据返回信息判断视频是否转码成功
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
125分50秒---162.81M---LabView01---第10章数据的显示.wmv---F:/Resource/video/硬件/AltiumDesigner/LabView01-第10章数据的显示.wmv 92分2秒---143.46M---LabView02---第11章文件的IO及保存.wmv---F:/Resource/video/硬件/AltiumDesigner/LabView02-第11章文件的IO及保存.wmv 37分22秒---58.09M---LabView03---第12章LabVIEW的通信.wmv---F:/Resource/video/硬件/AltiumDesigner/LabView03-第12章LabVIEW的通信.wmv 9分58秒---21.2M---LabView04---第13章LabVIEW与其它软件的连接.wmv---F:/Resource/video/硬件/AltiumDesigner/LabView04-第13章LabVIEW与其它软件的连接.wmv 4分45秒---9.99M---LabView05---第14章LabVIEW中子VI的设置及调用.wmv---F:/Resource/video/硬件/AltiumDesigner/LabView05-第14章LabVIEW中子VI的设置及调用.wmv 34分30秒---61.03M---LabView06---第15章其它高级技巧.wmv---F:/Resource/video/硬件/AltiumDesigner/LabView06-第15章其它高级技巧.wmv 9分41秒---11.37M---LabView07---第2章第一个LabVIEW例子.wmv---F:/Resource/video/硬件/AltiumDesigner/LabView07-第2章第一个LabVIEW例子.wmv 86分58秒---140.25M---LabView08---第3章基本元素.wmv---F:/Resource/video/硬件/AltiumDesigner/LabView08-第3章基本元素.wmv 76分48秒---143.72M---LabView09---第4章程序结构.wmv---F:/Resource/video/硬件/AltiumDesigner/LabView09-第4章程序结构.wmv 5分46秒---14.67M---LabView10---第5章数据采集.wmv---F:/Resource/video/硬件/AltiumDesigner/LabView10-第5章数据采集.wmv 12分50秒---18.35M---LabView11---第6章数据传输及电脑接口.wmv---F:/Resource/video/硬件/AltiumDesigner/LabView11-第6章数据传输及电脑接口.wmv 59分57秒---87.83M---LabView12---第7章数据的分析及处理.wmv---F:/Resource/video/硬件/AltiumDesigner/LabView12-第7章数据的分析及处理.wmv 42分4秒---61.02M---LabView13---第8章LabVIEW的信号调理.wmv---F:/Resource/video/硬件/AltiumDesigner/LabView13-第8章LabVIEW的信号调理.wmv 132分19秒---178.86M---LabView14---第9章分析处理中数学计算.wmv---F:/Resource/video/硬件/AltiumDesigner/LabView14-第9章分析处理中数学计算.wmv

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值