转自:http://blog.csdn.net/yanzhuomin/article/details/52887311

EasyCamera中关于摄像头SDK的调用都集中在EasyCameraSource.cpp中,调用顺序:

一、开启流转发:

点击摄像头查看视频时调用:EasyCameraSource::StartStreaming具体调用流程为:

1.首先登陆摄像头:

if (!cameraLogin())
{
theErr = QTSS_RequestFailed;
break;
}

2.获取摄像头配置信息:(我的海康摄像头获取的音频采样率为32k,但是我实际测试

8000hz才能正确播放)

if (!NET_DVR_GetDVRConfig(m_u32Handle, NET_DVR_GET_COMPRESSCFG_V30, 1, &struCompressionCfg, sizeof(NET_DVR_COMPRESSIONCFG_V30), &dwReturned))
{
printf("can't get config!\n");
mediainfo.u32VideoFps = 25;
mediainfo.u32AudioCodec = EASY_SDK_AUDIO_CODEC_G711A;
mediainfo.u32AudioSamplerate = 8000;
}
else
{
mediainfo.u32VideoFps = getFrameRateFromHKSDK(struCompressionCfg.struNetPara.dwVideoFrameRate);
mediainfo.u32AudioCodec = getAudioCodecFromHKSDK(struCompressionCfg.struNetPara.byAudioEncType);
mediainfo.u32AudioSamplerate = getAudioSimpleRateFromHKSDK(struCompressionCfg.struNetPara.byAudioSamplingRate);
//mediainfo.u32AudioBitsPerSample = struCompressionCfg.struNetPara.byAudioBitRate;
}

3.开启EasyPusher推送开始

// 注册流推送事件回调
EasyPusher_SetEventCallback(fPusherHandle, __EasyPusher_Callback, 0, NULL);
// 根据接收到的命令生成流信息
char sdpName[128] = { 0 };
sprintf(sdpName, "%s/%s.sdp", /*inParams->inStreamID,*/ inParams->inSerial, inParams->inChannel);
// 开始推送流媒体数据
EasyPusher_StartStream(fPusherHandle, (char*)inParams->inIP, inParams->inPort, sdpName, "", "", &mediainfo, 1024/* 1M Buffer*/, 0);
saveStartStreamParams(inParams);

4.调用netDevStartStream();开启摄像头流转发

在该函数中调用海康摄像头的请求流转发API,并设置回调函数myStreamProc具体流转发 就在该回调函数中 :streamHandle =NET_DVR_RealPlay_V40(m_u32Handle, &struPlayInfo, myStreamProc,this);

二、流转发过程

1.EasyCameraSource::PushFrame函数中实现转发:

PushFrame函数为海康摄像头回调函数直接调用,首先调用:GetH246FromPS(frame, len,

&h264Buf, h264Len, isVideo, isAudio); 从海康摄像头的h264编码的PS流中解析得到H264

标准流,标准流中包含视频帧、语音帧(摄像头内设置为复合流才能获取到)和H264的其他帧。

具体参见:海康ps流转换h264流该博客有详细说明

2.发送解析得到的H264标准帧:

EASY_AV_Frame avFrameVideo;
memset(&avFrameVideo, 0x00, sizeof(EASY_AV_Frame));
avFrameVideo.u32AVFrameLen = fPusherBuffOffset;
avFrameVideo.pBuffer = (unsigned char*)fPusherBuff;
bool isKeyFrame = IsIFrame(fPusherBuff);
avFrameVideo.u32VFrameType = isKeyFrame ? EASY_SDK_VIDEO_FRAME_I : EASY_SDK_VIDEO_FRAME_P;
avFrameVideo.u32AVFrameFlag = EASY_SDK_VIDEO_FRAME_FLAG;
//avFrameVideo.u32TimestampSec = pstruAV->u32AVFramePTS / 1000;
//avFrameVideo.u32TimestampUsec = (pstruAV->u32AVFramePTS % 1000) * 1000;
Easy_U32 ret = EasyPusher_PushFrame(fPusherHandle, &avFrameVideo);

