Java工程使用ffmpeg进行音视频格式转换的实现

 更新时间:2024年02月07日 10:06:43   作者:和光同尘ss  
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序,本文主要介绍了Java工程使用ffmpeg进行音视频格式转换的实现

ws.schild简介

JAVE (Java Audio Video Encoder)是一个纯Java的音视频编码器和解码器库,它是基于FFmpeg。JAVE库提供了一些简单易用的API,用于音频和视频格式的转换、编码、解码等操作。它对于一些基本的音视频处理任务来说是一个不错的选择。

这些库都是基于FFmpeg的,并允许在Java中处理音频和视频文件。使用它们可以避免直接调用外部的FFmpeg命令行工具,而是通过Java API来实现音频格式转换等操作。

ws.schild是目前主流的对视频和音频进行转码、裁剪以及提取操作的JAVE工具包。

一、主要工具类简介

1. VideoAttributes

VideoAttributes是ws.schild工具包中对视频属性设置的重要工具类,是ws.schild实现对视频操作的重中之重,同时也是应用最多的一个类。

使用心得:(下文中video为该类的实例化对象)

1.video的Quality(视频质量)属性对转码后视频的大小有很大的影响,并且对转码的时间也有一定的影响,主要影响视频质量,参数类型是整形,数值越小表示质量越高。

2.video的size(视频尺寸)属性对转码后视频的大小有较大的影响,并且对转码的时间也有一定的影响,参数类型是VideoSize。

3.video的BitRate(比特率)属性对转码视频的大小和时间都影响较大,主要影响视频的流畅程度,一般设置的需要大一些,如100k(针对已测试过的视频,不敢保证普遍性)。

4.video的Codec(编解码器)属性一般设置为mpeg4或者h264。

5.video的FrameRate(帧率)属性不要设置的太低,一般设置为15及以上,如果设置太小视频会不流畅。

2. AudioAttributes

AudioAttributes是ws.schild工具包中对音频属性设置的重要工具类。

二、使用步骤

1. 导入ws.schild的jar包

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

在maven库里可以看到ws.schild其下有好几个包

  • jave-core
  • jave-nativebin-win32
  • jave-nativebin-win64
  • jave-nativebin-linux32
  • jave-nativebin-linux64
  • jave-nativebin-osx64

jave-all-deps 是最完整的,它的pom.xml引用了所有版本的文件

看名字就能看出,jave-core是核心包,其它几个是windows、linux、maxosx系统下的本地文件。其实nativebin里面就是一个类似ffmpeg.exe的文件,程序在运行时拼接参数,再调用对应的ffmpeg去执行。

首先在pom文件中导入第三方jar包:

	<dependency>
      <groupId>ws.schild</groupId>
      <artifactId>jave-all-deps</artifactId>
      <version>3.3.1</version>
    </dependency>

确定运行平台后可以将其他包排除,如服务在Linux系统跑,就可以将Windows、macos平台的包排除。

        <dependency>
            <groupId>ws.schild</groupId>
            <artifactId>jave-all-deps</artifactId>
            <version>3.3.1</version>
            <exclusions>
                 <exclusion>
                    <groupId>ws.schild</groupId>
                    <artifactId>jave-nativebin-win32</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>ws.schild</groupId>
                    <artifactId>jave-nativebin-win64</artifactId>
                </exclusion> 
                <exclusion>
                    <groupId>ws.schild</groupId>
                    <artifactId>jave-nativebin-osx64</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>ws.schild</groupId>
                    <artifactId>jave-nativebin-osxm1</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

2. 实现视频的转码

将视频转码为H.264编码(包括音频转码):

/**
     * 视频转码
     * @param videoSource
     * @param videoTarget
     * @return true or false
     */
    public static boolean videoToVideo(String videoSource, String videoTarget) {
//        Date time = new Date();
//        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");
//        System.out.println(simpleDateFormat.format(time));

        long start = System.currentTimeMillis();

        File source = new File(videoSource);
        File target = new File(videoTarget);

        AudioAttributes audio = new AudioAttributes();
        audio.setCodec("aac");
        audio.setBitRate(236000 / 2);
        audio.setChannels(2);
        audio.setSamplingRate(8000);

        VideoAttributes video = new VideoAttributes();
        video.setCodec("h264");
        video.setBitRate(1000000);
        video.setFrameRate(25);
        video.setQuality(4);
//        video.setSize(new VideoSize(720, 480));

        EncodingAttributes attrs = new EncodingAttributes();
        attrs.setOutputFormat("mp4");
        attrs.setAudioAttributes(audio);
        attrs.setVideoAttributes(video);


        Encoder encoder = new Encoder();
        try {
            encoder.encode(new MultimediaObject(source), target, attrs);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println(encoder.getUnhandledMessages());
            return false;
        }finally {
//            time = new Date();
//            System.out.println(simpleDateFormat.format(time));
            long end = System.currentTimeMillis();
            System.out.println("总耗时:"+ (end-start) +"ms");
        }
    }

3. 实现音频的转码

将音频转码为mp3编码:

audioPath可以为amr、wav、m4r等其他音频格式的文件。

/**
     * 音频转换为mp3格式,audioPath可更换为要转换的音频格式
     * @param audioPath
     * @param mp3Path
     */
    public static void toMp3(String audioPath,String mp3Path){
        File source = new File(audioPath);
        File target = new File(mp3Path);
        AudioAttributes audio = new AudioAttributes();
        audio.setCodec("libmp3lame");
        audio.setBitRate(128000);
        audio.setChannels(2);
        audio.setSamplingRate(44100);

        EncodingAttributes attrs = new EncodingAttributes();
        attrs.setOutputFormat("mp3");
        attrs.setAudioAttributes(audio);
        Encoder encoder = new Encoder();
        try {
            encoder.encode(new MultimediaObject(source), target, attrs);
        } catch (EncoderException e) {
            e.printStackTrace();
        }
    }

