转自: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

最新文章

  1. BZOJ3436——小K的农场
  2. Jmeter 学习(三)
  3. Apache+PHP+MySQL
  4. Hive的安装
  5. C++ CompletionPort(完成端口)示例
  6. C#原始类型扩展方法—this参数修饰符
  7. 学习ARM7、ARM9的操作系统选择经验! [转]
  8. 多路选择器(multiplexer)简介
  9. [转载]VIM命令合集
  10. 黏包现象之udp
  11. Apache环境下配置多个站点的SSL证书
  12. python Rpyc简单使用
  13. 力扣(LeetCode)965. 单值二叉树
  14. Vue.js示例:文本编辑器。使用_.debounce()反抖动函数
  15. springboot 整合redis redis工具类
  16. spring boot 报错 Failed to read HTTP message
  17. 慎用 new、delete
  18. scala 学习笔记十二 继承
  19. 四大组件之Activity——组件间传递数据的4种常用方法
  20. Linux下部署配置Nginx

热门文章

  1. FZOJ Problem 2103 Bin & Jing in wonderland
  2. Oracle学习记录1
  3. 洛谷 P 1387 最大正方形
  4. Introduction to the WinPcap Networking Libraries
  5. js 函数arguments一种用法
  6. polyfill for Function--源码
  7. phthon入门介绍
  8. 计算机图形——OpenGL
  9. zoj 2760(网络流+floyed)
  10. pt-pmp :pt toolkit