柚子快報邀請碼778899分享:Java音視頻文件解析工具
柚子快報邀請碼778899分享:Java音視頻文件解析工具
文章目錄
一 jave-all-deps二 具體用法2.1 添加依賴2.2 視頻轉(zhuǎn)音頻2.3 視頻格式轉(zhuǎn)換2.4 獲取視頻時長
三 總結(jié)
小伙伴們知道,松哥平時錄了蠻多視頻課程,視頻錄完以后,就想整理一個視頻文檔出來,在整理視頻文檔的時候,就會遇到一個問題,就是怎么統(tǒng)計視頻時長?
特別是有時候為了方便大家看到每一集視頻的時長,我要把視頻目錄整理成下面這個樣子:
這個逐集去查看就很麻煩,一套視頻動輒幾百集,挨個統(tǒng)計不現(xiàn)實,也不符合咱們程序員做事風(fēng)格。
那么怎么辦呢?
一開始我是使用 Python 去解決的,Python 做這樣一個小工具其實特別方便,簡簡單單 30 行代碼左右就能搞定了。之前的課程的這些時間統(tǒng)計我基本上都是用 Python 去完成的。
不過最近松哥發(fā)現(xiàn) Java 里邊其實也有一個視頻處理的庫,做這個事情也是非常方便,而且使用 Java 屬于主場作戰(zhàn),就能夠更加靈活的擴展功能了。
一 jave-all-deps
在 Java 開發(fā)中,處理音視頻文件經(jīng)常需要復(fù)雜的編解碼操作,開發(fā)者通常需要依賴于外部庫來實現(xiàn)這些功能,其中最著名的是 FFmpeg。然而,直接在 Java 中使用 FFmpeg 并不是一件容易的事,因為它需要處理本地庫和復(fù)雜的命令行接口。
幸運的是,jave-all-deps 庫提供了一個簡潔而強大的解決方案,讓 Java 開發(fā)者能夠輕松地進行音視頻文件的轉(zhuǎn)碼和處理。
jave-all-deps 是 JAVE2(Java Audio Video Encoder)項目的一部分,它是一個基于 ffmpeg 項目的 Java 封裝庫。JAVE2 通過提供一套簡單易用的 API,允許 Java 開發(fā)者在不直接處理 ffmpeg 復(fù)雜命令的情況下,進行音視頻文件的格式轉(zhuǎn)換、轉(zhuǎn)碼、剪輯等操作。
jave-all-deps 庫特別之處在于它集成了核心 Java 代碼和所有支持平臺的二進制可執(zhí)行文件,使得開發(fā)者無需手動配置 ffmpeg 環(huán)境,即可在多個操作系統(tǒng)上無縫使用。
是不是非常方便?
整體上來說,jave-all-deps 幫我們解決了三大類問題:
跨平臺兼容性問題:音視頻處理往往涉及到不同的操作系統(tǒng)和硬件架構(gòu),jave-all-deps 庫提供了針對不同平臺的預(yù)編譯 ffmpeg 二進制文件,使得開發(fā)者無需擔(dān)心平臺兼容性問題。復(fù)雜的命令行操作:ffmpeg 雖然功能強大,但其命令行接口復(fù)雜且難以記憶。jave-all-deps 通過封裝 ffmpeg 的命令行操作,提供了簡潔易用的 Java API,降低了使用門檻。依賴管理:在項目中集成音視頻處理功能時,往往需要處理多個依賴項。jave-all-deps 庫將核心代碼和所有必要的二進制文件打包在一起,簡化了依賴管理。
簡單來說,就是你想在項目中使用 ffmpeg,但是又嫌麻煩,那么就可以使用 jave-all-deps 這個工具封裝后的 ffmpeg,簡單快捷!
二 具體用法
jave-all-deps 庫提供了多種音視頻處理功能,松哥這里來和大家演示幾個常見的。
2.1 添加依賴
添加依賴有兩種方式,一種就是添加所有的依賴庫,如下:
這個庫中包含了不同平臺所依賴的庫的內(nèi)容。
也可以根據(jù)自己平臺選擇不同的依賴庫,這種方式需要首先添加 java-core:
然后再根據(jù)自己使用的不同平臺,繼續(xù)添加不同依賴庫:
Linux 64 位 amd/intel:
Linux 64 位 arm:
Linux 32 位 arm:
Windows 64 位:
MacOS 64 位:
2.2 視頻轉(zhuǎn)音頻
將視頻文件從一種格式轉(zhuǎn)換為另一種格式,例如將 AVI 文件轉(zhuǎn)換為 MPEG 文件。
File source = new File("D:\\AI智能體\\mp4\\01.大模型有什么缺陷.mp4");
File target = new File("D:\\AI智能體\\mp4\\01.大模型有什么缺陷.mp3");
AudioAttributes audio = new AudioAttributes();
audio.setCodec("libmp3lame");
audio.setBitRate(128000);
audio.setChannels(2);
audio.setSamplingRate(44100);
EncodingAttributes attrs = new EncodingAttributes();
attrs.setOutputFormat("mp3");
attrs.setAudioAttributes(audio);
Encoder encoder = new Encoder();
encoder.encode(new MultimediaObject(source), target, attrs);
2.3 視頻格式轉(zhuǎn)換
將一種視頻格式轉(zhuǎn)換為另外一種視頻格式,例如將 mp4 轉(zhuǎn)為 flv:
File source = new File("D:\\AI智能體\\mp4\\01.大模型有什么缺陷.mp4");
File target = new File("D:\\AI智能體\\mp4\\01.大模型有什么缺陷.flv");
AudioAttributes audio = new AudioAttributes();
audio.setCodec("libmp3lame");
audio.setBitRate(64000);
audio.setChannels(1);
audio.setSamplingRate(22050);
VideoAttributes video = new VideoAttributes();
video.setCodec("flv");
video.setBitRate(160000);
video.setFrameRate(15);
video.setSize(new VideoSize(400, 300));
EncodingAttributes attrs = new EncodingAttributes();
attrs.setOutputFormat("flv");
attrs.setAudioAttributes(audio);
attrs.setVideoAttributes(video);
Encoder encoder = new Encoder();
encoder.encode(new MultimediaObject(source), target, attrs);
2.4 獲取視頻時長
這個就是松哥的需求了,我這塊舉個簡單例子。
public class App {
static SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("mm:ss");
public static void main(String[] args) throws EncoderException {
System.out.println("輸入視頻目錄:");
String dir = new Scanner(System.in).next();
File folder = new File(dir);
List
outputVideoTime(files);
}
private static void outputVideoTime(List
for (String file : files) {
File video = new File(file);
if (video.isFile() && !video.getName().startsWith(".") && video.getName().endsWith(".mp4")) {
MultimediaObject multimediaObject = new MultimediaObject(video);
long duration = multimediaObject.getInfo().getDuration();
String s = "%s %s";
System.out.println(String.format(s, video.getName(), DATE_FORMAT.format(duration)));
} else if (video.isDirectory()) {
System.out.println(video.getName());
outputVideoTime(sort(video));
}
}
}
public static List
return Arrays.stream(folder.listFiles()).map(f -> f.getAbsolutePath()).sorted(String.CASE_INSENSITIVE_ORDER).collect(Collectors.toList());
}
}
這段代碼基本上都是 Java 基礎(chǔ)語法,沒啥難的,我也就不多說了。有不明白的地方歡迎加松哥微信討論。
其實 Java 解決這個似乎也不難,也就是 20 行代碼左右,似乎和 Python 不相上下。
三 總結(jié)
jave-all-deps 庫是 Java 音視頻處理領(lǐng)域的一個強大工具,它通過封裝 ffmpeg 的復(fù)雜功能,為 Java 開發(fā)者提供了一個簡單易用的音視頻處理解決方案。該庫解決了跨平臺兼容性問題、簡化了復(fù)雜的命令行操作,并簡化了項目中的依賴管理。無論是進行格式轉(zhuǎn)換、音頻轉(zhuǎn)碼還是其他音視頻處理任務(wù),jave-all-deps 庫都是一個值得考慮的選擇。
通過本文的介紹,希望能夠幫助讀者更好地理解和使用 jave-all-deps 庫。
柚子快報邀請碼778899分享:Java音視頻文件解析工具
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。