具体看获取到的帧为视频帧还是音频帧,进行不同的处理转发即可

三、语音转发过程:

当客户端调用语音对讲的时候则会调用到该类的EasyCameraSource::ControlTalkback函数:

1.根据客户端的命令类型调用不同的海康SDK的API,如果命令为

‘’EASY_TALKBACK_CMD_TYPE_START‘’则调用:

NET_DVR_StartVoiceCom_MR_V30(m_u32Handle,1, myAudioStreamProc, (void*)this);//建立语音转发

如果为”EASY_TALKBACK_CMD_TYPE_STOP”则调用:

result =NET_DVR_StopVoiceCom(audioHandle);//停止语音转发

如果为”EASY_TALKBACK_CMD_TYPE_SENDDATA”则调用:

result =NET_DVR_VoiceComSendData(audioHandle, (params->inBuff)+sizeof(char)*len,160);

转发客户端音频数据到摄像头。由于海康SDK每次发送数据有最大数量限制,所以while循环

发送直到数据完。具体参见海康SDK说明文档。至此就实现海康摄像头的音频播放功能。

2.语音流摄像头读取:在开始的摄像头开启语音转发函数中设置了回调函数myAudioStreamProc可以

获取到摄像头的音频数据流,在回调函数中调用pThis->PushFrame((unsignedchar*)pBuffer,

dwBufSize, NET_DVR_AUDIOSTREAMDATA);将获取到的音频数据进行转发,具体同上述的流转发过程类似。

四、云台控制:

云台控制相对比较简单,根据客户端调用的命令传入调用相应摄像头SDK的函数即可,只不过两边定义的

上下左右运动的命令不太一样,做相应转换即可。

if (cameraLogin())
{
if(NET_DVR_PTZPreset(m_u32Handle, getPTZCMDFromCMDType(params->inCommand), params->inPreset))
return QTSS_NoErr;
}

源码及视频教程

源码地址:https://github.com/EasyDarwin/EasyDarwin/tree/master/EasyCamera-HK

视频教程地址:http://edu.csdn.net/course/detail/3029

获取更多信息

邮件:support@easydarwin.org

WEB:www.EasyDarwin.org

Copyright © EasyDarwin.org 2012-2016

EasyDarwin开源摄像机访问EasyCamera中海康摄像头语音对讲和云台控制转发实现的更多相关文章

  1. EasyDarwin开源云平台接入海康威视EasyCamera摄像机之快照获取与上传

    本文转自EasyDarwin团队成员Alex的博客:http://blog.csdn.net/cai6811376 EasyCamera开源摄像机拥有获取摄像机实时快照并上传至EasyDarwin云平 ...

  2. EasyDarwin开源流媒体云平台支持EasyCamera摄像机、EasyCamera手机直播监控、EasyNVR等多终端接入

    云平台架构 EasyDarwin开源流媒体云平台目前已经包括了EasyCMS中心管理服务.EasyDarwin流媒体服务.EasyCamera设备端(支持Arm_Linux.Android.PC).E ...

  3. EasyDarwin云平台:EasyCamera开源摄像机接入海康威视摄像机PS流转ES流

    本文转自EasyDarwin开源团队成员Alex的博客:http://blog.csdn.net/cai6811376 海康威视使用PS流封装H.264流,EasyDarwin云平台支持ES流.当我们 ...

  4. EasyCamera Android安卓移动视频监控单兵设备接入EasyDarwin开源流媒体云平台

    前言 随着Android系统的不断更新和发展,现在越来越多的硬件产品选择用安卓系统作为运行环境,电视机,机顶盒.门禁.行车记录仪.车载系统.单兵设备等等,Android系统底层还是Linux,但对上层 ...

  5. EasyDarwin开源流媒体云平台之语音对讲功能设计与实现

    本文由EasyDarwin开源团队成员Alex贡献:http://blog.csdn.net/cai6811376/article/details/52006958 EasyDarwin云平台一直在稳 ...

  6. EasyDarwin开源流媒体云平台之云台ptz控制设计与实现

    本文转自EasyDarwin开源团队成员Alex的博客:http://blog.csdn.net/cai6811376/article/details/51912692 近日,EasyDarwin云平 ...

  7. EasyDarwin开源流媒体项目

    本文转自EasyDarwin CSDN官方博客:http://blog.csdn.net/easydarwin EasyDarwin是由国内开源流媒体团队维护和迭代的一整套开源流媒体视频平台框架,从2 ...

  8. EasyDarwin开源流媒体云平台设计与实现(分布式+负载均衡)

    前言 早在2013年我就设计了一套架构非常简单的分布式流媒体服务器平台<基于Darwin实现的分布式流媒体直播服务器系统>,当时的考虑如今看来有诸多的细节点没有考虑到:1.CMS是单点部署 ...

  9. EasyDarwin开源流媒体服务器提供的RTMP直播推送库

    EasyRTMP EasyRTMP是什么? EasyRTMP是一个EasyDarwin配套使用,也可以单独使用的RTMP推送库,通过EasyRTMP我们就可以避免接触到稍显复杂的RTMP推送流程,只需 ...

