如何跨平臺調用ffmpeg?史上最簡單基於JavaCV跨平臺執行ffmpeg命令

前言

在此之前,博主寫了很多關於如何使用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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章