实时监控、直播流、流媒体、视频网站开发方案设计简要

  • 欢迎你们积极开心的加入讨论群

群号:371249677 (点击这里进群)

1、本地推送端

一、本地:采用javaCV(安卓和java平台推荐javaCV)、ffmpeg、openCV或者jmf能够很方便的获取到本地摄像头流媒体html

javaCV系列文章:html5

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

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

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

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

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

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

javaCV开发详解之7:让音频转换更加简单,实现通用音频编码格式转换、重采样等音频参数的转换功能(以pcm16le编码的wav转mp3为例)框架

补充篇:tcp

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

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

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

javacpp-ffmpeg系列:

javacpp-FFmpeg系列之1:视频拉流解码成YUVJ420P,并保存为jpg图片

javacpp-FFmpeg系列之2:通用拉流解码器,支持视频拉流解码并转换为YUV、BGR24或RGB24等图像像素数据

javacpp-FFmpeg系列之3: 图像数据转换(BGR与BufferdImage互转,RGB与BufferdImage互转)

javaCV图像处理系列:

1、javaCV图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体、位置、大小、粗度、翻转、平滑等操做

2、javaCV图像处理之2:实时视频添加图片水印,实现不一样大小图片叠加,图像透明度控制

3、opencv图像处理3:使用opencv原生方法遍历摄像头设备及调用(方便多摄像头遍历及调用,相比javacv更快的摄像头读取速度和效率,方便读取后的图像处理)

4、opencv图像处理系列:国内车辆牌照检测识别系统(万份测试准确率99.7%以上)

二、监控(第三方摄像头):经过设备sdk或者rtsp直播流获取流媒体源

2、转流端

直播:经过ffmpeg(推荐),live555将接收rtsp或者字节码流并转为flv格式发布到rtmp流媒体服务器(流媒体服务器必须先建好)

hls原理同上

注意:rtmp只支持flv格式封装的视频流

ffmpeg服务实现方式实例请参考:

http://blog.csdn.net/eguid_1/article/details/51777716

http://blog.csdn.net/eguid_1/article/details/51787646

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

java封装FFmpeg命令,支持原生ffmpeg所有命令,实现FFmpeg多进程处理与多线程输出控制(开启、关闭、查询),rtsp/rtmp推流、拉流

3、流媒体服务器

目前主流的流媒体服务器有:fms,nginx-rtmp,red5(java),flazr

本地视频:直接经过流媒体服务器解码并推送视频流

直播流:经过开启udp/rtp/rtsp/rtmp/hls等等流媒体服务,从ffmpeg/live555获取推送过来的实时视频流并发布到rtmp/hls直播流并推送(能够边直播边保存)

rtmp和hls这两种是web领域主流的流媒体协议。使用rtp或rtsp协议的通常都是监控。

流媒体协议选择:rtmp基于tcp协议,rtmp可以保持3秒左右延迟。hls是基于http协议,因此实时性特别差,想要用hls保持实时性的就别想了,hls延迟基本超过10秒。

实时性要求特高的,建议使用基于udp协议的一些流媒体协议。

基于tcp和udp两种流媒体协议区别就是tcp会强制同步,udp是数据发出去就无论了。

因此最终的方案就是:强同步可是实时性要求不高用基于tcp协议的,强实时性弱同步就udp。

补充:nginx-rtmp流媒体服务器搭建实例:http://blog.csdn.net/eguid_1/article/details/51749830

nginx-rtmp配置指令详细含义和用法:http://blog.csdn.net/eguid_1/article/details/51821297

4、播放端(收流端)

直播:经过flex(flash)播放器或者第三方播放器(videoJS,ckplayer,VideoLAN 等...)调用流媒体服务器的流媒体源解码并播放,若是不须要兼容低版本IE,能够采用HTML5的webSocket播放器,videoJS是flash/html5双核播放器。

 

视频:经过html自带播放器、flex(flash)播放器或者第三方播放器(videoJS,ckplayer,VideoLAN 等...)进行播放

videoJS/ckplayer播放器二次开发支持rtmp直播、hls直播及普通视频播放:http://blog.csdn.net/eguid_1/article/details/51898912

 

通常使用videoLAN播放器做为测试工具,用于测试音视频流发布情况

补充:

一、若是是采用nginx服务器,它提供的rtmp模块能够发布rtmp直播、录播及hls,nginx能够把ffmpeg整合进去方流媒体后期处理(加水印等)。

二、java是能够调用ffmpeg的,经过jni的方式有两种方法:

2.一、javaCV1.2支持经过javacpp调用ffmpeg,javaCV目前整合了8种流媒体处理框架,是安卓和javaEE平台不可或缺的强大流媒体处理利器 

2.二、javaAV(目前最新0.7,release最新0.5)提供了对java调用ffmpeg的支持,当前已中止更新

 

补充:为何没有基于原生java(或者说自带GC的语言)的流媒体框架,缘由来自GC,也就是java引觉得豪的自动垃圾回收机制(真的是成也萧何,败也萧何)

为何呢?

你们知道,直播(顾名思义,实时视频转发),这种实时性项目会产生大量的对象,这样会致使两种状况:

一、产生大量对象后占据的内存资源得不到及时释放,因而虚拟机内存溢出。

二、产生大量对象致使GC满负荷运行进行资源回收,会严重占用系统资源,致使系统运行迟滞,影响系统运行性能和实时性等等。

相关文章
相关标签/搜索