Java 視頻格式轉換和編碼轉換

java 視頻轉碼和格式轉換

使用開源項目JAVAE 進行視頻格式轉換

JAVAE簡介:
JAVE (Java音頻視頻編碼器)庫是ffmpeg項目的Java包裝器。開發人員能夠利用JAVE2將音頻和視頻文件從一種格式轉換爲另外一種格式。在示例能夠轉換成一個AVI文件MG,您能夠更改一個DivX視頻(youtube) Flash FLV,您能夠轉換WAV音頻文件到MP3和Ogg Vorbis,您能夠分離和轉換音頻和視頻跟蹤代碼,您能夠調整視頻,改變他們的大小和比例等。JAVE2還支持許多其餘格式、容器和操做。

官網地址:https://www.mvnjar.com/ws.schild/jave-all-deps/2.4.2/detail.htmlhtml

github地址:https://github.com/a-schild/jave2/tree/master/jave-examplejava

maven地址:https://mvnrepository.com/artifact/ws.schild/jave-all-depsgit

快速上手

導包
<dependency>
    <groupId>ws.schild</groupId>
    <artifactId>jave-all-deps</artifactId>
    <version>2.4.2</version>
</dependency>

工具類

package com.example.javae2.util;


import cn.hutool.core.util.ObjectUtil;
import ws.schild.jave.*;

import java.io.File;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;

public class VideoUtils {



    private static Map<String, Integer> sizeBitRateMap;

    static {
        sizeBitRateMap = new HashMap<>();
        sizeBitRateMap.put("1920*1080", 4992);
        sizeBitRateMap.put("1280*720", 2496);
        sizeBitRateMap.put("1024*576", 1856);
        sizeBitRateMap.put("840*480", 1216);
        sizeBitRateMap.put("768*432", 1088);
        sizeBitRateMap.put("640*360", 896);
        sizeBitRateMap.put("424*240", 576);
    }


    public static void main(String[] args) {
        VideoUtils videoUtils = new VideoUtils();
        videoUtils.convertVideoToMP4(new File("C:\\temp\\javae2\\0001.嗶哩嗶哩-頸椎操[流暢版].flv"),"C:\\temp\\javae2\\0001.嗶哩嗶哩-頸椎操[流暢版].mp4");

        //videoUtils.getVideoInfoAndGenerateThumbnail(new File("C:\\\\temp\\\\javae2\\\\0001.嗶哩嗶哩-頸椎操[流暢版].mp4"), "C:\\\\temp\\\\javae2\\\\0001.嗶哩嗶哩-頸椎操[流暢版]..jpg");


    }

    /**
     * 截取視頻的一針做爲封面圖
     *
     * @param file          視頻文件
     * @param thumbnailPath 截取圖片保存路徑
     * @return
     */
    public void getVideoInfoAndGenerateThumbnail(File file, String thumbnailPath) {
        MultimediaObject multimediaObject = new MultimediaObject(file);
        try {
            MultimediaInfo info = multimediaObject.getInfo();
            VideoInfo videoInfo = info.getVideo();
            logger.info("獲取視頻時長:{}", info.getDuration() / 1000);
            if (ObjectUtil.isNotNull(videoInfo)) {
                VideoSize size = videoInfo.getSize();
                int width = size.getWidth();
                int height = size.getHeight();
                logger.info("視頻寬:{} 視頻高{}", width, height);
                logger.info("比特率:{}", videoInfo.getBitRate() / 1000);
                ScreenExtractor screenExtractor = new ScreenExtractor();
                File target = new File(thumbnailPath);
                //截取視頻做爲圖片保存
                /*
                *第一個參數 視頻源文件信息類
                * 第二個參數 截取的寬度
                * 第三個參數  截取的高度
                * 第四個參數  截取的是那一幀
                * 第五個參數是  截取的圖片質量 1-31   數字越小質量越高
                *
                **/
                screenExtractor.renderOneImage(multimediaObject, size.getWidth(), size.getHeight(), 3000, target, 31);

            }
        } catch (EncoderException e) {
            e.printStackTrace();
        }

    }


    /**
     * @param source     源文件
     * @param targetPath 轉碼後的路徑
     */
    public void convertVideoToMP4(File source, String targetPath) {
        MultimediaObject multimediaObject = new MultimediaObject(source);
        try {
            MultimediaInfo info = multimediaObject.getInfo();
            VideoInfo videoInfo = info.getVideo();
            VideoSize size = videoInfo.getSize();
            System.out.println("原視頻寬:" + size.getWidth());
            System.out.println("原視頻高:" + size.getHeight());
            System.out.println("原視頻比特率:" + videoInfo.getBitRate() / 1000);
            System.out.println("原視頻編碼:" + videoInfo.getDecoder());

            Integer bitRate = sizeBitRateMap.get(size.getWidth() + "*" + size.getHeight());
            VideoAttributes video = new VideoAttributes();
            //設置視頻編碼
            video.setCodec("h264");

            if (ObjectUtil.isNotNull(bitRate)) {
                //設置比特率
                video.setBitRate(bitRate * 1000);
            }
            File target = new File(targetPath);
            AudioAttributes audio = new AudioAttributes();
            //設置編碼器名稱
            audio.setCodec("aac");
            EncodingAttributes attrs = new EncodingAttributes();
            //設置轉換後的格式
            attrs.setFormat("mp4");
            attrs.setAudioAttributes(audio);
            attrs.setVideoAttributes(video);
            Encoder encoder = new Encoder();
            encoder.encode(multimediaObject, target, attrs);
            //花費毫秒數

            MultimediaObject multimediaObjectOfter = new MultimediaObject(Paths.get(targetPath).toFile());
            MultimediaInfo info1 = multimediaObjectOfter.getInfo();
            VideoInfo video1 = info1.getVideo();
            VideoSize size1 = video1.getSize();

            System.out.println("轉換後視頻寬:" + size1.getWidth());
            System.out.println("轉換後視頻高:" + size1.getHeight());
            System.out.println("轉換後視頻比特率:" + video1.getBitRate() / 1000);
            System.out.println("轉換後視頻編碼:" + video1.getDecoder());

        } catch (EncoderException e) {
            e.printStackTrace();
        }
    }



}

效果 (flv 轉MP4)

image

相關文章
相關標籤/搜索