文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java工程使用ffmpeg进行音视频格式转换(ws.schild)

2023-09-03 22:38

关注

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为该类的实例化对象)

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

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

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

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

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

      ws.schild      jave-all-deps      3.3.1    

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

                    ws.schild            jave-all-deps            3.3.1                                                 ws.schild                    jave-nativebin-win32                                                    ws.schild                    jave-nativebin-win64                                                     ws.schild                    jave-nativebin-osx64                                                    ws.schild                    jave-nativebin-osxm1                                    

2. 实现视频的转码

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

    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等其他音频格式的文件。

    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. 实现视频文件转为音频文件

将视频转为音频:

    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)_和光同尘ss的博客-CSDN博客

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

参考链接:

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

https://blog.csdn.net/qq_42070413/article/details/117993445

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

来源地址:https://blog.csdn.net/eleanoryss/article/details/131478829

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