最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

javaCV開(kāi)發(fā)詳解之推流器和錄制器的實(shí)現(xiàn)

 更新時(shí)間:2021年04月22日 10:11:42   作者:eguid_1  
這篇文章主要介紹了javaCV開(kāi)發(fā)詳解之推流器和錄制器實(shí)現(xiàn),對(duì)JavaCV感興趣的同學(xué),可以參考下

功能

實(shí)現(xiàn)邊播放邊錄制/推流,停止預(yù)覽即停止錄制/推流

開(kāi)發(fā)所依賴的包

javacv.jar,javacpp.jar,ffmpeg.jar,ffmpeg-系統(tǒng)平臺(tái).jar,opencv.jar,opencv-系統(tǒng)平臺(tái).jar。

其中ffmpeg-系統(tǒng)平臺(tái).jar,opencv-系統(tǒng)平臺(tái).jar中的系統(tǒng)平臺(tái)根據(jù)開(kāi)發(fā)環(huán)境或者測(cè)試部署環(huán)境自行更改為對(duì)應(yīng)的jar包,比如windows7 64位系統(tǒng)替換為ffmpeg-x86-x64.jar

為什么要這樣做:因?yàn)閒fmpeg-系統(tǒng)平臺(tái).jar中存放的是c/c++本地so/dll庫(kù),而ffmpeg.jar就是使用javacpp封裝的對(duì)應(yīng)本地庫(kù)java接口的實(shí)現(xiàn),而javacpp就是基于jni的一個(gè)功能性封裝包,方便實(shí)現(xiàn)jni,javacv.jar就是對(duì)9個(gè)視覺(jué)庫(kù)進(jìn)行了二次封裝,但是實(shí)現(xiàn)的功能有限,所以建議新手先熟悉openCV和ffmpeg這兩個(gè)C/C++庫(kù)的API后再來(lái)看javaCV思路就會(huì)很清晰了。

代碼實(shí)現(xiàn)

本功能采用按幀錄制/推流,通過(guò)關(guān)閉播放窗口停止視頻錄制/推流。

注:本章代碼中的opencv轉(zhuǎn)換器是未來(lái)方便演示如何獲取圖片,長(zhǎng)時(shí)間運(yùn)行該代碼會(huì)導(dǎo)致內(nèi)存溢出的原因是沒(méi)有及時(shí)釋放IplImage資源,所以大家推流時(shí)應(yīng)當(dāng)去除轉(zhuǎn)換代碼,直接推流即可。

/**
 * 按幀錄制本機(jī)攝像頭視頻(邊預(yù)覽邊錄制,停止預(yù)覽即停止錄制)
 * 
 * @author eguid
 * @param outputFile -錄制的文件路徑,也可以是rtsp或者rtmp等流媒體服務(wù)器發(fā)布地址
 * @param frameRate - 視頻幀率
 * @throws Exception
 * @throws InterruptedException
 * @throws org.bytedeco.javacv.FrameRecorder.Exception
 */
public static void recordCamera(String outputFile, double frameRate){
    //另一種方式獲取攝像頭,opencv抓取器方式獲取攝像頭請(qǐng)參考第一章,F(xiàn)rameGrabber會(huì)自己去找可以打開(kāi)的攝像頭的抓取器。
	FrameGrabber grabber = FrameGrabber.createDefault(0);//本機(jī)攝像頭默認(rèn)0
	grabber.start();//開(kāi)啟抓取器

	OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage();//轉(zhuǎn)換器
	IplImage grabbedImage = converter.convert(grabber.grab());//抓取一幀視頻并將其轉(zhuǎn)換為圖像,至于用這個(gè)圖像用來(lái)做什么?加水印,人臉識(shí)別等等自行添加
	int width = grabbedImage.width();
	int height = grabbedImage.height();

	FrameRecorder recorder = FrameRecorder.createDefault(outputFile, width, height);
	recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264); // avcodec.AV_CODEC_ID_H264,編碼
	recorder.setFormat("flv");//封裝格式,如果是推送到rtmp就必須是flv封裝格式
	recorder.setFrameRate(frameRate);
	
	recorder.start();//開(kāi)啟錄制器
	long startTime=0;
	long videoTS=0;
	CanvasFrame frame = new CanvasFrame("camera", CanvasFrame.getDefaultGamma() / grabber.getGamma());
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	frame.setAlwaysOnTop(true);
	Frame rotatedFrame=converter.convert(grabbedImage);//不知道為什么這里不做轉(zhuǎn)換就不能推到rtmp
	while (frame.isVisible() && (grabbedImage = converter.convert(grabber.grab())) != null) {
       
		rotatedFrame = converter.convert(grabbedImage);
		frame.showImage(rotatedFrame);
		if (startTime == 0) {
			startTime = System.currentTimeMillis();
		}
		videoTS = 1000 * (System.currentTimeMillis() - startTime);
		recorder.setTimestamp(videoTS);
		recorder.record(rotatedFrame);
		Thread.sleep(40);
	}
	frame.dispose();//關(guān)閉窗口
	recorder.close();//關(guān)閉推流錄制器,close包含release和stop操作
	grabber.close();//關(guān)閉抓取器

}

總的來(lái)說(shuō),我們已經(jīng)實(shí)現(xiàn)了基本的推流器功能

測(cè)試錄制功能和推流功能

