經過「javaCV入門指南:序章 」你們知道了處理音視頻流媒體的前置基本知識,基本知識包含了像素格式、編解碼格式、封裝格式、網絡協議以及一些音視頻專業名詞,專業名詞不會贅述,自行搜索便可。java
本章將正式開始javaCV之旅,先看一下官方文檔裏的介紹c++
JavaCV是計算機視覺領域的開發人員(OpenCV、FFmpeg、libdc139四、PGR FlyCapture、OpenKinect、li.lsense、CL PS3 Eye Driver、videoInput、ARToolKitPlus、flandmark、Leptonica和Tesseract)經常使用庫的JavaCPP預置的包裝器,並提供實用的程序類使它們的功能更容易在Java平臺上使用,包括Android。git
JavaCV還提供了硬件加速的全屏圖像顯示(CanvasFrame和GLCanvasFrame)、在多核(並行)上並行執行代碼的簡便方法、照相機和投影機的用戶友好的幾何和顏色校準(GeometricCalibrator,ProCamometricCalibrato)r,ProCamColorCalibrator),特徵點的檢測和匹配(ObjectFinder),一組用於實現投影儀-照相機系統的直接圖像對齊的類(主要是GNImageAligner、ProjectiveTransformer、ProjectiveColorTransformer、ProCamTransformer和ReflectanceInitializer),一個blob分析包(BLUB),以及JavaCV類中的各類功能。其中一些類還具備OpenCL和OpenGL的對應類,它們的名稱以CL結尾或以GL開始,即:JavaCVCL、GLCanvasFrame等。github
要了解如何使用API,由於文檔目前缺少,請參考下面的示例用法部分以及示例程序,包括兩個用於Android(FACEPREVIEW.Java和ReordActudio.java)的示例程序,它們也在示例目錄中找到。您可能還發現參考ProCamCalib和ProCamTracker的源代碼以及從OpenCV2 Cookbook和相關聯的wiki頁面移植的示例頗有用。網絡
請隨時告訴我任何更新或修復你的代碼,使我能夠將它們集成到下一個版本。謝謝您!若是您遇到軟件問題,請隨時在郵件列表上提問。我相信這還遠遠不夠完美…(我以爲這個最後一段纔是最重要的,因此保留了這一段原話)app
既然知道javaCV封裝了這麼多庫,也不囉嗦了,直接開始吧。jvm
支持eguid原創文章,歡迎一塊兒交流討論:ide
流媒體技術③羣: 556722677(①②羣已滿,請加③羣)性能
流媒體技術①羣: 371249677(已滿)學習
你們知道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
咱們經過《視頻拉流解碼成YUVJ420P,並保存爲jpg圖片》做爲實例來闡述,實例地址:
http://www.javashuo.com/article/p-ytvxcksz-cq.html
這部份內容主要是如何調用FFmpeg的API,本系列做爲JavaCV入門不會講解FFmpeg的具體用法,若是想要深刻學習FFmpeg部分,能夠選擇經過查看FFmpeg的API手冊ffmpeg.org,或者訪問雷霄驊的博客詳細學習FFmpeg的使用。
JavaCV經過JavaCPP調用了FFmpeg,而且對FFmpeg複雜的操做進行了封裝,把視頻處理分紅了兩大類:「幀抓取器」(FrameGrabber)和「幀錄製器」(又叫「幀推流器」,FrameRecorder)以及用於存放音視頻幀的Frame(FrameFilter暫且不提)。
總體結構以下:
視頻源---->幀抓取器(FrameGabber) ---->抓取視頻幀(Frame)---->幀錄製器(FrameRecorder)---->推流/錄製---->流媒體服務/錄像文件
封裝了FFmpeg的檢索流信息,自動猜想視頻解碼格式,音視頻解碼等具體API,並把解碼完的像素數據(可配置像素格式)或音頻數據保存到Frame中返回。
封裝了FFmpeg的音視頻編碼操做和封裝操做,把傳參過來的Frame中的數據取出並進行編碼、封裝、發送等操做流程。
用於存放音視頻幀(圖像像素和音頻採樣數據,若是沒有配置FrameGrabber的像素格式和音頻格式,那麼默認解碼後的視頻格式是yuv420j,音頻則是pcm採樣數據)
下一章:幀抓取器(FrameGrabber)的原理與應用