JavaCV 採集攝影機及桌面影片數據
javacv 封裝了javacpp-presets庫很多native API,簡化了開發,對java程式設計師來說比較友好。
之前使用JavaCV庫都是使用ffmpeg native API開發,這種方式使用起來太多坑了,還是使用JavaCV封裝好的庫開發方便。
引入依賴
前幾天剛剛發布了1.5.5,這裡使用最新的javacv依賴:
<properties>
<javacpp.version>1.5.5</javacpp.version>
</properties>
<dependencies>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv</artifactId>
<version>${javacpp.version}</version>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv-platform</artifactId>
<version>${javacpp.version}</version>
</dependency>
</dependencies>
OpenCVFrameGrabber採集攝影機數據
javacv的demo中有攝影機及麥克風采集音影片數據的例子(WebcamAndMicrophoneCapture
),例子採集攝影機數據使用的就是OpenCVFrameGrabber
,影片畫面回顯採用的是CanvasFrame
。
public class Sample01_Camera {
@SuppressWarnings("resource")
public static void main(String[] args) throws Exception {
OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
grabber.setImageWidth(1280);
grabber.setImageHeight(720);
grabber.start();
CanvasFrame canvas = new CanvasFrame("攝影機");
canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
canvas.setAlwaysOnTop(true);
while (canvas.isDisplayable()) {
canvas.showImage(grabber.grab());
TimeUnit.MILLISECONDS.sleep(40);
}
grabber.stop();
}
}
畫面預覽效果圖:
FFmpegFrameGrabber採集攝影機數據
FFmpegFrameGrabber採集攝影機數據需要指定輸入,如:video=Integrated Camera
,這裡Integrated Camera
是攝影機的設備名。
可以通過以下方式獲取攝影機設備名:
- 打開「電腦管理」->「設備管理器」->「照相機」
- 使用ffmpeg命令,具體查看之前我的文章 JavaCV FFmpeg採集攝影機YUV影片數據
採用FFmpeg查看本機設備的命令:
ffmpeg.exe -list_devices true -f dshow -i dummy
FFmpegFrameGrabber的使用方式跟OpenCVFrameGrabber的方式是一樣的,只不過OpenCVFrameGrabber指定的是設備索引,而FFmpegFrameGrabber指定設備輸入。
public class Sample02_Camera {
@SuppressWarnings("resource")
public static void main(String[] args) throws Exception {
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber("video=Integrated Camera");
grabber.setImageWidth(1280);
grabber.setImageHeight(720);
grabber.setFormat("dshow");
grabber.start();
CanvasFrame canvas = new CanvasFrame("攝影機");
canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
canvas.setAlwaysOnTop(true);
while (canvas.isDisplayable()) {
canvas.showImage(grabber.grab());
TimeUnit.MILLISECONDS.sleep(40);
}
grabber.stop();
}
}
FFmpegFrameGrabber採集桌面數據
FFmpegFrameGrabber採集桌面採用gdigrab
,參考雷神的部落格 FFmpeg源程式碼簡單分析:libavdevice的gdigrab。
public class Sample03_Desktop {
// //blog.csdn.net/leixiaohua1020/article/details/44597955
@SuppressWarnings("resource")
public static void main(String[] args) throws Exception {
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber("desktop");
grabber.setFormat("gdigrab");
grabber.setOption("offset_x", "0");
grabber.setOption("offset_y", "0");
grabber.setOption("framerate", "25");
grabber.setOption("draw_mouse", "0");
grabber.setOption("video_size", "1920x1080");
// 這種形式,雙螢幕有問題
// grabber.setImageWidth(1920);
// grabber.setImageWidth(1080);
grabber.start();
CanvasFrame canvas = new CanvasFrame("攝影機");
canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
canvas.setAlwaysOnTop(true);
while (canvas.isDisplayable()) {
canvas.showImage(grabber.grab());
TimeUnit.MILLISECONDS.sleep(40);
}
grabber.stop();
}
}
畫面預覽效果圖:
這裡由於我的電腦是2K屏,這裡1920×1080隻是截圖了螢幕的一部分。
=========================================================
關注公眾號,閱讀更多關於javacv的文章。