javaCV开发详解之2:推流器和录制器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV、FFMPEG和openCV)

JavaCV入门指南系列:

JavaCV入门指南:序章

JavaCV入门指南:调用FFmpeg原生API和JavaCV是如何封装了FFmpeg的音视频操作

JavaCV入门指南:调用opencv原生API和JavaCV是如何封装了opencv的图像处理操作

JavaCV入门指南:帧抓取器(FrameGrabber)的原理与应用

JavaCV入门指南:帧录制器/推流器(FrameRecorder)的原理与应用

JavaCV入门指南:帧过滤器(FrameFilter)的原理与应用

JavaCV入门指南:FrameConverter转换工具类及CanvasFrame图像预览工具类(完结篇)

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开发详解补充篇:基于avfoundation的苹果Mac和ios获取屏幕画面及录屏/截屏以及摄像头画面和音频采样获取实现

javaCV开发详解之GIF动态图片录制补充篇:windows桌面屏幕画面录制成gif动态图片,支持桌面任意取域生成gif,可扩展支持MacOS/安卓/linux等平台,可扩展支持apng动态图片

音视频编解码问题:javaCV如何快速进行音频预处理和解复用编解码(基于javaCV-FFMPEG)

音视频编解码问题:16/24/32位位音频byte[]转换为小端序short[],int[],以byte[]转short[]为例

实现给图片增加图片水印或者文字水印(也支持视频图像帧添加水印)

java原生实现屏幕设备遍历和屏幕采集(捕获)等功能

流媒体直播实时视频延迟时间排查和剖析

javacv文字识别系列:

javaCV文字识别之1:基于google的tesserac ocr识别图片中的文字,跨平台支持英文中文简体繁体等各种字符识别

javaCV文字识别之2:视频文字识别和视频提取字幕文字字符

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%以上)

提示:

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

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

点击链接加入群聊【javaCV中文社区群】:https://jq.qq.com/?_wv=1027&k=3Rc5AK52

前言:

上一章简单的介绍了javacv并且演示了如何获取本机摄像头:http://blog.csdn.net/eguid_1/article/details/51659578

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

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

 

一、开发所依赖的包

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++本地so/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 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流媒体服务器,如果哪位有更好的方案希望可以联系博主,感谢!

 

3、测试录制功能和推流功能

 

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文件,可以正常播放这个视频文件

支持eguid原创

 

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

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

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

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

 

 

 

 

 

©️2020 CSDN 皮肤主题: 撸撸猫 设计师: 设计师小姐姐 返回首页
实付19.90元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值