使用开源项目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


猜你喜欢
- 在网上看到了一个IOS组件PendulumView,实现了钟摆的动画效果。由于原生的进度条确实是不好看,所以想可以自定义View实现这样的效
- 如下所示:package java.util;public interface Enumeration<E> { boolean
- 因为在framework中想添加这个功能,所以写了个appliction来实现一下获取正在运行的应用程序: 还是先看图吧: 这个app主要是
- 前言万事开头难,写文章也是,现在越来越不知道开头怎么写了,所以在前言中,简单介绍下RxJava吧,第一次听说还是以前做Android开发的时
- vue3新增effectScope相关的API其官方的描述是创建一个 effect 作用域,可以捕获其中所创建的响应式副作用 (即计算属性和
- Jfreechart本身不能生成SVG图形,但是可以借助另外一个东西,辅助生成.好像是这个:batik ,具体代码请看下文一:Java生成s
- AtomicInteger 类底层存储一个int值,并提供方法对该int值进行原子操作。AtomicInteger 作为java.util.
- 先看看效果图:package wuwang.tools.utils; import java.io.File; import java.io
- 映射匹配兼容性前面我们已经能从表中查询出数据,并将数据封装到模型类中,这整个过程涉及到一张表和一个模型类:之所以数据能够成功的从表中获取并封
- Java中PriorityQueue通过二叉小顶堆实现,可以用一棵完全二叉树表示。本文从Queue接口函数出发,结合生动的图解,深入浅出地分
- 使用开源框架是,可以直接复制源代码到自己的项目(本人在Android Studio中操作报R程序包不存在),也可以使用jar包,下面记录一下
- synchronized是Java里的一个关键字,起到的一个效果是“监视器锁”~~,它的功能就是保证操作的原子性,同时禁止指令重排序和保证内
- 问题为了避免空指针调用,我们经常会看到这样的语句:if (someobject != null) { someob
- @Autowired注解和静态方法及new关系一、@autowired 与new new出来的对象无法调用@Autowired注入
- 在很多其他框架中,比如Python的Flask、node.js的KOA,Controller要想能够响应前端的请求都需要我们主动去注册到应用
- 一、ThreadPool概述提供一个线程池,该线程池可用于执行任务、发送工作项、处理异步 I/O、代表其他线程等待以及处理计时器。创建线程需
- axMapControl1是主控件,axMapControl2是鹰眼控件要看清楚事件响应 1.鹰眼地图资源载入privatevoi
- 在多线程编程中,最简单的方法,无非就是利用 AfxBeginThread 来创建一个工作线程,看一下这个函数的说明:CWinTh
- 一,项目简介项目编号:BS-SC-029本系统主要为种值水果和农户和水果经销商搭建一个B2B的电子商务平台,系统共包含三个角色:农户、经销商
- 本文较为详细的分析了Java中对象的销毁方法。分享给大家供大家参考。具体分析如下:Java中的基本数据类型变量和对象的名称引用变量如定义在方