javaCV入門指南:調用FFmpeg原生API和JavaCV是如何封裝了FFmpeg的音視頻操作?

 

通過“javaCV入門指南:序章 ”大家知道了處理音視頻流媒體的前置基本知識,基本知識包含了像素格式、編解碼格式、封裝格式、網絡協議以及一些音視頻專業名詞,專業名詞不會贅述,自行搜索即可。

本章將正式開始javaCV之旅,先看一下官方文檔裏的介紹

JavaCV是計算機視覺領域的開發人員(OpenCV、FFmpeg、libdc1394、PGR FlyCapture、OpenKinect、li.lsense、CL PS3 Eye Driver、videoInput、ARToolKitPlus、flandmark、Leptonica和Tesseract)常用庫的JavaCPP預置的包裝器,並提供實用的程序類使它們的功能更容易在Java平臺上使用,包括Android。

JavaCV還提供了硬件加速的全屏圖像顯示(CanvasFrame和GLCanvasFrame)、在多核(並行)上並行執行代碼的簡便方法、照相機和投影機的用戶友好的幾何和顏色校準(GeometricCalibrator,ProCamometricCalibrato)r,ProCamColorCalibrator),特徵點的檢測和匹配(ObjectFinder),一組用於實現投影儀-照相機系統的直接圖像對齊的類(主要是GNImageAligner、ProjectiveTransformer、ProjectiveColorTransformer、ProCamTransformer和ReflectanceInitializer),一個blob分析包(BLUB),以及JavaCV類中的各種功能。其中一些類還具有OpenCL和OpenGL的對應類,它們的名稱以CL結尾或以GL開始,即:JavaCVCL、GLCanvasFrame等。

要了解如何使用API,因爲文檔目前缺乏,請參考下面的示例用法部分以及示例程序,包括兩個用於Android(FACEPREVIEW.Java和ReordActudio.java)的示例程序,它們也在示例目錄中找到。您可能還發現參考ProCamCalib和ProCamTracker的源代碼以及從OpenCV2 Cookbook和相關聯的wiki頁面移植的示例很有用。


請隨時告訴我任何更新或修復你的代碼,使我可以將它們集成到下一個版本。謝謝您!如果您遇到軟件問題,請隨時在郵件列表上提問。我相信這還遠遠不夠完美…(我覺得這個最後一段纔是最重要的,所以保留了這一段原話)

既然知道javaCV封裝了這麼多庫,也不囉嗦了,直接就從我們需要的並且也是最需要的FFmpeg部分開始吧。

支持eguid原創文章,歡迎一起交流討論:

流媒體技術③羣: 556722677(①②羣已滿,請加③羣)

流媒體技術①羣: 371249677(已滿)

一、什麼是JavaCPP

大家知道FFmpeg是C語言中著名的音視頻庫(注意,不是c++。使用c++調用ffmpeg庫的性能損失與Java方式調用損耗相差並不大)。

JavaCV利用JavaCPP在FFmpeg和Java之間構建了橋樑,我們通過這個橋樑可以方便的調用FFmpeg,當然這並不是沒有損失的,性能損失暫且不提,最主要問題在於調用ffmpeg之於jvm是native方法,所以通過ffmpeg創建的結構體實例與常量、方法等等都是使用堆外內存,都需要像C那樣手動的釋放這些資源(jvm並不會幫你回收這部分),以此來保證不會發生內存溢出/泄露等風險。

Javapp在Java內部提供了對本地C++的高效訪問,這與一些C/C++編譯器與彙編語言交互的方式不同。不需要發明新的語言,比如SWIG、SIP、C++、CLI、Cython或Rython。相反,類似於CPpyy爲Python所做的努力,它利用了Java和C++之間的語法和語義相似性。在引擎蓋下,它使用JNI,因此除了Java、SE和RoboVM(指令)之外,它還適用於Java SE的所有實現...

詳細描述請參考:https://github.com/bytedeco/javacpp

二、javaCPP直接調用FFmpeg的API

我們通過《視頻拉流解碼成YUVJ420P,並保存爲jpg圖片》作爲實例來闡述,實例地址:

https://blog.csdn.net/eguid_1/article/details/81369055

這部分內容主要是如何調用FFmpeg的API,本系列作爲JavaCV入門不會講解FFmpeg的具體用法,如果想要深入學習FFmpeg部分,可以選擇通過查看FFmpeg的API手冊ffmpeg.org,或者訪問雷霄驊的博客詳細學習FFmpeg的使用。

 

三、JavaCV是如何封裝了FFmpeg的音視頻操作?

JavaCV通過JavaCPP調用了FFmpeg,並且對FFmpeg複雜的操作進行了封裝,把視頻處理分成了兩大類:“幀抓取器”(FrameGrabber)和“幀錄製器”(又叫“幀推流器”,FrameRecorder)以及用於存放音視頻幀的Frame(FrameFilter暫且不提)。

整體結構如下:

視頻源---->幀抓取器(FrameGabber) ---->抓取視頻幀(Frame)---->幀錄製器(FrameRecorder)---->推流/錄製---->流媒體服務/錄像文件

1、幀抓取器(FrameGrabber)

封裝了FFmpeg的檢索流信息,自動猜測視頻解碼格式,音視頻解碼等具體API,並把解碼完的像素數據(可配置像素格式)或音頻數據保存到Frame中返回。

2、幀錄製器/推流器(FrameRecorder)

封裝了FFmpeg的音視頻編碼操作和封裝操作,把傳參過來的Frame中的數據取出並進行編碼、封裝、發送等操作流程。

3、幀(Frame)

用於存放音視頻幀(圖像像素和音頻採樣數據,如果沒有配置FrameGrabber的像素格式和音頻格式,那麼默認解碼後的視頻格式是yuv420j,音頻則是pcm採樣數據)

 

 

 

下一章:幀抓取器(FrameGrabber)的原理與應用

 

 

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