天天看點

javaCV開發詳解之9:基于gdigrab的windows螢幕畫面抓取/采集(基于javacv的螢幕截屏、錄屏功能)

javaCV系列文章:

      javacv開發詳解之1:調用本機攝像頭視訊       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開發詳解之9:基于gdigrab的windows螢幕畫面抓取/采集(基于javacv的螢幕截屏、錄屏功能)     javaCV開發詳解之10:基于dshow調用windows攝像頭視訊和音頻,想要擷取螢幕畫面首選gdigrab     javaCV開發詳解之11:視訊檔案轉gif動态圖檔實作,也支援錄影機、桌面螢幕、流媒體等視訊源轉gif     javaCV開發詳解之12:視訊轉apng動态圖檔實作,支援透明通道,支援錄影機、桌面螢幕、流媒體等視訊源轉apng動态圖  javaCV開發詳解之13:使用FFmpeg Filter過濾器處理音視訊  javaCV開發詳解之14:音頻重采樣  javaCV開發詳解之15:視訊幀像素格式轉換  javaCV開發詳解之16:使用一張圖檔推流和一張圖檔錄制成視訊檔案  javaCV開發詳解之17:GIF和APNG動态圖檔推流和錄制成視訊檔案(以gif轉mp4為例)  javaCV開發詳解之18:音視訊轉碼(音頻編解碼和視訊編解碼)  JavaCV開發詳解之19:如何開啟GPU硬體加速,使用JavaCV進行音視訊的硬解碼和寫死  JavaCV開發詳解之20:如何使用JavaCV制作ico圖示,圖檔和視訊生成ico圖示,視訊流錄制ico圖示  JavaCV開發詳解之21:如何使用JavaCV接入gb28181的ps流并推流到流媒體服務和接入海康大華sdk回調h264/hevc裸流  JavaCV開發詳解之22:flv,live_flv格式說明,http-flv拉流和http-flv推流及rtmp拉流和rtmp推流全面分析和開發實戰  JavaCV開發詳解之23:hls視訊錄制,m3u8切片錄制和fmp4切片錄制詳解  JavaCV開發詳解之24:使用javacv錄制dash視訊分片,mpeg-dash視訊錄制和制作  JavaCV開發詳解之25:使用javacv儲存raw視訊像素格式(yuv或者rgb),并使用ffplay播放raw  JavaCV開發詳解之26:使用javacv對視訊進行連續截圖和覆寫截圖,支援png,jpg,bmp等格式快速連續截圖,适用于視訊快照  JavaCV開發詳解之27:使用javacv把視訊切割成多個視訊分片檔案,以mp4為例,把視訊切割成MP4分片檔案  JavaCV開發詳解之28:如何使用javacv進行多圖推流和多圖合成視訊檔案,以批量jpg圖檔推流rtmp和jpg合成flv視訊檔案為例

補充篇:

javacv開發詳解補充篇:解決轉流後視訊畫面快進慢放,時間跳動過大,監控視訊時間戳重新計算pts和dts 音視訊編解碼問題: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更快的攝像頭讀取速度和效率,友善讀取後的圖像處理) 四、javacv圖像處理系列:國内車輛牌照檢測識别系統(萬份測試準确率99.7%以上)

一、前言

本系列文章前面内容基本覆寫了推流拉流等内容,螢幕截屏之前也寫過,隻不過是基于java的,幀率比較低,是以就有了本章,基于javacv的螢幕錄制、截屏功能實作。

本文重點參考了雷霄骅博士的ffmpeg錄屏實作:最簡單的基于FFmpeg的AVDevice例子(螢幕錄制)。

二、實作功能

本章主要實作基于javacv的螢幕錄制和截屏功能,簡單實作平均幀率計算。

javacv中有兩種方式可以擷取windows下的螢幕畫面,一種是本章使用的gdigrab方式,另一種是基于dshow的方式。

gdigrab進行實作有以下幾個特點

1、螢幕任意範圍截屏(offset_x,offset_y,width,height)

2、支援設定抓取幀率,支援高幀率(實測可以超過60幀/秒)

3、支援根據windows視窗标題(title)擷取視窗畫面,暫時支援中文,使用方式是:title=視窗标題名稱

4、滑鼠繪制和隐藏(通過draw_mouse屬性控制是否隐藏滑鼠,0=隐藏滑鼠,1=顯示滑鼠)