使用开源项目JAVAE2 进行视频格式转换
作者:懵懂小子 发布时间:2023-11-08 07:18:24
标签:开源项目,JAVAE2,视频格式转换,java
使用开源项目JAVAE 进行视频格式转换
JAVAE简介:
JAVE (Java音频视频编码器)库是ffmpeg项目的Java包装器。开发人员可以利用JAVE2将音频和视频文件从一种格式转换为另一种格式。在示例可以转换成一个AVI文件MG,您可以更改一个DivX视频(youtube) Flash FLV,您可以转换WAV音频文件到MP3和Ogg Vorbis,您可以分离和转换音频和视频跟踪代码,您可以调整视频,改变他们的大小和比例等。JAVE2还支持许多其他格式、容器和操作。
官网地址:https://www.mvnjar.com/ws.schild/jave-all-deps/2.4.2/detail.html
github地址:https://github.com/a-schild/jave2/tree/master/jave-example
maven地址:https://mvnrepository.com/artifact/ws.schild/jave-all-deps
快速上手
导包
<dependency>
<groupId>ws.schild</groupId>
<artifactId>jave-all-deps</artifactId>
<version>2.4.2</version>
</dependency>
工具类
package com.example.javae2.util;
import cn.hutool.core.util.ObjectUtil;
import ws.schild.jave.*;
import java.io.File;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;
public class VideoUtils {
private static Map<String, Integer> sizeBitRateMap;
static {
sizeBitRateMap = new HashMap<>();
sizeBitRateMap.put("1920*1080", 4992);
sizeBitRateMap.put("1280*720", 2496);
sizeBitRateMap.put("1024*576", 1856);
sizeBitRateMap.put("840*480", 1216);
sizeBitRateMap.put("768*432", 1088);
sizeBitRateMap.put("640*360", 896);
sizeBitRateMap.put("424*240", 576);
}
public static void main(String[] args) {
VideoUtils videoUtils = new VideoUtils();
videoUtils.convertVideoToMP4(new File("C:\\temp\\javae2\\0001.哔哩哔哩-颈椎操[流畅版].flv"),"C:\\temp\\javae2\\0001.哔哩哔哩-颈椎操[流畅版].mp4");
//videoUtils.getVideoInfoAndGenerateThumbnail(new File("C:\\\\temp\\\\javae2\\\\0001.哔哩哔哩-颈椎操[流畅版].mp4"), "C:\\\\temp\\\\javae2\\\\0001.哔哩哔哩-颈椎操[流畅版]..jpg");
}
/**
* 截取视频的一针作为封面图
*
* @param file 视频文件
* @param thumbnailPath 截取图片保存路径
* @return
*/
public void getVideoInfoAndGenerateThumbnail(File file, String thumbnailPath) {
MultimediaObject multimediaObject = new MultimediaObject(file);
try {
MultimediaInfo info = multimediaObject.getInfo();
VideoInfo videoInfo = info.getVideo();
logger.info("获取视频时长:{}", info.getDuration() / 1000);
if (ObjectUtil.isNotNull(videoInfo)) {
VideoSize size = videoInfo.getSize();
int width = size.getWidth();
int height = size.getHeight();
logger.info("视频宽:{} 视频高{}", width, height);
logger.info("比特率:{}", videoInfo.getBitRate() / 1000);
ScreenExtractor screenExtractor = new ScreenExtractor();
File target = new File(thumbnailPath);
//截取视频作为图片保存
/*
*第一个参数 视频源文件信息类
* 第二个参数 截取的宽度
* 第三个参数 截取的高度
* 第四个参数 截取的是那一帧
* 第五个参数是 截取的图片质量 1-31 数字越小质量越高
*
**/
screenExtractor.renderOneImage(multimediaObject, size.getWidth(), size.getHeight(), 3000, target, 31);
}
} catch (EncoderException e) {
e.printStackTrace();
}
}
/**
* @param source 源文件
* @param targetPath 转码后的路径
*/
public void convertVideoToMP4(File source, String targetPath) {
MultimediaObject multimediaObject = new MultimediaObject(source);
try {
MultimediaInfo info = multimediaObject.getInfo();
VideoInfo videoInfo = info.getVideo();
VideoSize size = videoInfo.getSize();
System.out.println("原视频宽:" + size.getWidth());
System.out.println("原视频高:" + size.getHeight());
System.out.println("原视频比特率:" + videoInfo.getBitRate() / 1000);
System.out.println("原视频编码:" + videoInfo.getDecoder());
Integer bitRate = sizeBitRateMap.get(size.getWidth() + "*" + size.getHeight());
VideoAttributes video = new VideoAttributes();
//设置视频编码
video.setCodec("h264");
if (ObjectUtil.isNotNull(bitRate)) {
//设置比特率
video.setBitRate(bitRate * 1000);
}
File target = new File(targetPath);
AudioAttributes audio = new AudioAttributes();
//设置编码器名称
audio.setCodec("aac");
EncodingAttributes attrs = new EncodingAttributes();
//设置转换后的格式
attrs.setFormat("mp4");
attrs.setAudioAttributes(audio);
attrs.setVideoAttributes(video);
Encoder encoder = new Encoder();
encoder.encode(multimediaObject, target, attrs);
//花费毫秒数
MultimediaObject multimediaObjectOfter = new MultimediaObject(Paths.get(targetPath).toFile());
MultimediaInfo info1 = multimediaObjectOfter.getInfo();
VideoInfo video1 = info1.getVideo();
VideoSize size1 = video1.getSize();
System.out.println("转换后视频宽:" + size1.getWidth());
System.out.println("转换后视频高:" + size1.getHeight());
System.out.println("转换后视频比特率:" + video1.getBitRate() / 1000);
System.out.println("转换后视频编码:" + video1.getDecoder());
} catch (EncoderException e) {
e.printStackTrace();
}
}
}
效果 (flv 转MP4)
来源:https://www.cnblogs.com/java-hardly-road/p/11820431.html
0
投稿
猜你喜欢
- 您已经看到很多包含视频内容的应用程序,比如带有视频教程的食谱应用程序、电影应用程序和体育相关的应用程序。您是否想知道如何将视频内容添加到您的
- 简介我们在使用flutter的过程中,有时候需要控制某些组件是否展示,一种方法是将这个组件从render tree中删除,这样这个组件就相当
- 废话开篇:iOS与android在实现列表界面的时候是有重用机制的,目的就是减少内存开销,用时间换空间。个人感觉flutter并没有特别强调
- 在分支较多的时候,switch的效率比if高,在反汇编中我们即可看到效率高的原因一、switch语句1、在正向编码时,switch语句可以看
- requestFoucs();无效。requestFoucsFromTouch();无效。webview.setTouchListener;
- 由于 Spring 拥有对象的管理权,所以我们也需要拥有较为高效的对象存储和取出的手段,下面我们来分别总结一下:存对象配置文件在存储对象之前
- 引出泛型我们通过如下的示例,引出为什么泛型的概念。public class Test {public static void main(St
- CSRF介绍CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click atta
- 一、前言对于任何框架而言,在使用前都要进行一系列的初始化,MyBatis也不例外。二、MyBatis的初始化做了什么2.1 Mybatis的
- 前几天网上突然出现流言:某东发生数据泄露12G,最终某东在一篇声明中没有否认,还算是勉强承认了吧,这件事对于一般人有什么影响、应该怎么做已经
- 参考:How to catch an Exception from a threadIs there a way to make Runna
- NDK部分1、下载ndk这里就一笔带过了。2、解压ndk不要解压,文件权限会出错。执行之,会自动解压,然后mv到想放的地方。我放到了”/us
- Android植物大战僵尸小游戏全部内容如下:相关下载:Android植物大战僵尸小游戏具体代码如下所示:package com.examp
- FileOutPutStream:子类,写出数据的通道步骤:1.获取目标文件2.创建通道(如果原来没有目标文件,则会自动创建一个)3.写入数
- 大家好,在这篇文章中,我们将学习如何添加动画,同时从一个页面到其他在 Flutter。我们将覆盖不同类型的动画和实现基本动画 Flutter
- 1、JavaBean介绍 * JavaBean的定义:JavaBeans是Java中一种特殊的类,可以将多个对象封装到一个对象(bean)
- 为什么要使用路由在之前我们的代码中,页面跳转使用的代码如下所示:Navigator.of(context).push( Mate
- SlidingDrawer效果想必大家也见到过,它就是1.5模拟器上进入应用程序列表的效果。下面是截图一、简介 SlidingDr
- 实现的效果图:自定义Fragment继承BottomSheetDialogFragment重写它的三个方法:onCreateDialog()
- 前言先放一个官网吧,其实本案例就是根据官网案例来的,只是进行了修改配置。Mybatis-plus官网一、搭建一个springboot项目&n