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基于jeeplus vue实现简单工作流过程图解

    Java基于jeeplus vue实现简单工作流过程图解

    这篇文章主要介绍了Java基于jeeplus vue实现简单工作流过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • 详解Spring Boot Security工作流程

    详解Spring Boot Security工作流程

    Spring Security,这是一种基于 Spring AOP 和 Servlet 。这篇文章主要介绍了Spring Boot Security的相关知识,需要的朋友可以参考下
    2019-04-04
  • 解决idea不显示Services工具栏的问题

    解决idea不显示Services工具栏的问题

    这篇文章主要介绍了解决idea不显示Services工具栏的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • SpringBoot配置全局异常处理器捕获异常详解

    SpringBoot配置全局异常处理器捕获异常详解

    spring-boot统一异常捕获,异常时相对于return的一种退出机制,可以由系统触发,下面这篇文章主要给大家介绍了关于SpringBoot配置全局异常处理器捕获异常的相关资料,需要的朋友可以参考下
    2023-04-04
  • Java基于TCP协议socket网络编程的文件传送的实现

    Java基于TCP协议socket网络编程的文件传送的实现

    这篇文章主要介绍了Java基于TCP协议socket网络编程的文件传送的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Spring Boot两种配置文件properties和yml区别

    Spring Boot两种配置文件properties和yml区别

    这篇文章主要为大家介绍了java面试中常见问到的Spring Boot两种配置文件properties和yml区别解答,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • 配置JAVA环境变量中CLASSPATH变量的作用

    配置JAVA环境变量中CLASSPATH变量的作用

    这篇文章主要介绍了配置JAVA环境变量中CLASSPATH变量的作用,需要的朋友可以参考下
    2023-06-06
  • 详解OpenAPI开发如何动态的添加接口实现

    详解OpenAPI开发如何动态的添加接口实现

    这篇文章主要为大家介绍了OpenAPI开发如何动态的添加接口实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • 详解使用spring cloud config来统一管理配置文件

    详解使用spring cloud config来统一管理配置文件

    这篇文章主要介绍了详解使用spring cloud config来统一管理配置文件,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • java开发使用BigDecimal避坑四则

    java开发使用BigDecimal避坑四则

    这篇文章主要为大家介绍了java开发使用BigDecimal的避坑四则,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07

最新评论