Jave2-Java音频视频编码器

Jave2-Java音频视频编码器文章目录Jave2-Java音频视频编码器Jave2是什么Installation and requirementsJave2 怎么玩支持的操作系统+要求支持 Maven/Gradle实战演练将arm文件转为mp3文件使用监听器监听转换进度-高级一点的用法问题收集Jave2 总结Jave2是什么JAVE2(Java音频视频编码器)库是ffmpeg项目上的Java包装器。 开发人员可以利用JAVE2将音频和视频文件从一种格式转码为另一种格式。 在示例中,您可以将AVI

大家好,又见面了,我是全栈君。

Jave2-Java音频视频编码器

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 Attributes
			AudioAttributes audio = new AudioAttributes();
			audio.setCodec("libmp3lame");
			audio.setBitRate(128000);
			audio.setChannels(2);
			audio.setSamplingRate(44100);

			//Encoding attributes
			EncodingAttributes attrs = new EncodingAttributes();
			attrs.setFormat("mp3");
			attrs.setAudioAttributes(audio);

			//Encode
			Encoder 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);
	@Override
	public 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);
	}

	@Override
	public void progress(int permil) { 
   
		logger.info("MyChanageEncoderProgressListener#progress--->{}",permil);
	}

	@Override
	public 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);

			//Encode
			Encoder 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();
}

// DefaultFFMPEGLocator

public 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 获取。
在这里插入图片描述
如有其他问题,也欢迎留言,一起探讨交流。


image.png | center| 747x519

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120975.html原文链接:https://javaforall.net

(0)
上一篇 2022年2月28日 下午11:00
下一篇 2022年2月28日 下午11:00


相关推荐

  • MATLAB—-输入和输出

    MATLAB—-输入和输出文章目录 1 输入语句 1 1 输入数值或矩阵 1 2 输入字符串 2 输出语句 2 1 输出单个字段 2 2 输出多个字段 1 输入语句 1 1 输入数值或矩阵 value1 input 请输入一个数值 value2 input 请输入一个矩阵 1 2 输入字符串输入字符串 需要加第二个参数 s string input 请输入一个字符串 s 2 输出语句使用 disp 函数可以输出 输出多个字段时 需要将多个字段转

    2025年7月2日
    4
  • 加密(对称、非对称),签名(算法),指纹和指纹算法,认证证书CA

    加密(对称、非对称),签名(算法),指纹和指纹算法,认证证书CAhttps www cnblogs com JeffreySun archive 2010 06 24 1627247 htmlhttps blog csdn net gdhgr article details 83302781 有一个问题 我在现代数字证书种看到 签名算法 sha256RSA 签名哈希算法 SHA256 指纹算法 sha1 指纹 20 字节 hash 之后在加密后

    2026年3月17日
    3
  • debian桌面环境和gnome的区别_debian安装桌面

    debian桌面环境和gnome的区别_debian安装桌面作者:Canbus转自:http://blog.csdn.net/canbus/article/details/8438089Debian6配置GNOME桌面环境1.安装xorgroot@debian:~#apt-getinstallxorg2.安装gdm(GNOMEDisplayManager)root@debian:~#

    2022年10月18日
    4
  • 用jsp写注冊页面

    用jsp写注冊页面

    2021年12月10日
    56
  • phpstrom2021激活码_在线激活

    (phpstrom2021激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月21日
    88
  • windows环境下,如何在Pycharm下安装TensorFlow环境「建议收藏」

    windows环境下,如何在Pycharm下安装TensorFlow环境「建议收藏」原文转自:https://blog.csdn.net/u012052268/article/details/74202439最近由于工作需要要使用TensorFlow,所以只能狂补相关的知识。本来博主打算在Ubantu上玩,但是由于一些原因还是放弃了这个想法,就转移到Pycharm上来玩。以下是自己在收集资料的过程中看到一篇很好的安装教程,分享一下。1.安装Anaconda选择相应的A…

    2022年8月25日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号