Jave2-Java音频视频编码器

文章目录

  • Jave2-Java音频视频编码器
    • Jave2是什么
  • Installation and requirements
    • Jave2 怎么玩
      • 支持的操作系统+要求
      • 支持 Maven/Gradle
      • 实战演练
        • 将arm文件转为mp3文件
        • 使用监听器监听转换进度-高级一点的用法
        • 问题收集
    • Jave2 总结

Jave2是什么

JAVE2(Java音频视频编码器)库是ffmpeg项目上的Java包装器。 开发人员可以利用JAVE2将音频和视频文件从一种格式转码为另一种格式。 在示例中,您可以将AVI文件转换为MPEG文件,可以将DivX视频流转换为(类似YouTube的)Flash FLV文件,可以将WAV音频文件转换为MP3或Ogg Vorbis文件,可以分离并 对音频和视频轨道进行转码,您可以调整视频的大小,更改其大小和比例等。
JAVE2支持许多其他格式,容器和操作。

Jave2 的首页上介绍:

JAVE2是一个小的Java库,它将ffmpeg包装到java类中。
它是基于Carlo Pelliccia的杰作。 由于不再维护该代码,因此我们采用了该代码,并用当前版本替换了ffmpeg可执行文件,并修改了代码以使其与新的二进制文件一起使用。

Jave2 是在Jave的基础上进行开发的,Jave基于Carlo Pelliccia的 Jave版本,带有源代码的原始项目页面可以在这里找到:
http://www.sauronsoftware.it/projects/jave/ 。我点击或许尘封很久的 Jave 网站,很庆幸打开了,然后看了下介绍个文档,真的是很久没更新了。

大致看了下Documentation,如下安装要求。

Installation and requirements

In order to use JAVE in your Java application, you have to add the file jave-1.0.jar in your application CLASSPATH.
JAVE runs on a Java Runtime Environment J2SE v.1.4 or later.

意思也就是要用JAVE的话,需要将_jave-1.0.jar _加入到应该的CLASSPATH下,然后JRE 的版本是J2SE v.1.4+。看了这句描述,你就应该知道这个项目是“古董”级别的项目了。

J2SE v.1.4 ,估计很多小伙伴只是听过,根本没有用过。

文档中其他的一些使用说明就不详细展开了,感兴趣的伙伴可以看下。地址上面已经贴出来。

Jave2 怎么玩

jave2 github :https://github.com/a-schild/jave2 ,看了下 四个月前还在更新

支持的操作系统+要求

Java8+ : 是不是很熟悉,这个应该是用过了吧,支持的操作系统那也是挺全面的。从“古董”过来的成为了“宝藏”。

支持 Maven/Gradle

从github描述上,支持Maven/Gradle的方式引入依赖的jar,比 jave1.0的时候需要先从官网download jar,然后 手动在加入应用的 CLASSPATH 还是高端很多。

Jave2包含两个主要组件:
1、 jave-core依赖关系,包括所有Java代码,与平台无关
2、 jave-nativebin- 依赖关系,其中包括每个平台的二进制可执行文件
有一个jave-all-deps项目,其中包括核心以及所有Windows和Linux二进制文件。

这里介绍下Maven的引入方式(使用前看下最新的版本号)

  • 支持平台的所有二进制文件
<dependency><groupId>ws.schild</groupId><artifactId>jave-all-deps</artifactId><version>2.7.3</version>
</dependency>

如果你想在一个或多个平台上使用,那么必须要引入 jave-core ,

<dependency><groupId>ws.schild</groupId><artifactId>jave-core</artifactId><version>2.7.3</version>
</dependency>

然后是平台的特定jar。

  • 如果仅在 Linux 64Bit 平台,则加入下面的依赖配置。
<dependency><groupId>ws.schild</groupId><artifactId>jave-nativebin-linux64</artifactId><version>2.7.3</version>
</dependency>
  • 如果仅在 Windows 64Bit 平台,则加入下面的依赖配置。
<dependency><groupId>ws.schild</groupId><artifactId>jave-nativebin-win64</artifactId><version>2.7.3</version>
</dependency>
  • 如果仅在 MACOS 64Bit 平台,则加入下面的依赖配置。
<dependency><groupId>ws.schild</groupId><artifactId>jave-nativebin-osx64</artifactId><version>2.7.3</version>
</dependency>

Gradle方式这里就不做介绍 ,自行看文档说明,也比较简单。

实战演练

