- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) > 編程語(yǔ)言 >
- javaCV開(kāi)發(fā)詳解之推流器和錄制器的實(shí)現
實(shí)現邊播放邊錄制/推流,停止預覽即停止錄制/推流
javacv.jar,javacpp.jar,ffmpeg.jar,ffmpeg-系統平臺.jar,opencv.jar,opencv-系統平臺.jar。
其中ffmpeg-系統平臺.jar,opencv-系統平臺.jar中的系統平臺根據開(kāi)發(fā)環(huán)境或者測試部署環(huán)境自行更改為對應的jar包,比如windows7 64位系統替換為ffmpeg-x86-x64.jar
為什么要這樣做:因為ffmpeg-系統平臺.jar中存放的是c/c++本地so/dll庫,而ffmpeg.jar就是使用javacpp封裝的對應本地庫java接口的實(shí)現,而javacpp就是基于jni的一個(gè)功能性封裝包,方便實(shí)現jni,javacv.jar就是對9個(gè)視覺(jué)庫進(jìn)行了二次封裝,但是實(shí)現的功能有限,所以建議新手先熟悉openCV和ffmpeg這兩個(gè)C/C++庫的API后再來(lái)看javaCV思路就會(huì )很清晰了。
本功能采用按幀錄制/推流,通過(guò)關(guān)閉播放窗口停止視頻錄制/推流。
注:本章代碼中的opencv轉換器是未來(lái)方便演示如何獲取圖片,長(cháng)時(shí)間運行該代碼會(huì )導致內存溢出的原因是沒(méi)有及時(shí)釋放IplImage資源,所以大家推流時(shí)應當去除轉換代碼,直接推流即可。
/** * 按幀錄制本機攝像頭視頻(邊預覽邊錄制,停止預覽即停止錄制) * * @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抓取器方式獲取攝像頭請參考第一章,FrameGrabber會(huì )自己去找可以打開(kāi)的攝像頭的抓取器。 FrameGrabber grabber = FrameGrabber.createDefault(0);//本機攝像頭默認0 grabber.start();//開(kāi)啟抓取器 OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage();//轉換器 IplImage grabbedImage = converter.convert(grabber.grab());//抓取一幀視頻并將其轉換為圖像,至于用這個(gè)圖像用來(lái)做什么?加水印,人臉識別等等自行添加 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);//不知道為什么這里不做轉換就不能推到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í)現了基本的推流器功能
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í)候刷新項目目錄發(fā)現新生成了一個(gè)output.mp4文件,可以正常播放這個(gè)視頻文件
到這章我們已經(jīng)實(shí)現了錄制本地攝像頭視頻和推送攝像頭的視頻到服務(wù)器
以上就是javaCV開(kāi)發(fā)詳解之推流器和錄制器的實(shí)現的詳細內容,更多關(guān)于javaCV的資料請關(guān)注腳本之家其它相關(guān)文章!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系站長(cháng)郵箱:ts@56dr.com進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2