快速用VLC的SDK开发RTSP流教程

来源:互联网 发布:动态最优化应用 编辑:程序博客网 时间:2024/05/01 09:06

http://www.cnblogs.com/MikeZhang/tag/%E8%A7%86%E9%A2%91%E6%8A%80%E6%9C%AF/


使用VLC的SDK开发播放器,不管是播放文件还是RTSP流都是相当简单的事,只需要调用几个简单的函数就可以实现播放了,甚至你连窗口都可以不建,SDK会自动创建窗口。

#include "stdafx.h"
#include <string>
#include <windows.h>
#include "include/rmrtspcltsdk.h"
#include "pubdef.h"
usingnamespacestd;
#include <time.h>
#include <vlc/vlc.h>
#pragma comment(lib, "libvlc.lib")
#pragma comment(lib, "libvlccore.lib")
libvlc_instance_t * g_vlc_ins = 0;
namespaceRM{
    namespaceRTSPCLTSDK
    {
        class  RtspClientState
        {
        public:
            RtspClientState()
            {
                pEndCB      = 0;
                vlc_ins     = g_vlc_ins;
                vlc_player  = 0;
                vlc_media   = 0;
                m_bOpen     = false;
                m_bPlaying  = false;
                m_hWnd      = 0;
            }
            ~RtspClientState(){
                ;
            }
            bool   ReInit(CRtspClient* p);
            bool   m_bOpen;
            bool   m_bPlaying;
            string  m_strURL;
            bool   m_bAutoPlay;
            bool   m_bEnableSound;
            libvlc_instance_t *     vlc_ins    ;//= NULL;
            libvlc_media_player_t * vlc_player ;//= NULL;
            libvlc_media_t *        vlc_media  ;//= NULL;
            CRtspClient::PLAYEND_CB         pEndCB;
            void*               pEndData;
            HWND   m_hWnd;
        };
        CRtspClient::CRtspClient()
        {
            _pState = newRtspClientState();
        }
        CRtspClient::~CRtspClient(){
            Stop();
            delete_pState;
        }
        CRtspClient*    CRtspClient::createInstance()
        {
            returnnewCRtspClient();
        }
        void   CRtspClient::freeInstance(CRtspClient* p)
        {
            if(p){
                deletep;
            }
        }
        boolCRtspClient::Play()
        {
            if(_pState->m_bPlaying)returntrue;
            if( !_pState->vlc_player || !_pState->vlc_media )
            {
                if(!_pState->ReInit(this))returnfalse;
            }
            {
                libvlc_media_player_set_hwnd(_pState->vlc_player,(void*) _pState->m_hWnd);
                libvlc_media_player_play(_pState->vlc_player);
                _pState->m_bPlaying = true;
                returntrue;
            }
            returnfalse;
        }
        boolCRtspClient::Stop()
        {
            _pState->m_bPlaying = false;
            if( _pState->vlc_player )
                libvlc_media_player_stop( _pState->vlc_player);
            if(_pState->vlc_media)
                libvlc_media_release(_pState->vlc_media);
            if(_pState->vlc_player)
                libvlc_media_player_release(_pState->vlc_player);
            _pState->vlc_media = 0;
            _pState->vlc_player = 0;
            _pState->m_bOpen = false;
            returntrue;
        }
        boolCRtspClient::Pause(bool   bResume)
        {
            if( _pState->vlc_player )
            {
                if(bResume)
                {
                    libvlc_media_player_pause( _pState->vlc_player);
                    _pState->m_bPlaying = false;
                }else{
                    libvlc_media_player_play( _pState->vlc_player);
                    _pState->m_bPlaying = true;
                }
                returntrue;
            }
            returnfalse;
        }
        boolCRtspClient::Seek(unsignedlongul)
        {
            if( _pState->vlc_player )
            {
                ::libvlc_media_player_set_time( _pState->vlc_player, ul );
                returntrue;
            }
            returnfalse;
        }
        unsignedlongCRtspClient::GetPlayedTime()const
        {
            if(_pState->vlc_player)
            {
                libvlc_time_t t =   ::libvlc_media_player_get_time(_pState->vlc_player);
                if( t == -1 )
                {
                    printf("No media now -- GetPlayedTimed\n");
                    return-1;
                }else{
                    returnt;
                }
            }
            return0;
        }
        unsignedlongCRtspClient::GetTotalTime()const
        {
            if(_pState->vlc_media)
                return(unsignedlong)libvlc_media_get_duration(_pState->vlc_media);
            return0;
        }
        bool   RtspClientState::ReInit(CRtspClient* p )
        {
            if(!vlc_player)
                vlc_player = libvlc_media_player_new(vlc_ins);
            if(!vlc_media)
                vlc_media  = libvlc_media_new_path(vlc_ins, this->m_strURL.c_str());
            if( !vlc_media || !vlc_player ) {
                ::OutputDebugStringA("init player or media failed!\n");
                returnfalse;
            }
            //libvlc_media_parse(vlc_media);
            libvlc_media_parse_async( vlc_media);
            libvlc_media_player_set_media(vlc_player, vlc_media);
            returntrue;
        }
        bool   CRtspClient::Init( unsigned longhWnd,constchar* RtspUrl ,boolenableSound,boolautoPlay)
        {
            if(!RtspUrl)returnfalse;
            if(_pState->m_bOpen) Stop();
            _pState->m_hWnd = (HWND)hWnd;
            _pState->m_strURL = RtspUrl;
            _pState->m_bAutoPlay = autoPlay;
            _pState->m_bEnableSound = enableSound;
            if(!_pState->ReInit(this))returnfalse;
            _pState->m_bOpen = true;
            if(autoPlay)returnPlay();
            returntrue;
        }
        void   CRtspClient::SetNewHwnd( unsigned longhWnd)
        {
            if(_pState->vlc_player)
                libvlc_media_player_set_hwnd(_pState->vlc_player,(void*) hWnd);
        }
        void   CRtspClient::Refersh()
        {
        }
        void   CRtspClient::SetEndCB( PLAYEND_CB   cb ,void* pData)
        {
            _pState->pEndCB = cb;
            _pState->pEndData = pData;
        }
    }
}
constchar* vlc_args[] =
{
    "-I",
    "dummy",
    "--ignore-config",
    "--extraintf=logger",
    "--verbose=2",
};
voidDllEntry(HINSTANCEdll)
{
    g_vlc_ins = libvlc_new( sizeof(vlc_args)/sizeof(vlc_args[0]), vlc_args );
}
voidDllExit()
{
    ::libvlc_release(g_vlc_ins);
}

你需要准备的是安装VLC,可以到官网上下载最新版本,直接安装之后在程序目录有一个APP/SDK/里面的include,lib复制出来,另外 有一个插件目录plugins,也要在发布程序时复制到程序根目录就可以了

vlc-sdk-file需要的文件

vlc-sdk-file需要的文件

通过这个代码片断你应该了解如何调用VLC的SDK来实现简单的播放器开发了。


0 0
原创粉丝点击