随机推荐

  1. 模仿锤子手机的bigbang效果

    <!DOCTYPE html> <html style="height: 100%"> <head> <meta http-equiv=& ...

  2. C 语言 文件读写

    在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之.一.流式文件操作 这种方式的文件操作有一个重要的结构FILE,FILE在stdio.h中定义如下:type ...

  3. python读取Excel实例

    1.操作步骤: (1)安装python官方Excel库-->xlrd (2)获取Excel文件位置并读取 (3)读取sheet (4)读取指定rows和cols内容 2.示例代码 # -*- c ...

  4. 洛谷——P2737 [USACO4.1]麦香牛块Beef McNuggets

    https://www.luogu.org/problemnew/show/P2737 题目描述 农夫布朗的奶牛们正在进行斗争,因为它们听说麦当劳正在考虑引进一种新产品:麦香牛块.奶牛们正在想尽一切办 ...

  5. Java使用logback记录日志时分级别保存文件

    说明:一般情况下logback可以指定类使用什么样的级别显示输出日志,并且同一类可以指定不能级别,然后对应级别进行输出日志. 第一种配置: <?xml version="1.0&quo ...

  6. 分布式缓存之Memcache

    〇.为什么要用分布式缓存 1.软件从单机到分布式 走向分布式第一步就是解决:多台机器共享登录信息的问题. 例如:现在有三台机器组成了一个Web的应用集群,其中一台机器用户登录,然后其他另外两台机器共享 ...

  7. iOS Framework: Introducing MKNetworkKit (MKNetworkKit介绍,入门,翻译)

    这片文章也有塞尔维亚-克罗地亚语(由Jovana Milutinovich翻译)和日语(由@noradaiko翻译) 如果有个一个网络库能够自动的为你处理cache该有多好啊. 如果有一个网络库能够在 ...

  8. 深入理解Activity启动流程(一)–Activity启动的概要流程

    概述 Android中启动某个Activity,将先启动Activity所在的应用.应用启动时会启动一个以应用包名为进程名的进程,该进程有一个主线程,叫ActivityThread,也叫做UI线程. ...

  9. iOS开发 CGBitmapContextCreate

    最近项目中,需要对图片进行各种操作. 使用CGBitmapContextCreate 创建位图上下文. CG_EXTERN CGContextRefCGBitmapContextCreate(void ...

  10. OpenGL超级宝典笔记——深度纹理和阴影 【转】

    目录[-] 光源视角 新型的纹理 深度纹理的大小 首先绘制阴影 然后是光照 投影阴影贴图 阴影比较 之前我们介绍过简单的把物体压平到投影平面来制造阴影.但这种阴影方式有其局限性(如投影平面须是平面). ...