前言
在此之前,博主寫了很多關於如何使用JavaCV的教程,例如《JavaCV五合一教程合集》《JavaCV入門教程》、《JavaCV實戰教程》等等,不一一贅述,這些都是通過JavaCV的跨平台能力調用ffmpeg/opencv/tesserac等庫的api。本章,博主將帶領小伙伴們認識一個新的“跨平台”調用ffmpeg的方式。
咱們先來看看ffmpeg命令和javacv方式對比。
ffmpeg命令與JavaCV方式對比
例如這個轉流的簡單例子:
ffmpeg -i rtmp:/A -f flv -vcodec copy -acodec copy rtmp://B
。
ffmpeg命令的JavaCV跨平台等價替換
在JavaCV中,這個命令的等價替換代碼是:
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber("rtmp:/A");
grabber.start();
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder("rtmp://B");
recorder.setFormat("flv");
recorder.start(grabber.getFormatContext());
for(;;){
recorder.recordPacket(grabber.grabPacket());
}
使用JavaCV方式的優點
借助JavaCV和ffmpeg的api,可以獲取每個音/視頻幀和圖像、音頻采樣,並可以二次處理后(使用opencv進行人臉檢測識別或者添加視頻濾鏡、音頻濾波),再進行推流或者是錄制成hls/mp4分片文件等等操作。
通過上述對比,大家應該都看出來當然是使用FFmpeg更簡單易用。但是ffmpeg本身並不能跨平台,如果要在代碼中以跨平台方式執行ffmpeg命令,還需要編譯各個平台下和各個指令集的ffmpeg。比如windows平台下需要編譯和加載各個指令集(x86、amd64、arm64、armel、armhf、i386、mips、mips64el、mipsel、ppc64el、s390x)的
的ffmpeg.exe。
而想要讓ffmpeg在linux各個發行版上跨平台,還需要知道ffmpeg在各個發行版都不通用,需要編譯和加載各個發行版(debian、ubuntu、fedora、redhat/centos)下的各個指令集(x86、amd64、arm64、armel、armhf、i386、mips、mips64el、mipsel、ppc64el、s390x。
蘋果mac平台就不講了。
那么,有沒有更簡單的辦法能夠跨平台調用ffmpeg命令行呢?
如何基於JavaCV跨平台調用ffmpeg命令
在項目中引入JavaCV依賴
maven方式:
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv-platform</artifactId>
<version>1.5.6</version>
</dependency>
gradle方式:
dependencies {
implementation group: 'org.bytedeco', name: 'javacv-platform', version: '1.5.6'
}
Leiningen方式
:dependencies [
[org.bytedeco/javacv-platform "1.5.6"]
]
sbt方式:
libraryDependencies += "org.bytedeco" % "javacv-platform" % "1.5.6"
基於JavaCV跨平台調用ffmpeg命令
通過String ffmpeg = Loader.load(org.bytedeco.ffmpeg.ffmpeg.class);
就可以獲取JavaCV中的ffmpeg本地庫的調用路徑。
/**
* 史上最簡單的方式調用javacv中的ffmpeg本地程序
* @author eguid
*/
public static void main(String[] args){
String ffmpeg = Loader.load(org.bytedeco.ffmpeg.ffmpeg.class);
ProcessBuilder pb = new ProcessBuilder(ffmpeg, "-i", "/path/to/input.mp4", "-vcodec", "h264", "/path/to/output.mp4");
pb.inheritIO().start().waitFor();
}
通過這種方式,就可以不需要編譯各個平台(windows/linux各個發行版/安卓/mac/ios)下各個指令集的ffmpeg了。直接借助JavaCV的跨平台性,與原生ffmpeg一樣執行各種ffmpeg命令了。
是不是很簡單?
如果覺得博主寫得還不錯,歡迎大家“關注、點贊、收藏”一鍵三連支持博主原創!!!
本文首發自CSDN