电商为什么要用springmvcmybatis登录,spring,mybatis,redis

EasyHLS是EasyDarwin开源流媒体团队开发的一款HLS打包库,接口非常简单,只需要传入打包的文件名、切片存放的目录、单个切片时长以及切片数等参数,EasyHLS库就能轻松将H264+AAC的流媒体切片成m3u8+ts,提供给WEB服务器进行HLS流媒体发布;
/* 打包H264视频 */EasyHLS_API int Easy_APICALL EasyHLS_VideoMux(Easy_HLS_Handle handle, unsigned int uiFrameType, unsigned char *data, int dataLength, unsigned long long pcr, unsigned long long pts, unsigned long long dts);其中pcr、dts、pts等参数都是unsigned long long型,通常情况下为时间戳(ms毫秒)\*90以后的结果,所以我们通常需要定义:unsigned long long pcr,dts,pts = timestamp\*90; 千万不要定义unsigned int型接收数据输入!具体过程参考上面的几个示例;
EasyHLS_RTSP
EasyHLS_RTSP程序可以通过RTSPClient将RTSP摄像机IPCamera的流媒体音视频数据流获取到本地,再进行ts的音视频封装打包,并不断更新m3u8列表,以提供HLS直播功能:
Easy_HLS_Handle
fHLSHandle
Easy_RTSP_Handle
fRTSPHandle = 0;
/* RTSPClient获取数据后回调给上层 */
int Easy_APICALL __RTSPClientCallBack( int _chid, void *_chPtr, int _frameType, char *_pBuf, RTSP_FRAME_INFO *_frameInfo)
if(NULL == fHLSHandle) return -1;
if (_frameType == EASY_SDK_VIDEO_FRAME_FLAG)
unsigned long long llPTS = (_frameInfo-&timestamp_sec%00 + _frameInfo-&timestamp_usec/1000;
printf(&Get %s Video \tLen:%d \ttm:%u.%u \t%u\n&,_frameInfo-&type==EASY_SDK_VIDEO_FRAME_I?&I&:&P&, _frameInfo-&length, _frameInfo-&timestamp_sec, _frameInfo-&timestamp_usec, llPTS);
unsigned int uiFrameType = 0;
if (_frameInfo-&type == EASY_SDK_VIDEO_FRAME_I)
uiFrameType = TS_TYPE_PES_VIDEO_I_FRAME;
else if (_frameInfo-&type == EASY_SDK_VIDEO_FRAME_P)
uiFrameType = TS_TYPE_PES_VIDEO_P_FRAME;
EasyHLS_VideoMux(fHLSHandle, uiFrameType, (unsigned char*)_pBuf, _frameInfo-&length, llPTS*90, llPTS*90, llPTS*90);
else if (_frameType == EASY_SDK_AUDIO_FRAME_FLAG)
unsigned long long llPTS = (_frameInfo-&timestamp_sec%00 + _frameInfo-&timestamp_usec/1000;
printf(&Get Audio \tLen:%d \ttm:%u.%u \t%u\n&, _frameInfo-&length, _frameInfo-&timestamp_sec, _frameInfo-&timestamp_usec, llPTS);
if (_frameInfo-&codec == EASY_SDK_AUDIO_CODEC_AAC)
EasyHLS_AudioMux(fHLSHandle, (unsigned char*)_pBuf, _frameInfo-&length, llPTS*90, llPTS*90);
else if (_frameType == EASY_SDK_EVENT_FRAME_FLAG)
if (NULL == _pBuf && NULL == _frameInfo)
printf(&Connecting:%s ...\n&, ConfigRTSPURL);
else if (NULL!=_frameInfo && _frameInfo-&type==0xF1)
printf(&Lose Packet:%s ...\n&, ConfigRTSPURL);
void PrintUsage()
printf(&Usage:\n&);
printf(&------------------------------------------------------\n&);
printf(&%s [-c &PlayListCapacity& -C &AllowCache& -v &M3U8Version& -t &TargetDuration& -d &HLSRootDir& -n &HLSessionName& -u &RTSPURL& -U &HttpRootUrl&]\n&, ProgName);
printf(&Help Mode:
%s -h \n&, ProgName );
printf(&For example: %s -c 4 -C 0 -v 3 -t 4 -d ./ -n easyhls_rtsp -u rtsp://admin:admin@anfengde.f3322.org/22 -U http://www.easydarwin.org/easyhls/\n&, ProgName);
printf(&------------------------------------------------------\n&);
int main(int argc, char * argv[])
#ifdef _WIN32
extern char*
ProgName = argv[0];
PrintUsage();
while ((ch = getopt(argc,argv, &hc:C:v:t:d:n:u:U:&)) != EOF)
switch(ch)
case 'h':
PrintUsage();
case 'c':
ConfigPlayListCapacity =atoi(optarg);
case 'C':
ConfigAllowCache =atoi(optarg);
case 'v':
ConfigM3U8Version =atoi(optarg);
case 't':
ConfigTargetDuration =atoi(optarg);
case 'd':
ConfigHLSRootDir =
case 'n':
ConfigHLSessionName =
case 'u':
ConfigRTSPURL =
case 'U':
ConfigHttpRootUrl =
case '?':
int isEasyHLSActivated = EasyHLS_Activate(KEY);
switch(isEasyHLSActivated)
case EASY_ACTIVATE_INVALID_KEY:
printf(&EasyHLS_KEY is EASY_ACTIVATE_INVALID_KEY!\n&);
case EASY_ACTIVATE_TIME_ERR:
printf(&EasyHLS_KEY is EASY_ACTIVATE_TIME_ERR!\n&);
case EASY_ACTIVATE_PROCESS_NAME_LEN_ERR:
printf(&EasyHLS_KEY is EASY_ACTIVATE_PROCESS_NAME_LEN_ERR!\n&);
case EASY_ACTIVATE_PROCESS_NAME_ERR:
printf(&EasyHLS_KEY is EASY_ACTIVATE_PROCESS_NAME_ERR!\n&);
case EASY_ACTIVATE_VALIDITY_PERIOD_ERR:
printf(&EasyHLS_KEY is EASY_ACTIVATE_VALIDITY_PERIOD_ERR!\n&);
case EASY_ACTIVATE_SUCCESS:
printf(&EasyHLS_KEY is EASY_ACTIVATE_SUCCESS!\n&);
if(EASY_ACTIVATE_SUCCESS != isEasyHLSActivated)
return -1;
if( EASY_ACTIVATE_SUCCESS != EasyRTSP_Activate(EasyRTSPClient_KEY))
return -1;
//创建EasyRTSPClient
EasyRTSP_Init(&fRTSPHandle);
if (NULL == fRTSPHandle) return 0;
unsigned int mediaType = EASY_SDK_VIDEO_FRAME_FLAG | EASY_SDK_AUDIO_FRAME_FLAG;
//设置数据回调处理
EasyRTSP_SetCallback(fRTSPHandle, __RTSPClientCallBack);
//打开RTSP流
EasyRTSP_OpenStream(fRTSPHandle, 0, ConfigRTSPURL, EASY_RTP_OVER_TCP, mediaType, 0, 0, NULL, x01, 1);
//创建EasyHLS Session
fHLSHandle = EasyHLS_Session_Create(ConfigPlayListCapacity, ConfigAllowCache, ConfigM3U8Version);
char subDir[64] = { 0 };
sprintf(subDir,&%s/&,ConfigHLSessionName);
EasyHLS_ResetStreamCache(fHLSHandle, ConfigHLSRootDir, subDir, ConfigHLSessionName, ConfigTargetDuration);
printf(&HLS URL:%s%s/%s.m3u8\n&, ConfigHLSRootDir, ConfigHLSessionName, ConfigHLSessionName);
printf(&Press Enter exit...\n&);
getchar();
EasyHLS_Session_Release(fHLSHandle);
fHLSHandle = 0;
EasyRTSP_CloseStream(fRTSPHandle);
EasyRTSP_Deinit(&fRTSPHandle);
fRTSPHandle = NULL;
详细代码下载:
获取更多信息
Author:Jason
QQ交流群:
Copyright (C) EasyDarwin.org
阅读(...) 评论()EasyDarwin
面向企业级的流媒体平台框架
EasyDarwin开始于2013年,遵循 Apple开源License APSL,为了敏捷流媒体服务器开发和简化企业流媒体应用开发而诞生的。
用EasyDarwin开发分布式流媒体服务器
时间: 作者:babosa 来源:EasyDarwin 字号:
我介绍的是如何在DSS的基础上进行改造,分别开发成为分布式流媒体系统中的设备接入服务(设备主动注册上线)与流媒体分发服务。大家肯定会奇怪,DSS怎么改造成...
我介绍的是如何在DSS的基础上进行改造,分别开发成为分布式流媒体系统中的设备接入服务(设备主动注册上线)与流媒体分发服务。大家肯定会奇怪,DSS怎么改造成设备接入服务呢,其实,以DSS的架构,完全可以改造成大部分类型的服务器系统,而且流媒体服务只是DSS的几个功能模块,其强大之处在于其整体框架与架构设计上,闲话少说,让我们直入主题:
& &设备接入服务:在大部分的分布式服务器中,接入服务器常常属于被动接入形式,当然也有接入服务器主动接入配置的前端设备,这里我们按照接入服务器被动接收设备注册的方式介绍。按照被动的设备注册方式,设备在接入到服务器后,会与接入服务器建立一个交互的会话,以TCP方式进行连接并发送保活包,那么我们可以在原有DSS的RTSPSession基础上进行改造,改成属于自定义协议的交互流程,底层的网络读取与发送结构完全一致,只需要修改上层对收到的报文的处理,那么对于多路会话的维护也可以直接用原来对RTPSession列表的维护方式,改写Hash表fMySessionMap,用GetMySessionMap()从服务器主体获取,Hash表的主键可以按照自定义协议里的唯一标识进行,如前端设备的ID、ip等等。自定义协议部分就只需要参考DSS对RTSP的处理,改成自己的协议处理(文本协议、字节流协议)就搞定了!
& &视频分发服务:分发服务器的修改就方便了,如果还是按照RTSP的方式进行流媒体发布,那基本就不需要修改了,直接用DSS在QTSSReflectorModule中已经有的被动接收推送的方式进行转发就可以了,设备在收到接入服务的媒体开始命令后,立即推送视频到DSS分发服务,通过DSS已有的RTSP Announce、Setup、Play、RTP流程推送媒体数据,DSS再将媒体数据分发到客户端列表中(具体流程参见:)!
& &设备端:如果设备协议也是自己定义的,那也方便了,我们用live555嵌入到设备(如IpC,硬盘录像机等)中,在live555中先定义一个RTSPClient,连接保活到接入服务,通过此条连接与接入服务始终保持通信,那么接入服务通过此条tcp发出开始视频的命令时,live555再开启另一条RTSPClient,通过live555已有的DarwinInjector类,经过RTSP Announce、Setup、Play、RTP过程,将流注入到DSS中,在接入发出停止命令时,终止DarwinInjector的流注入,发出RTSP Teardown到DSS,停止媒体传输!
& &客户端:标准RTSP流程,不需要修改,客户端先请求到接入服务,接入服务发出RTSP 重定向的响应到客户端,重定向地址为分发服务的地址,客户端再转而去请求分发服务,这时候,分发服务已经获取到了设备推送来的媒体流,转发给客户端,整个流程就ok了!
附上整个过程的流程图:
整个流程可以按照自己的需求进行修改,如:客户端请求到接入服务器后,接入服务器可以只判断请求的设备是否在线,如果不在线,返回404,如果在线,直接返回301,重定向到的分布式服务器,分布式服务器再通过与接入服务器的交互,通过接入服务器的信令通路控制设备发起视频,设备再成功发起视频后,再返回到分发服务器,成功回到客户端,如此,整个流程通过!
------------------------------ 分割线 ------------------------------
本站文章除注明转载外,均为本站原创或编辑,欢迎大家转载,但请务必注明出处,尊重他人成果,谢谢。
转载请注明:;非本站文章均来自互联网,转载目的在于传递更多信息,并不代表本站赞同其观点和对其真实性负责。
文章中如果有错误可联系:
安防和移动互联网行业比较火热的移动端手机......></dt
有人问到像美拍、秒拍这些短视频拍摄是怎么......></dt
Easydarwin中大量使用gettimeofday来获取系......></dt
最近很多EasyDarwin爱好者提出了手机移动端......></dt
第一个到达的音频RTP包就将作为音频的关键帧......></dt
打开手机直播立即就能显示出主播视频,其实就......></dt
h264的功能分为两层,视频编码层(VCL)和网......></dt
友情链接 | 
EasyDarwinEasyDarwin流媒体服务器RTSP拉模式流媒体转发模块设计
拉模式转发
拉模式转发,顾名思义就是服务器主动从源端(IPCamera、NVR、或者其他流媒体服务器)通过RTSP/RTP协议将流媒体音视频数据拉取到流媒体转发服务器,再通过内部分发调度机制,分发给请求转发的客户端的过程;
拉模式转发的用途非常广泛:内网直播、服务器级联、NVR等各个方面,结合服务端存储,还可以做成边转发直播、边录像的功能;
EasyDarwin拉模式转发
EasyDarwin的拉模式转发需要做到几点:
通用接入:接入市面上大部分的IPCamera及NVR; 按需拉取:只有在有用户请求播放数据的时候,EasyDarwin才会向源端获取数据; 无请求释放:当某一路转发的用户观看量减少为0时,EasyDarwin需要主动释放对源端的拉取; 预配置:拉模式转发模块能够读取预配置的拉模式列表xml配置; RESTful接口:EasyDarwin支持RESTful接口调用,增加或者删除拉模式转发;
我们为EasyDarwin新增一个模块:EasyRelayModule,在EasyRelayModule中,我们为每一路源的转发都建立一个由live555维护的RTSPClient线程,再由EasyRelayModule对线程进行HashMap维护,启动与停止进行外部干预,从而维护整个EasyDarwin流媒体服务器所有接入的RTSP源;
这里有一个问题需要说明:我们采用live555进行RTSP流媒体数据的获取(支持RTP over TCP || UDP),我们改造了live555通常的RTSP获取流程,直接将live555的sink用simpleRTPSink,直接获取到RTP数据,转发给QTSSReflectorModule进行转发;
EasyDarwin Github
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'当前【全部】
全部安卓手机安卓平板安卓电视iPhoneiPad其他
当前位置:>>>iPCamera
热门排行榜
66万+人在玩8万+人在玩26万+人在玩15万+人在玩4万+人在玩10万+人在玩
app相关推荐
发现该应用有下载安装使用错误或恶意扣费携带病毒,请
版权所有 京ICP备号-5
京公网安备 50 备}

我要回帖

更多关于 springmvcmybatis实例 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信