我用的是window 64 ,引入了最新 2.7.3版本 jave-core 、 jave-nativebin-win64

将arm文件转为mp3文件

public class ArmToMp3Test {private static Logger logger = LoggerFactory.getLogger(ArmToMp3Test.class);public static void main(String[] args) {try {File source = new File("D:\\tmp\\Java编程技术乐园.amr");File target = new File("D:\\tmp\\java编程技术乐园amrToMp3.mp3");//Audio AttributesAudioAttributes audio = new AudioAttributes();audio.setCodec("libmp3lame");audio.setBitRate(128000);audio.setChannels(2);audio.setSamplingRate(44100);//Encoding attributesEncodingAttributes attrs = new EncodingAttributes();attrs.setFormat("mp3");attrs.setAudioAttributes(audio);//EncodeEncoder encoder = new Encoder();encoder.encode(new MultimediaObject(source), target, attrs);} catch (Exception ex) {logger.error("ArmToMp3Test#main 异常", ex);}}
}
// 执行完,在 D:\\tmp\Java编程技术乐园amrToMp3.mp3

使用监听器监听转换进度-高级一点的用法

用到 ws.schild.jave.EncoderProgressListener 接口:编码进度侦听器接口。 实现类的实例可以用来听的编码过程。

public interface EncoderProgressListener {/*** This method is called before the encoding process starts, reporting* information about the source stream that will be decoded and re-encoded.* 这种方法是在编码过程开始之前被调用,报告关于将被解码和再编码的源数据位流的信息.* @param info Informations about the source multimedia stream.*/public void sourceInfo(MultimediaInfo info);/*** This method is called to notify a progress in the encoding process.* 这种方法被称为通知在编码过程中的进度。* @param permil A permil value representing the encoding process progress.*/public void progress(int permil);/*** This method is called every time the encoder need to send a message* (usually, a warning).* 这种方法被称为每次编码器需要发送一条消息(通常,一个警告)。* @param message The message sent by the encoder.*/public void message(String message);}
  • MyChanageEncoderProgressListener
/*** 自定义实现 {@Link EncoderProgressListener}监听编码进度* @Author: dufy*/
public class MyChanageEncoderProgressListener implements EncoderProgressListener {private static Logger logger = LoggerFactory.getLogger(MyChanageEncoderProgressListener.class);@Overridepublic void sourceInfo(MultimediaInfo info) {long ls = info.getDuration() / 1000;int hour = (int) (ls / 3600);int minute = (int) (ls % 3600) / 60;int second = (int) (ls - hour * 3600 - minute * 60);String length = hour + "时" + minute + "分" + second + "秒";logger.info("MyChanageEncoderProgressListener#sourceInfo--->{}",info.toString());logger.info("MyChanageEncoderProgressListener#length--->{}",length);}@Overridepublic void progress(int permil) {logger.info("MyChanageEncoderProgressListener#progress--->{}",permil);}@Overridepublic void message(String message) {logger.info("MyChanageEncoderProgressListener#message--->{}",message);}
}
  • MovToMp4ListenerTest
public class MovToMp4ListenerTest {private static Logger logger = LoggerFactory.getLogger(MovToMp4ListenerTest.class);public static void main(String[] args) {try {File source = new File("D:\\tmp\\高清有码-小电影.mov");File target = new File("D:\\tmp\\高清无码-小电影.mp4");AudioAttributes audio = new AudioAttributes();audio.setCodec("libvorbis");VideoAttributes video = new VideoAttributes();video.setCodec("mpeg4");video.setBitRate(new Integer(160000));video.setFrameRate(new Integer(30));EncodingAttributes attrs = new EncodingAttributes();attrs.setFormat("mp4");attrs.setAudioAttributes(audio);attrs.setVideoAttributes(video);//EncodeEncoder encoder = new Encoder();encoder.encode(new MultimediaObject(source), target, attrs, new MyChanageEncoderProgressListener());} catch (Exception ex) {logger.error("MovToMp4ListenerTest#main 异常", ex);}}
}

这里 有两个点说明下:

  • 使用了监听器,能够监听 视频转换的进度