public static void main(String[] args) throws Exception, InterruptedException, org.bytedeco.javacv.FrameRecorder.Exception {
	recordCamera("output.mp4",25);
}
public static void main(String[] args) throws Exception, InterruptedException, org.bytedeco.javacv.FrameRecorder.Exception {
	recordCamera("rtmp://192.168.30.21/live/record1",25);
}

看到了攝像頭窗口就說(shuō)明已經(jīng)開(kāi)始錄制,點(diǎn)擊右上角關(guān)閉按鈕即停止錄制視頻,在錄制的時(shí)候刷新項(xiàng)目目錄發(fā)現(xiàn)新生成了一個(gè)output.mp4文件,可以正常播放這個(gè)視頻文件

到這章我們已經(jīng)實(shí)現(xiàn)了錄制本地?cái)z像頭視頻和推送攝像頭的視頻到服務(wù)器

以上就是javaCV開(kāi)發(fā)詳解之推流器和錄制器的實(shí)現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于javaCV的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Jackson使用示例-Bean、XML、Json之間相互轉(zhuǎn)換

    Jackson使用示例-Bean、XML、Json之間相互轉(zhuǎn)換

    Jackson是一個(gè)強(qiáng)大工具,可用于Json、XML、實(shí)體之間的相互轉(zhuǎn)換,JacksonXmlElementWrapper用于指定List等集合類,外圍標(biāo)簽名,JacksonXmlProperty指定包裝標(biāo)簽名,或者指定標(biāo)簽內(nèi)部屬性名,JacksonXmlRootElement指定生成xml根標(biāo)簽的名字,JacksonXmlText指定當(dāng)前這個(gè)值
    2024-05-05
  • java null轉(zhuǎn)換為字符串的三種方法

    java null轉(zhuǎn)換為字符串的三種方法

    在Java開(kāi)發(fā)中,正確處理null值至關(guān)重要,以避免空指針異常,本文介紹了三種常見(jiàn)的null值轉(zhuǎn)字符串方法:三元運(yùn)算符、Objects.toString方法、String.valueOf方法,感興趣的可以了解一下
    2024-10-10
  • 如何在Java中實(shí)現(xiàn)一個(gè)散列表

    如何在Java中實(shí)現(xiàn)一個(gè)散列表

    這篇文章主要介紹了如何在Java中實(shí)現(xiàn)一個(gè)散列表,建一個(gè)HashMap,以String類型為Key,Int類型為Value,下文具體的操作過(guò)程需要的小伙伴可以參考一下
    2022-04-04
  • MyBatis中使用分頁(yè)插件PageHelper實(shí)現(xiàn)分頁(yè)功能

    MyBatis中使用分頁(yè)插件PageHelper實(shí)現(xiàn)分頁(yè)功能

    分頁(yè)是經(jīng)常使用的功能,本文主要介紹了Mybatis中處理特殊SQL處理邏輯,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • SpringBoot整合之SpringBoot整合MongoDB的詳細(xì)步驟

    SpringBoot整合之SpringBoot整合MongoDB的詳細(xì)步驟

    這篇文章主要介紹了SpringBoot整合之SpringBoot整合MongoDB的詳細(xì)步驟,本文通過(guò)圖文實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-07-07
  • IDEA maven上傳速度很慢的解決辦法

    IDEA maven上傳速度很慢的解決辦法

    maven上傳的速度很慢,排除網(wǎng)絡(luò)原因,需要檢查配置,本文主要介紹了IDEA maven上傳速度很慢的解決辦法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-08-08
  • spring boot 不連接數(shù)據(jù)庫(kù)啟動(dòng)的解決

    spring boot 不連接數(shù)據(jù)庫(kù)啟動(dòng)的解決

    這篇文章主要介紹了spring boot 不連接數(shù)據(jù)庫(kù)啟動(dòng)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java中Mybatis,SpringMVC,Spring的介紹及聯(lián)系

    Java中Mybatis,SpringMVC,Spring的介紹及聯(lián)系

    這篇文章主要為大家詳細(xì)介紹了Java中Mybatis,SpringMVC,Spring的介紹及聯(lián)系,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Java基礎(chǔ)之線程鎖相關(guān)知識(shí)總結(jié)

    Java基礎(chǔ)之線程鎖相關(guān)知識(shí)總結(jié)

    今天給大家?guī)?lái)的是關(guān)于Java線程的相關(guān)知識(shí),文章圍繞著Java線程鎖展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 詳解如何編寫(xiě)一個(gè)高效的Java工具類

    詳解如何編寫(xiě)一個(gè)高效的Java工具類

    本文將深入探討如何編寫(xiě)一個(gè)高效的Java工具類,并結(jié)合Spring
    Boot與IRIS數(shù)據(jù)庫(kù)的集成,展示一個(gè)具體的實(shí)例,有需要的小伙伴可以了解下
    2024-10-10

最新評(píng)論

甘谷县| 连山| 江油市| 鄂伦春自治旗| 饶河县| 南部县| 曲周县| 来宾市| 航空| 金门县| 绿春县| 玛纳斯县| 盘锦市| 昌邑市| 恩平市| 九寨沟县| 策勒县| 乌兰浩特市| 屏山县| 迭部县| 平谷区| 共和县| 岳普湖县| 大化| 临洮县| 筠连县| 泰宁县| 广州市| 无为县| 内丘县| 澄迈县| 津市市| 乌拉特后旗| 兴化市| 龙陵县| 聊城市| 报价| 柳江县| 宁晋县| 钟祥市| 和田市|