SkeyeLive是OpenSKEYE开源流媒体团队开发的一款功能丰富的开源PC端流媒体推流拉流直播软件我的项目,目前反对Windows、Android版本,后续将反对ios版本,其中Windows版本的SkeyeLive反对多种源接入,包含Windows摄像头、麦克风、RTSP摄像机、屏幕桌面等,采集后通过x264编码、SkeyePusher推送到OpenSKEYE流媒体服务器进行转发,同时SkeyeLive还反对通过SkeyeRTSPClient拉取OpenSKEYE直播流,进行显示、播放,十分稳固、易用,用户能够基于SkeyeLive我的项目,开发相似于课堂直播、视频对讲等我的项目!

性能解说

一、程序框架
SkeyeLive次要包含三个模块:采集、推送和直播,次要性能封装治理类Class CSourceManager中实现,接口非常简单,各模块别离提供开始和完结接口函数,不便界面调用;
界面调用接口:

    //开始捕捉(采集)    int StartCapture(SOURCE_TYPE eSourceType, int nCamId, int nAudioId, HWND hCapWnd, char* szURL, int nVideoWidth, int nVideoHeight, int nFps=, int nBitRate);    //进行采集    void StopCapture();    //开始推流    int StartPush(char* ServerIp, int nPushPort, char* sPushName, int nPushBufSize = 1024);    //进行推流    void StopPush();        //开始播放    int StartPlay(char* szURL, HWND hShowWnd);    //进行播放    void StopPlay();

1、采集模块
采集分为本地音视频采集和RTSP流采集
本地音视频次要通过DShow进行采集,函数如下:

int CSourceManager::StartDSCapture(int nCamId, int nAudioId,HWND hShowWnd,int nVideoWidth, int nVideoHeight, int nFps, int nBitRate)

该函数次要实现本地音视频采集和音视频编码器的初始化(详见SkeyeLive源码),须要留神的是这里的参数设置:
(1) 本地采集的视频宽高和x264编码器的宽高需统一,数据格式倡议设为YUY2(程序中默认为“YUY2"),因为在DShow的数据采集线程中须要进行编码前的格局转换(YUY2->I420),如果格局不对立,这里将要重写转换函数;
(2) 本地音频采样率默认为16000,这个设置在SkeyePusher中体现最佳,其余采样率还有待测试;
(3) 其余设置请参照DEVICE_CONFIG_INFO构造和Encoder_Config_Info构造的具体阐明;

仔细的童鞋应该曾经发现RTSP流采集和流播放采纳的是同一个类Class SkeyeLiveManager实现,如下:

    //接管网络RTSP流进行推流    SkeyeLiveManager m_netStreamCapture;    //接管OpenSKEYE推出的RTSP流进行播放    SkeyeLiveManager m_netStreamPlayer;

这个类封装了libSkeyeLive库提供的接口,不便调用;这个库集成在SkeyeLive源码中,也是SkeyeLive的外围;她次要实现了从网络接管RTSP流进行解析,获取H264编码数据和AAC编码数据别离进行解码并出现和播放,当然,作为Capturer而言,咱们只须要用她获取到编码数据即可。


2、推送模块
推送则显得异样简略,间接调用原生态的SkeyePusher接口,即可实现:

//开始推流int CSourceManager::StartPush(char* ServerIp, int nPushPort, char* sPushName, int nPushBufSize){    //创立推送器指针    m_sPushInfo.pusherHandle = SkeyePusher_Create();    strcpy(m_sPushInfo.pushServerAddr,  ServerIp);    m_sPushInfo.pushServerPort = nPushPort;    strcpy(m_sPushInfo.sdpName, sPushName);    Skeye_U32 nRet = 0;    if (NULL != m_sPushInfo.pusherHandle )    {        //设置推送回调,能够获取推送器反馈的信息        SkeyePusher_SetEventCallback(m_sPushInfo.pusherHandle, __SkeyePusher_Callback, 0, NULL);        //开启流推送        Skeye_U32 nRet = SkeyePusher_StartStream(m_sPushInfo.pusherHandle ,             ServerIp, nPushPort, sPushName, "admin", "admin", (Skeye_MEDIA_INFO_T*)&m_mediainfo, nPushBufSize, 0);//512-2048        if(nRet>=0)        {            m_bPushing = TRUE;        }        else        {            StopPush();        }    }    return nRet;}//进行推流void CSourceManager::StopPush(){    //Close Pusher    if (NULL != m_sPushInfo.pusherHandle)    {        SkeyePusher_StopStream(m_sPushInfo.pusherHandle);        SkeyePusher_Release(m_sPushInfo.pusherHandle);        m_sPushInfo.pusherHandle = NULL;    }    m_bPushing = FALSE;    m_bAVSync = FALSE;}

惟一须要留神的是推送标记m_bPushing,这个标记将在数据回调函数中起到真正的推送开关的作用(严格的说在StartPush中也应该调用m_bPushing判断是否推送曾经进行)。


3、直播模块
直播在采集模块中采集网络流时提到过,也是间接调用类Class SkeyeLiveManager接口实现:

//开始播放int CSourceManager::StartPlay(char* szURL, HWND hShowWnd){    m_sPlayInfo.rtspSourceId = m_netStreamPlayer.Start(szURL, hShowWnd, DISPLAY_FORMAT_RGB24_GDI, 0x01, "", "");    m_netStreamPlayer.Config(3, TRUE, TRUE);    return m_sPlayInfo.rtspSourceId ;}//进行播放void CSourceManager::StopPlay(){    m_netStreamPlayer.Close();}

源码下载:https://gitee.com/visual-open...