使用javaCV怎么实现一个推流器和录制器

  介绍

这篇文章给大家介绍使用javaCV怎么实现一个推流器和录制器,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

功能

实现边播放边录制/推流,停止预览即停止录制/推流

<强>开发所依赖的包

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++本地/dll库,而ffmpeg.jar就是使用javacpp封装的对应本地库java接口的实现,而javacpp就是基于jni的一个功能性封装包,方便实现jni, javacv。jar就是对9个视觉库进行了二次封装,但是实现的功能有限,所以建议新手先熟悉openCV和ffmpeg这两个C/c++库的API后再来看javaCV思路就会很清晰了。

代码实现

本功能采用按帧录制/推流,通过关闭播放窗口停止视频录制/推流。

注:本章代码中的openCV转换器是未来方便演示如何获取图片,长时间运行该代码会导致内存溢出的原因是没有及时释放IplImage资源,所以大家推流时应当去除转换代码,直接推流即可。

/* *   ,*按帧录制本机摄像头视频(边预览边录制,停止预览即停止录制)   *大敌;   ,* @author  eguid   ,* @param  outputFile ——录制的文件路径,也可以是rtsp或者rtmp等流媒体服务器发布地址   ,* @param  frameRate 作用;视频帧率   ,* @throws 例外   ,* @throws  InterruptedException   ,* @throws  org.bytedeco.javacv.FrameRecorder.Exception   ,*/public  static  void  recordCamera (String  outputFile, double 帧速率){   ,,,//另一种方式获取摄像头,opencv抓取器方式获取摄像头请参考第一章,FrameGrabber会自己去找可以打开的摄像头的抓取器。   FrameGrabber  grabber =, FrameGrabber.createDefault(0);//本机摄像头默认0   grabber.start();//开启抓取器      OpenCVFrameConverter.ToIplImage  converter =, new  OpenCVFrameConverter.ToIplImage();//转换器   IplImage  grabbedImage =, converter.convert (grabber.grab());//抓取一帧视频并将其转换为图像,至于用这个图像用来做什么?加水印,人脸识别等等自行添加   int  width =, grabbedImage.width ();   int  height =, grabbedImage.height ();      FrameRecorder  recorder =, FrameRecorder.createDefault (outputFile,,宽度,高度);   recorder.setVideoCodec (avcodec.AV_CODEC_ID_H264);,//, avcodec.AV_CODEC_ID_H264,编码   recorder.setFormat (“flv");//封装格式,如果是推送到rtmp就必须是flv封装格式   recorder.setFrameRate(帧速率);      recorder.start();//开启录制器   long 开始时间=0;   long  videoTS=0;   CanvasFrame  frame =, new  CanvasFrame (“camera",, CanvasFrame.getDefaultGamma (),/, grabber.getGamma ());   frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);   frame.setAlwaysOnTop(真正的);   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(),背后,开始时间);   recorder.setTimestamp (videoTS);   recorder.record (rotatedFrame);   thread . sleep (40);   }   frame.dispose();//关闭窗口   recorder.close();//关闭推流录制器,关闭包含释放和停止操作   grabber.close();//关闭抓取器      }

总的来说,我们已经实现了基本的推流器功能

测试录制功能和推流功能

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

使用javaCV怎么实现一个推流器和录制器