javaCV系列文章:
javaCV開發詳解之2:推流器實現,推本地攝像頭視頻到流媒體服務器以及攝像頭錄製視頻功能實現(基於javaCV-FFMPEG、javaCV-openCV)
javaCV開發詳解之3:收流器實現,錄製流媒體服務器的rtsp/rtmp視頻文件(基於javaCV-FFMPEG)
javaCV開發詳解之4:轉流器實現(也可作爲本地收流器、推流器,新增添加圖片及文字水印,視頻圖像幀保存),實現rtsp/rtmp/本地文件轉發到rtmp流媒體服務器(基於javaCV-FFMPEG)
javaCV開發詳解之5:錄製音頻(錄製麥克風)到本地文件/流媒體服務器(基於javax.sound、javaCV-FFMPEG)
javaCV開發詳解之6:本地音頻(話筒設備)和視頻(攝像頭)抓取、混合並推送(錄製)到服務器(本地)
javaCV開發詳解之7:讓音頻轉換更加簡單,實現通用音頻編碼格式轉換、重採樣等音頻參數的轉換功能(以pcm16le編碼的wav轉mp3爲例)
javaCV開發詳解之8:轉封裝在rtsp轉rtmp流中的應用(無須轉碼,更低的資源消耗,更好的性能,更低延遲)
補充篇:
javaCV開發詳解補充篇:基於avfoundation的蘋果Mac和ios獲取屏幕畫面及錄屏/截屏以及攝像頭畫面和音頻採樣獲取實現
音視頻編解碼問題:javaCV如何快速進行音頻預處理和解複用編解碼(基於javaCV-FFMPEG)
音視頻編解碼問題:16/24/32位位音頻byte[]轉換爲小端序short[],int[],以byte[]轉short[]爲例
javacpp-ffmpeg系列:
javacpp-FFmpeg系列之1:視頻拉流解碼成YUVJ420P,並保存爲jpg圖片
javacpp-FFmpeg系列之2:通用拉流解碼器,支持視頻拉流解碼並轉換爲YUV、BGR24或RGB24等圖像像素數據
javacpp-FFmpeg系列之3: 圖像數據轉換(BGR與BufferdImage互轉,RGB與BufferdImage互轉)
javacpp-FFmpeg系列補充:FFmpeg解決avformat_find_stream_info檢索時間過長問題
javacpp-opencv系列:
一、javaCV圖像處理之1:實時視頻添加文字水印並截取視頻圖像保存成圖片,實現文字水印的字體、位置、大小、粗度、翻轉、平滑等操作
二、javaCV圖像處理之2:實時視頻添加圖片水印,實現不同大小圖片疊加,圖像透明度控制
三、javacv圖像處理3:使用opencv原生方法遍歷攝像頭設備及調用(方便多攝像頭遍歷及調用,相比javacv更快的攝像頭讀取速度和效率,方便讀取後的圖像處理)
歡迎大家積極開心的加入討論羣,羣號:371249677 (點擊這裏進羣)
前言
javacv開發包是用於支持java多媒體開發的一套開發包,可以適用於本地多媒體(音視頻)調用以及音視頻,圖片等文件後期操作(圖片修改,音視頻解碼剪輯等等功能),這裏只使用最簡單的本地攝像頭調用來演示一下javacv的基礎功能
重要:
建議使用最新javaCV1.5版本,該版本已解決更早版本中已發現的大部分bug
javacv系列文章使用6個jar包:
javacv.jar,javacpp.jar,ffmpeg.jar,ffmpeg-系統平臺.jar,opencv.jar,opencv-系統平臺.jar。
其中ffmpeg-系統平臺.jar,opencv-系統平臺.jar中的系統平臺根據開發環境或者測試部署環境自行更改爲對應的jar包,比如windows7 64位系統替換爲ffmpeg-x86-x64.jar
爲什麼要這樣做:因爲ffmpeg-系統平臺.jar中存放的是c/c++本地so/dll庫,而ffmpeg.jar就是使用javacpp封裝的對應本地庫java接口的實現,而javacpp就是基於jni的一個功能性封裝包,方便實現jni,javacv.jar就是對9個視覺庫進行了二次封裝,但是實現的功能有限,所以建議新手先熟悉openCV和ffmpeg這兩個C/C++庫的API後再來看javaCV思路就會很清晰了。
須知:
javacv系列文章默認音視頻處理使用ffmpeg,圖像處理使用opencv,攝像頭抓取使用opencv
javacv官方github維護地址:https://github.com/bytedeco/javacv
1、使用最新的javacv1.5.2
(注意:從其他地方下載的依賴包請積極開心的替換爲官方jar包和博主提供jar包;如果使用其他jar包版本而導致出錯,不要急着找博主問爲啥會報錯,先把jar包替換了再試試看)
(1)使用maven添加依賴
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv-platform</artifactId>
<version>1.4.4</version>
</dependency>
(2)使用gradle添加依賴
dependencies {
compile group: 'org.bytedeco', name: 'javacv-platform', version: '1.4.4'
}
(3)使用本地jar包方式
最新版實在太大,需要下載全量包的請到官方github.com/bytedeco/javacv下載
javaCV1.3.3版本下載(全量包,文件名:javacv-platform-1.3.3-bin.zip,大小:212M):http://download.csdn.net/download/eguid_1/10146035
javaCV1.3版本下載:
1、javacv1.3核心包:http://download.csdn.net/detail/eguid_1/9716960(包含javacv.jar,javacpp.jar和javacv-platform.jar)
2、javacv1.3-opencv包集合:http://download.csdn.net/detail/eguid_1/9716965
3、javacv1.3-ffmpeg包集合:http://download.csdn.net/detail/eguid_1/9719323
javaCV1.3所有jar包集合:http://download.csdn.net/detail/eguid_1/9719343
javaCV1.2所有jar包集合在這裏下載:http://download.csdn.net/album/detail/3171
jar包使用須知:
windows x64平臺用到的opencv依賴:opencv.jar;oepncv-windows-x86_64.jar(其他平臺替換爲對應的jar包即可)。
補充:
1、如果是蘋果mac系統,把oepncv-windows-x86_64.jar替換成這個包opencv-macosx-x86_64.jar
2、linux平臺替換成這個包:opencv-linux-x86_64.jar3、安卓平臺替換成opencv-android-arm.jar 或者opencv-android-x86.jar
maven和gradle方式如果想要減小依賴包大小,則需要手動進行排除不需要的平臺依賴即可
2、爲什麼不需要安裝opencv?
從javacv0.8開始,已經不需要本地安裝opencv,直接通過引用opencv對應的系統平臺的引用包即可。
(比如oepncv-windows-x86_64.jar就是典型的64位windows環境依賴包)
3、java通過javacv獲取windows的攝像頭視頻
最終調用的攝像頭實時視頻圖像界面:
預覽本機攝像頭視頻圖像的簡單實現:
/**
* 文件名:javavcCameraTest.java
* 描述:調用windows平臺的攝像頭窗口視頻
* 修改時間:2016年6月13日
* 修改內容:
*/
package cc.eguid.javacv;
import javax.swing.JFrame;
import org.bytedeco.javacv.CanvasFrame;
import org.bytedeco.javacv.OpenCVFrameConverter;
import org.bytedeco.javacv.FrameGrabber.Exception;
import org.bytedeco.javacv.OpenCVFrameGrabber;
/**
* 調用本地攝像頭窗口視頻
* @author eguid
* @version 2016年6月13日
* @see javavcCameraTest
* @since javacv1.2
*/
public class JavavcCameraTest
{
public static void main(String[] args) throws Exception, InterruptedException
{
OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
grabber.start(); //開始獲取攝像頭數據
CanvasFrame canvas = new CanvasFrame("攝像頭");//新建一個窗口
canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
canvas.setAlwaysOnTop(true);
while(true)
{
if(!canvas.isDisplayable())
{//窗口是否關閉
grabber.stop();//停止抓取
System.exit(2);//退出
}
canvas.showImage(grabber.grab());//獲取攝像頭圖像並放到窗口上顯示, 這裏的Frame frame=grabber.grab(); frame是一幀視頻圖像
Thread.sleep(50);//50毫秒刷新一次圖像
}
}
}
是不是很簡單,原本很複雜的流媒體操作,javaCV能夠幫助我們快速實現。
支持eguid原創
下一章將會講解如何把本地攝像頭的視頻錄製成文件以及推送到流媒體服務器
javaCV開發詳解之2:推流器實現和攝像頭錄製視頻功能(支持windows/linux/mac/Android/ios全平臺)