4. 实现视频文件转为音频文件

将视频转为音频:

/**
     * 视频文件转音频文件
     * @param videoPath
     * @param audioPath
     * return true or false
     */
    public static boolean videoToAudio(String videoPath, String audioPath){
        File fileMp4 = new File(videoPath);
        File fileMp3 = new File(audioPath);

        AudioAttributes audio = new AudioAttributes();
        audio.setCodec("libmp3lame");
        audio.setBitRate(128000);
        audio.setChannels(2);
        audio.setSamplingRate(44100);

        EncodingAttributes attrs = new EncodingAttributes();
        attrs.setOutputFormat("mp3");
        attrs.setAudioAttributes(audio);
        Encoder encoder = new Encoder();
        MultimediaObject mediaObject = new MultimediaObject(fileMp4);
        try{
            encoder.encode(mediaObject,fileMp3,attrs);
            Log.info("File MP4 convertito MP3");
            return true;
        }catch (Exception e){
            Log.error("File non convertito");
            Log.error(e.getMessage());
            return false;
        }
    }

总结

执行原理大致是:

1、服务启动后ws.schild工具包会将与运行系统匹配的ffmpeg可执行文件,一般Windows系统是将ffmpeg-amd64-3.3.1.exe下载到此路径下:C:\Users\xxx\AppData\Local\Temp\jave (xxx是你的用户文件)。

2、用java代码拼接ffmpeg指令的参数,以及源文件路径和目标文件路径,而后调用encode语句将指令发给ffmpeg执行。

ffmpeg指令的参数讲解可以看看上一篇文章:ffmpeg安装及音频转换指令应用(win10)

综上,ws.schild 工具包可以非常方便的帮助我们实现对视频和音频的转码和裁剪等操作,并且可以通过设置不同参数来满足不同的需求。但是就目前的测试结果而言,不同的编码格式对于参数的敏感度可能不同,具体场景应该具体分析。

参考链接:

https://github.com/a-schild/jave2

https://www.jb51.net/program/315429ev9.htm

https://blog.csdn.net/liuchongming/article/details/106994861

到此这篇关于Java工程使用ffmpeg进行音视频格式转换的实现的文章就介绍到这了,更多相关Java ffmpeg音视频转换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅析对Spring aware接口理解

    浅析对Spring aware接口理解

    通过aware接口可以获取Spring容器相关信息,但这样会与Spring容器耦合,这篇文章主要介绍了Spring aware接口理解,需要的朋友可以参考下
    2022-08-08
  • Springboot中JWT登录校验及其拦截器实现方法

    Springboot中JWT登录校验及其拦截器实现方法

    这篇文章主要介绍了Springboot中JWT登录校验及其拦截器实现方法的相关资料,包括引入Maven坐标、获取Token、JWT拦截器的实现和配置,通过这些步骤可以实现后端对用户登录的身份校验,需要的朋友可以参考下
    2025-11-11
  • Java实现微信小程序加密数据解密算法

    Java实现微信小程序加密数据解密算法

    我们开发微信小程序的过程中,我们的服务端有时需要获取微信提供的开放数据。微信会对这些开放数据做签名和加密处理,本文通过实例代码给大家介绍Java实现微信小程序加密数据解密算法,感兴趣的朋友一起看看吧
    2021-11-11
  • JavaWeb 实现验证码功能(demo)

    JavaWeb 实现验证码功能(demo)

    在 WEB-APP 中一般应用于:登录、注册、买某票、秒杀等场景,大家都接触过这个验证码操作,今天小编通过实例代码给大家讲解javaweb实现验证码功能,需要的朋友参考下
    2017-02-02
  • java蓝桥杯历年真题及答案整理(小结)

    java蓝桥杯历年真题及答案整理(小结)

    这篇文章主要介绍了java蓝桥杯历年真题及答案整理(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • RocketMQ实现消息分发的步骤

    RocketMQ实现消息分发的步骤

    RocketMQ 实现消息分发的核心机制是通过 Topic、Queue 和 Consumer Group 的配合实现的,下面给大家介绍RocketMQ实现消息分发的步骤,感兴趣的朋友一起看看吧
    2024-03-03
  • JVM(Java虚拟机)简介(动力节点Java学院整理)

    JVM(Java虚拟机)简介(动力节点Java学院整理)

    Java虚拟机(Jvm)是可运行Java代码的假想计算机。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。对java jvm 虚拟机感兴趣的朋友通过本文一起学习吧
    2017-04-04
  • Java设计模式之java策略模式详解

    Java设计模式之java策略模式详解

    这篇文章主要介绍了Java经典设计模式之策略模式,简单说明了策略模式的概念、原理并结合实例形式分析了java策略模式的具有用法与相关注意事项,需要的朋友可以参考下
    2021-09-09
  • Java ArrayList与LinkedList使用方法详解

    Java ArrayList与LinkedList使用方法详解

    Java中容器对象主要用来存储其他对象,根据实现原理不同,主要有3类常用的容器对象:ArrayList使用数组结构存储容器中的元素、LinkedList使用链表结构存储容器中的元素
    2022-11-11
  • Mybatis批处理、Mysql深分页操作

    Mybatis批处理、Mysql深分页操作

    这篇文章主要介绍了Mybatis批处理、Mysql深分页操作,Mybatis批量操作包括Foreach方式和ExecutorType.BATCH插入操作,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08

最新评论