使用開源項(xiàng)目JAVAE2 進(jìn)行視頻格式轉(zhuǎn)換
使用開源項(xiàng)目JAVAE 進(jìn)行視頻格式轉(zhuǎn)換
JAVAE簡(jiǎn)介:
JAVE (Java音頻視頻編碼器)庫是ffmpeg項(xiàng)目的Java包裝器。開發(fā)人員可以利用JAVE2將音頻和視頻文件從一種格式轉(zhuǎn)換為另一種格式。在示例可以轉(zhuǎn)換成一個(gè)AVI文件MG,您可以更改一個(gè)DivX視頻(youtube) Flash FLV,您可以轉(zhuǎn)換WAV音頻文件到MP3和Ogg Vorbis,您可以分離和轉(zhuǎn)換音頻和視頻跟蹤代碼,您可以調(diào)整視頻,改變他們的大小和比例等。JAVE2還支持許多其他格式、容器和操作。
官網(wǎng)地址: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
快速上手
導(dǎo)包
<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("獲取視頻時(shí)長(zhǎng):{}", 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);
//截取視頻作為圖片保存
/*
*第一個(gè)參數(shù) 視頻源文件信息類
* 第二個(gè)參數(shù) 截取的寬度
* 第三個(gè)參數(shù) 截取的高度
* 第四個(gè)參數(shù) 截取的是那一幀
* 第五個(gè)參數(shù)是 截取的圖片質(zhì)量 1-31 數(shù)字越小質(zhì)量越高
*
**/
screenExtractor.renderOneImage(multimediaObject, size.getWidth(), size.getHeight(), 3000, target, 31);
}
} catch (EncoderException e) {
e.printStackTrace();
}
}
/**
* @param source 源文件
* @param targetPath 轉(zhuǎn)碼后的路徑
*/
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();
//設(shè)置視頻編碼
video.setCodec("h264");
if (ObjectUtil.isNotNull(bitRate)) {
//設(shè)置比特率
video.setBitRate(bitRate * 1000);
}
File target = new File(targetPath);
AudioAttributes audio = new AudioAttributes();
//設(shè)置編碼器名稱
audio.setCodec("aac");
EncodingAttributes attrs = new EncodingAttributes();
//設(shè)置轉(zhuǎn)換后的格式
attrs.setFormat("mp4");
attrs.setAudioAttributes(audio);
attrs.setVideoAttributes(video);
Encoder encoder = new Encoder();
encoder.encode(multimediaObject, target, attrs);
//花費(fèi)毫秒數(shù)
MultimediaObject multimediaObjectOfter = new MultimediaObject(Paths.get(targetPath).toFile());
MultimediaInfo info1 = multimediaObjectOfter.getInfo();
VideoInfo video1 = info1.getVideo();
VideoSize size1 = video1.getSize();
System.out.println("轉(zhuǎn)換后視頻寬:" + size1.getWidth());
System.out.println("轉(zhuǎn)換后視頻高:" + size1.getHeight());
System.out.println("轉(zhuǎn)換后視頻比特率:" + video1.getBitRate() / 1000);
System.out.println("轉(zhuǎn)換后視頻編碼:" + video1.getDecoder());
} catch (EncoderException e) {
e.printStackTrace();
}
}
}
效果 (flv 轉(zhuǎn)MP4)

以上就是使用開源項(xiàng)目JAVAE 進(jìn)行視頻格式轉(zhuǎn)換的詳細(xì)內(nèi)容,更多關(guān)于Java 視頻格式轉(zhuǎn)換的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Java工程使用ffmpeg進(jìn)行音視頻格式轉(zhuǎn)換的實(shí)現(xiàn)
- Java用20行代碼實(shí)現(xiàn)抖音小視頻批量轉(zhuǎn)換為gif動(dòng)態(tài)圖
- java僅用30行代碼就實(shí)現(xiàn)了視頻轉(zhuǎn)音頻的批量轉(zhuǎn)換
- java調(diào)用ffmpeg實(shí)現(xiàn)轉(zhuǎn)換視頻
- Java+Windows+ffmpeg實(shí)現(xiàn)視頻轉(zhuǎn)換功能
- 詳解java調(diào)用ffmpeg轉(zhuǎn)換視頻格式為flv
- java依賴jave-all-deps實(shí)現(xiàn)視頻格式轉(zhuǎn)換
相關(guān)文章
Java基礎(chǔ)之switch分支結(jié)構(gòu)詳解
這篇文章主要介紹了Java基礎(chǔ)之switch分支結(jié)構(gòu)詳解,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有很大的幫助,需要的朋友可以參考下2021-05-05
解決定時(shí)任務(wù)@Scheduled沒有準(zhǔn)時(shí)執(zhí)行的原因及分析
這篇文章主要介紹了解決定時(shí)任務(wù)@Scheduled沒有準(zhǔn)時(shí)執(zhí)行的原因及分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
解決MyEclipse6.5無法啟動(dòng),一直停留剛開始啟動(dòng)界面的詳解
本篇文章是對(duì)解決MyEclipse6.5無法啟動(dòng),一直停留剛開始啟動(dòng)界面的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
復(fù)雜JSON字符串轉(zhuǎn)換為Java嵌套對(duì)象的實(shí)現(xiàn)
這篇文章主要介紹了復(fù)雜JSON字符串轉(zhuǎn)換為Java嵌套對(duì)象的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
Mybatis-plus foreach拼接字符串查詢無數(shù)據(jù)返回問題
這篇文章主要介紹了Mybatis-plus foreach拼接字符串查詢無數(shù)據(jù)返回問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
springboot如何從數(shù)據(jù)庫獲取數(shù)據(jù),用echarts顯示(數(shù)據(jù)可視化)
這篇文章主要介紹了springboot如何從數(shù)據(jù)庫獲取數(shù)據(jù),用echarts顯示(數(shù)據(jù)可視化),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
MyBatis-Plus多表聯(lián)查的實(shí)現(xiàn)方法(動(dòng)態(tài)查詢和靜態(tài)查詢)
本文用示例介紹使用MyBatis-Plus進(jìn)行多表查詢的方法,包括靜態(tài)查詢和動(dòng)態(tài)查詢,通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2022-03-03
springboot zuul實(shí)現(xiàn)網(wǎng)關(guān)的代碼
這篇文章主要介紹了springboot zuul實(shí)現(xiàn)網(wǎng)關(guān)的代碼,在為服務(wù)架構(gòu)體系里,網(wǎng)關(guān)是非常重要的環(huán)節(jié),他實(shí)現(xiàn)了很多功能,具體哪些功能大家跟隨小編一起通過本文學(xué)習(xí)吧2018-10-10

