zoukankan      html  css  js  c++  java
  • 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.html

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

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

    快速上手

    导包
    <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

  • 相关阅读:
    张硕组兽棋测试报告(整理——郑云飞)
    5.6任务进展情况(整理——郑云飞)
    5.5任务进展情况(整理——祁子梁)
    android-读取MediaProvider
    android-effect
    window下载android 最新源码
    android-mediaplayer播放
    android-基础编程-Notification
    android-基础编程-ViewPager
    android-glsurfaceview Activity框架程序
  • 原文地址:https://www.cnblogs.com/java-hardly-road/p/11820431.html
Copyright © 2011-2022 走看看