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

JavaCV入门指南系列:

JavaCV入门指南:序章(看完本章后,不想看原理的小伙伴可直接跳转到《快速上手篇》)

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

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

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

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

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

JavaCV入门指南:FrameConverter转换工具类及CanvasFrame图像预览工具类

《快速上手篇》(为了区别,单独划分):

JavaCV入门指南之快速上手篇:快速上手视频拉流、推流、录制文件、录屏、截图和编解码复用解复用等常用音视频处理操作

javaCV实战系列文章:

javacv开发详解之1:调用本机摄像头视频

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

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

javaCV开发详解之4:转流器实现(也可作为本地收流器、推流器,新增添加图片及文字水印,视频图像帧保存),实现rtsp/rtmp/本地文件转发到rtmp流媒体服务器

javaCV开发详解之5:录制音频(录制麦克风)到本地文件/流媒体服务器(基于javax.sound、javaCV)

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开发详解之20:如何使用JavaCV制作ico图标,图片和视频生成ico图标,视频流录制ico图标
JavaCV开发详解之21:如何使用JavaCV接入gb28181的ps流并推流到流媒体服务和接入海康大华sdk回调h264/hevc裸流

JavaCV开发详解之22:flv,live_flv格式说明,http-flv拉流和http-flv推流及rtmp拉流和rtmp推流全面分析和开发实战

JavaCV开发详解之23:hls视频录制,m3u8切片录制和fmp4切片录制详解

JavaCV开发详解之24:使用javacv录制dash视频分片,mpeg-dash视频录制和制作

JavaCV开发详解之25:使用javacv保存raw视频像素格式(yuv或者rgb),并使用ffplay播放raw
JavaCV开发详解之26:使用javacv对视频进行连续截图和覆盖截图,支持png,jpg,bmp等格式快速连续截图,适用于视频快照
JavaCV开发详解之27:使用javacv把视频切割成多个视频分片文件,以mp4为例,把视频切割成MP4分片文件

JavaCV开发详解之28:如何使用javacv进行多图推流和多图合成视频文件,以批量jpg图片推流rtmp和jpg合成flv视频文件为例

补充篇:

javacv开发详解补充篇:解决转流后视频画面快进慢放,时间跳动过大,监控视频时间戳重新计算pts和dts

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

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

前言

上一章中实现了本地推流器和本地摄像头录制功能:javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现

本章基于javaCV实现收流器功能和录制功能

补充:基于本功能可以实现远程流媒体服务器实时视频录制到本地

本章只适用于单文件录制视频文件。

hls切片录制请到:JavaCV开发详解之23:hls视频录制,m3u8切片录制和fmp4切片录制详解

mpeg-dash切片录制请到:JavaCV开发详解之24:使用javacv录制dash视频分片,mpeg-dash视频录制和制作

一、开发所依赖的包

依赖包与上一章相同,具体依赖包请查看上一章

本章使用windows环境开发,基于javaCV的基础支撑包以及ffmpeg-3.1.2-1.2.jar、ffmpeg-3.1.2-1.2-windows-x86.jar、ffmpeg-3.1.2-1.2-windows-x86_64.jar;

 

二、代码实现

本功能采用按帧实现收流器录制功能

/**
	 * 按帧录制视频
	 * 
	 * @param inputFile-该地址可以是网络直播/录播地址,也可以是远程/本地文件路径
	 * @param outputFile
	 *            -该地址只能是文件地址,如果使用该方法推送流媒体服务器会报错,原因是没有设置编码格式
	 * @throws FrameGrabber.Exception
	 * @throws FrameRecorder.Exception
	 * @throws org.bytedeco.javacv.FrameRecorder.Exception
	 */
	public static void frameRecord(String inputFile, String outputFile, int audioChannel)
			throws Exception, org.bytedeco.javacv.FrameRecorder.Exception {
		
	        boolean isStart=true;//该变量建议设置为全局控制变量,用于控制录制结束
		// 获取视频源
		FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(inputFile);
		// 流媒体输出地址,分辨率(长,高),是否录制音频(0:不录制/1:录制)
		FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputFile, 1280, 720, audioChannel);
		// 开始取视频源
		recordByFrame(grabber, recorder, isStart);
	}
private static void recordByFrame(FFmpegFrameGrabber grabber, FFmpegFrameRecorder recorder, Boolean status)
			throws Exception, org.bytedeco.javacv.FrameRecorder.Exception {
		try {//建议在线程中使用该方法
			grabber.start();
			recorder.start();
			Frame frame = null;
			while (status&& (frame = grabber.grabFrame()) != null) {
				recorder.record(frame);
			}
			recorder.stop();
			grabber.stop();
		} finally {
			if (grabber != null) {
				grabber.stop();
			}
		}
	}

 

3、测试收流器录制功能

inputFile设置为服务器播放地址,outputFile设置为本地地址,这里演示.mp4,也可以是flv等其他后缀名

public static void main(String[] args)
			throws FrameRecorder.Exception, FrameGrabber.Exception, InterruptedException {

		 String inputFile = "rtsp://admin:admin@192.168.2.236:37779/cam/realmonitor?channel=1&subtype=0";
		 // Decodes-encodes
		 String outputFile = "recorde.mp4";
		 frameRecord(inputFile, outputFile,1);
}

到这里我们已经实现了直播功能的全部基本操作:推流,录制,简单的直播系统和多人视频等已经可以实现了;

突然发现,额。。。我们的直播系统貌似没有声音!!!好吧,确实是这样,直播听不到声音确实有点low

 

那么声音要怎么获取呢?

javaCV开发详解之5:录制音频(录制麦克风)到本地文件/流媒体服务器(基于javax.sound、javaCV-FFMPEG)

 

音频声音会获取了,那么接下来让我们实现一下本地音视频混合推流到服务器吧:

javaCV开发详解之6:本地音频(话筒设备)和视频(摄像头)抓取、混合并推送(录制)到服务器(本地)

 

但是我们的系统远不止那么简单,比如监控和专业的摄像头,需要通过rtsp或者码流的形式才能获取视频流,这时我们需要一个转流器,帮助我们把他们转发到流媒体服务器,实现实时监控/视频查看。

rtsp转rtmp的转流实现将会在下一章讲解:

javaCV开发详解之4:转流器实现,实现rtsp/rtmp/本地文件转发到rtmp服务器  
 

支持eguid原创

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 博客之星2020 设计师:CY__0809 返回首页
实付 29.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值