javacv实战专栏目录:

​​JavaCV实战专栏文章目录(JavaCV速查手册)​​


一、前言

上一章简单的介绍了javacv并且演示了如何获取本机摄像头:​​javacv开发详解之1:调用本机摄像头视频​

本章将在上一章的基础上,增加视频推流到流媒体服务器和视频录制的功能;

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


本章实现了摄像头推流,单独的flv/http-flv/rtmp直播推流请到​​JavaCV开发详解之22:flv,live_flv格式说明,http-flv拉流和http-flv推流及rtmp拉流和rtmp推流全面分析和开发实战​


友情提示:

1、本章代码从发布至今测试运行正常,如遇到错误请自觉检查环境配置和jar包问题

2、到目前为止大家遇到的问题100%都是jar包问题,那么如果遇到各种异常和报错,请参照第一条,谢谢

二、依赖项

(1)使用maven添加依赖

<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv-platform</artifactId>
<version>1.5.3</version>
</dependency>

(2)使用gradle添加依赖

dependencies {
compile group: 'org.bytedeco', name: 'javacv-platform', version: '1.5.3'
}

(3)jar包方式

鉴于Javacv全量包太大,大家可以直接到​​GitHub - bytedeco/javacv: Java interface to OpenCV, FFmpeg, and more​​下载。

三、实现功能

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


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


四、代码实现

/**
* 按帧录制本机摄像头视频(边预览边录制,停止预览即停止录制)
*
* @author eguid
* @param outputFile -录制的文件路径,也可以是rtsp或者rtmp等流媒体服务器发布地址
* @param frameRate - 视频帧率
* @throws Exception
* @throws InterruptedException
* @throws org.bytedeco.javacv.FrameRecorder.Exception
*/
public static void recordCamera(String outputFile, double frameRate){
//另一种方式获取摄像头,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, width, height);
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264); // avcodec.AV_CODEC_ID_H264,编码
recorder.setFormat("flv");//封装格式,如果是推送到rtmp就必须是flv封装格式
recorder.setFrameRate(frameRate);

recorder.start();//开启录制器
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();//关闭窗口
recorder.close();//关闭推流录制器,close包含release和stop操作
grabber.close();//关闭抓取器

}

总的来说,我们已经实现了基本的推流器功能,那么需要注意的就是换那里,不清楚为什么不做转换就不能推送到rtmp流媒体服务器,如果哪位有更好的方案希望可以联系博主,感谢!

演示测试

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);
}

看到了摄像头窗口就说明已经开始录制,点击右上角关闭按钮即停止录制视频,在录制的时候刷新项目目录发现新生成了一个output.mp4文件,可以正常播放这个视频文件。

到这章我们已经实现了录制本地摄像头视频和推送摄像头的视频到服务器,小伙伴们已经迫不及待的开始在线直播show了 - -!

既然已经实现了在线直播,那么我们想要保存或者播放别人的在线直播视频怎么办呢?

下一章将会讲解如何录制流媒体服务器的视频到本地文件,当然是可以在线播放的

​javaCV开发详解之3:收流器实现,录制流媒体服务器的rtsp/rtmp视频文件​

如果觉得博主写得还不错,欢迎“关注、收藏、点赞”一键三连!

end