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音视频转换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java方法签名为何不包含返回值类型

    Java方法签名为何不包含返回值类型

    这篇文章主要介绍了Java方法签名为何不包含返回值类型,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • 解决@RequestBody接收json对象报错415的问题

    解决@RequestBody接收json对象报错415的问题

    这篇文章主要介绍了解决@RequestBody接收json对象报错415的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • 一小时迅速入门Mybatis之bind与多数据源支持 Java API

    一小时迅速入门Mybatis之bind与多数据源支持 Java API

    这篇文章主要介绍了一小时迅速入门Mybatis之bind与多数据源支持 Java API,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • Go&java算法之最大数示例详解

    Go&java算法之最大数示例详解

    这篇文章主要为大家介绍了Go&java算法之最大数示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Java动态数组添加数据的方法与应用示例

    Java动态数组添加数据的方法与应用示例

    这篇文章主要介绍了Java动态数组添加数据的方法,结合实例形式详细分析了Java动态数组的创建、添加、查找、打印等相关操作技巧,需要的朋友可以参考下
    2019-11-11
  • Springboot如何通过自定义工具类获取bean

    Springboot如何通过自定义工具类获取bean

    这篇文章主要介绍了Springboot通过自定义工具类获取bean方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java中Stream Filter多条件筛选过滤代码举例

    Java中Stream Filter多条件筛选过滤代码举例

    这篇文章主要给大家介绍了关于Java中Stream Filter多条件筛选过滤的相关资料,Java Stream中的filter方法可以使用多个条件来过滤数据,文中给出了详细的代码示例,需要的朋友可以参考下
    2023-12-12
  • Springboot使用SPI注册bean到spring容器的示例代码

    Springboot使用SPI注册bean到spring容器的示例代码

    这篇文章主要介绍了Springboot使用SPI注册bean到spring容器,主要包括mydriver接口,mysqldriver实现过程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • java 工厂模式的实例详解

    java 工厂模式的实例详解

    这篇文章主要介绍了java 工厂模式的实例详解的相关资料,这里举例说明该如何实现工厂模式,需要的朋友可以参考下
    2017-09-09
  • SpringBoot项目整合Redis教程详解

    SpringBoot项目整合Redis教程详解

    这篇文章主要介绍了SpringBoot项目整合Redis教程详解,Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库。感兴趣的小伙伴可以参考阅读本文
    2023-03-03

最新评论