首先我很佩服eguid大神,无论是技術还是分享感谢他的系列博文对我当初学习过程中的帮助,所以很明确的注明转载地址:
1、本地:采用javaCV(安卓和java平台推荐javaCV)、ffmpeg、openCV或者jmf可鉯很方便的获取到本地摄像头流媒体
2、监控(第三方摄像头):通过设备sdk或者rtsp直播流获取流媒体源
直播:通过ffmpeg(推荐)live555将接收rtsp或者字节碼流并转为flv格式发布到rtmp流媒体服务器(流媒体服务器必须先建好)
注意:rtmp只支持flv格式封装的视频流
ffmpeg服务实现方式实例请参考:
本地视频:矗接通过流媒体服务器解码并推送视频流
直播流:通过开启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配置指令详细含义和用法:
一般使用videoLAN播放器作为测试工具用于测试音视频流发布状况
1、如果是采用nginx服务器,它提供的rtmp模块可以发布rtmp直播、录播及hlsnginx可以把ffmpeg整合进去方流媒体后期处理(加水印等)。
2、java是可以调用ffmpeg的通过jni的方式有两种方法:
补充:為什么没有基于原生java(或者说自带GC的语言)的流媒体框架,原因来自GC也就是java引以为豪的自动垃圾回收机制(真的是成也萧何,败也萧何)
大家知道直播(顾名思义,实时视频转发)这种实时性项目会产生大量的对象,这样会导致两种情况:
1、产生大量对象后占据的内存资源得不到及时释放于是虚拟机内存溢出。
2、产生大量对象导致GC满负荷运行进行资源回收会严重占用系统资源,导致系统运行迟滞影响系统运行性能和实时性等等。