  • 获取了视频的时长,其实大小也是可以获取的。

hour + “时” + minute + “分” + second + "秒

注:因为音视频的编码格式挺多,很多编解码协议还没看。上面例子也是找的文档配置,如有不对,欢迎指出。

其实jave2还有很多高端的操作,后续有机会在整理出来。

问题收集

1、有说小伙伴在执行的时候遇到了

Cannot run program “C:\xxx\Local\Temp\jave\ffmpeg-amd64-2.7.3.exe”

ws.schild.jave.EncoderException: java.io.IOException: Cannot run program "C:\Users\acer\AppData\Local\Temp\jave\ffmpeg-amd64-2.7.3.exe": CreateProcess error=2, 系统找不到指定的文件。at ws.schild.jave.Encoder.encode(Encoder.java:640)at ws.schild.jave.Encoder.encode(Encoder.java:398)at ws.schild.jave.Encoder.encode(Encoder.java:363)at org.learn.jave2.ArmToMp3Test.main(ArmToMp3Test.java:35)

报这个错这就是没加 jave-nativebin-win64 这个依赖。
这里说明下,添加了win-64 jar,执行的时候会默认在本地下载一个 ffmpeg-amd64-2.7.3.exe 。
![image.png](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9jZG4ubmxhcmsuY29tL3l1cXVlLzAvMjAyMC9wbmcvMzcwMzgxLzE1ODkzNTk3Mjk4MDctNmZmMTI0N2QtOWRmYy00YTgwLTlmMTktZTEzMmExM2M4ZDA4LnBuZw?x-oss-process=image/format,png#align=left&display=inline&height=84&margin=[object Object]&name=image.png&originHeight=168&originWidth=520&size=10220&status=done&style=none&width=260)
相关源码:

Encoder encoder = new Encoder();public Encoder() {this.locator = new DefaultFFMPEGLocator();
}// DefaultFFMPEGLocatorpublic DefaultFFMPEGLocator() {// 获取操作系统类型String os = System.getProperty("os.name").toLowerCase();boolean isWindows = os.contains("windows");boolean isMac = os.contains("mac");LOG.debug("Os name is <{}> isWindows: {} isMac: {}", new Object[]{os, isWindows, isMac});File dirFolder = new File(System.getProperty("java.io.tmpdir"), "jave/");if (!dirFolder.exists()) {LOG.debug("Creating jave temp folder to place executables in <{}>", dirFolder.getAbsolutePath());dirFolder.mkdirs();} else {LOG.debug("Jave temp folder exists in <{}>", dirFolder.getAbsolutePath());}// 获取文件的后缀String suffix = isWindows ? ".exe" : (isMac ? "-osx" : "");String arch = System.getProperty("os.arch");// 获取 ffmpeg 文件,File ffmpegFile = new File(dirFolder, "ffmpeg-" + arch + "-" + "2.7.3" + suffix);LOG.debug("Executable path: {}", ffmpegFile.getAbsolutePath());if (ffmpegFile.exists()) {LOG.debug("Executable exists in <{}>", ffmpegFile.getAbsolutePath());} else {LOG.debug("Need to copy executable to <{}>", ffmpegFile.getAbsolutePath());this.copyFile("ffmpeg-" + arch + suffix, ffmpegFile);}if (!isWindows) {try {Runtime.getRuntime().exec(new String[]{"/bin/chmod", "755", ffmpegFile.getAbsolutePath()});} catch (IOException var9) {LOG.error("Error setting executable via chmod", var9);}}// 知道了文件的路径this.path = ffmpegFile.getAbsolutePath();LOG.debug("ffmpeg executable found: {}", this.path);
}
private void copyFile(String path, File dest) {// 拷贝文件代码,具体略
}

Jave2 总结

Jave 虽然不在维护了,但是 它的“哥哥” Jave2 出现了,功能还是很强大的,基本上能满足工作的一些对 音频视频 的操作了。
如果看了本文你也想玩一下这个工具,需要本文的演示代码以及相关文件(想看高清无码-小电影.mov)的话。可以关注公众号,回复 Jave2 获取。

如有其他问题,也欢迎留言,一起探讨交流。


Jave2-Java音频视频编码器相关推荐

  1. 推荐​一款Java音频视频编码器,很赞~

    Jave2是什么 JAVE2(Java音频视频编码器)库是ffmpeg项目上的Java包装器.开发人员可以利用JAVE2将音频和视频文件从一种格式转码为另一种格式.在示例中,您可以将AVI文件转换为M ...

  2. java音频解析_实例解析使用Java实现基本的音频播放器的编写要点

    Java音频播放,因为必须依赖到本地环境,所以JAVA在音频处理方面优势不大,或者说打从Java体系开发时就没太多的考虑音频播放因素,要知道最早的Java 1.1版本中,没有后来的javax.soun ...

  3. JAVA音频研究5:音频播放器(javax.sound学习指南,javax.sound学习实战)

    本代码将调用javax.sound库,讲解如何播放音频 得到能够使用的简易音频的播放器 本文可作为javax.sound学习指南,javax.sound学习实战等进行参考 相关内容请看下方代码与注释 ...

  4. 【Java音频操作】调用有道词典语音接口,生成单词MP3文件,支持自定义重复次数

    参考博客:Java爬虫-爬取四级词汇网站音频 运行效果 根据想要拼接的单词,生成一个单词朗读的mp3文件,可以自定义每个单词朗读时的重复次数. 代码思路: 先把要拼接的单词放进一个String数组中 ...

  5. java 音频播放器_JAVA音频播放器问题

    代码如下,请高手帮忙解决importjava.applet.*;importjava.awt.*;importjava.awt.event.*;importjava.io.*;importjava.n ...

  6. java音频剪切_Java使用IO流实现音频的剪切和拼接

    需求:使用IO流将指定目录下的若干个音频文件的高潮部分,进行剪切,并重新拼接成一首新的音频文件 思路(以两首歌为例): 第一首歌有一个输入流对象bis1.第二首歌有一个输入流对象bis2,他们公用一条 ...

  7. java 音频格式_java – 音频格式的转换

    我在转换WAV文件的音频格式时遇到了麻烦. 我正在录制麦克风的声音,声音按以下格式录制: PCM_SIGNED 44100.0 Hz,16位,单声道,2字节/帧 我想将上面的格式转换为 ULAW 80 ...

  8. java 音频转mp3,java实现wavToMP3格式转换

    这里需要用到一个jar包:jave-1.0.1.jar,下载地址的话自己百度吧. 废话不多说直接贴代码: import it.sauronsoftware.jave.AudioAttributes; ...

  9. java 音频可视化_OpenGL ES 实现可视化实时音频

    该原创文章首发于微信公众号字节流动 可视化实时音频 音频数据的采集 OpenGL 实现可视化实时音频的思路比较清晰,可以利用 Java 层的 API AudioRecorder 采集到未编码的音频裸数 ...

  10. Java 音频提升音量工具(附代码) | Java工具类

    目录 前言 Maven依赖 代码 总结 前言 本文提供将音频提升音量的java工具类代码,一如既往的实用主义分享. Maven依赖 <dependency><groupId>c ...

最新文章

  1. 使用HTML5的canvas做一个会动的时钟
  2. 我的Dll(动态链接库)学习笔记
  3. 近期几个电车调试视频
  4. JAVA调用R语言之Rserve(二)
  5. pycharm:格式化python代码
  6. leetcode 5077. 按列翻转得到最大值等行数(Flip Columns For Maximum Number of Equal Rows)
  7. teechart mysql_TeeChart 的应用
  8. linux安装gtk命令,Ubuntu 下安装 GTK2.0
  9. bzoj 2216: [Poi2011]Lightning Conductor(DP决策单调性)
  10. 数百台浪潮服务器支撑中石油油品加工生产系统
  11. PAIP。AHK IDE及相关DOC
  12. CentOS6.5修改系统语言为英语
  13. Python分析身份证所在地(省、市、区),生日,生肖,星座,代码,性别,校验码。
  14. 国产数据库清单(2020年第1季度)
  15. 单反相机的一般入门设置建议
  16. 蓝桥杯之《人民币金额大写》
  17. Point Attention Network for Semantic Segmentation of 3D Point Clouds 论文解析
  18. 河北易县八佛洼辽三彩罗汉造像
  19. 当公路的规则与秩序,被昇腾AI时刻守护
  20. IDEA maven 项目 POM文件变灰色或有个虫子(蜘蛛标记)

热门文章

  1. Android Studio开发
  2. 西瓜书重温(二): 模型评估与选择
  3. CSDN博客积分规则
  4. 计算机毕业设计——基于Spring Boot框架的网络游戏虚拟交易平台的设计与实现
  5. linux怎样打开终端命令,Linux命令-初学者入门之打开终端
  6. 漏洞自动扫描神器AWVS 11安装与使用教程
  7. 如何用计算机计算胸围,胸围尺码换算(罩杯自动计算器)
  8. css怎么去掉字体样式,css怎么去掉字体粗体样式
  9. OCR手写字体生成数据
  10. ccs船用计算机检验标准,CCS智能船舶规范体系全面解读