基于libvlc实现断线重连功能

思路:利用libvlc中添加事件,当遇到播放错误再次开启播放。

1.添加libvlc中事件(事件种类很多,我就用了这两个)

void chDialog::AttachEvents(libvlc_event_manager_t *EventManager)  //用于添加libvlc中的事件
{
    int i = 0;
    vector <libvlc_event_e> events = {
        libvlc_MediaPlayerEncounteredError,      //播放中出现错误
        libvlc_MediaPlayerEndReached             //播放到文件或流的末尾(在测试中在播放某些时,网络断开不会出现播放错误,而是提示为播放到文件末尾即 触发libvlc_MediaPlayerEndReached事件 
    };
    for (i = 0; i < (int )events.size(); i++)
        libvlc_event_attach(EventManager, events[i], HandleEvents, this);  //添加事件
}

2.在回调函数执行具体的操作

static void HandleEvents(const libvlc_event_t *event, void *userData)  //用来处理当接受到事件的回调函数
{
    chDialog *user = (chDialog*)userData;
    if (event->type == libvlc_MediaPlayerEncounteredError || event->type == libvlc_MediaPlayerEndReached)
    {
        user->Count++; 
        if (user->Count<100)     //用来计数重连次数是否超过100
        user->ConDlg->PostMessage(WM_Myreplay, 0, 0);  //将自定义消息(WM_Myreplay)发给控制窗口(ConDlg)//(这里不能直接调用stop或play,因为可能会造成死锁现象,可以用启用一个线程来开启play,因为我在启用线程出现了图标错误的问题,采用了mfc中postMessage的形式,通过处理自定义消息(WM_Myreplay来开启play)
    }
}

3.之前有考虑用利用libvlc实现一个循环播放,但后来发现无法控制循环次数,如果一直重连可能会造成一些资源问题故放弃使用。循环播放代码如下

libvlc_media_list_t *m_list;
libvlc_media_list_player_t *m_playlist;

   m_list = libvlc_media_list_new(s_pVlcInstance);
    vlcMedia = libvlc_media_new_location(s_pVlcInstance, url);
    libvlc_media_list_add_media(m_list, vlcMedia);
    if (vlcMedia)
    {
        libvlc_media_release(vlcMedia);
        m_playlist = libvlc_media_list_player_new(s_pVlcInstance);
        m_pVlcPlayer = libvlc_media_player_new(s_pVlcInstance);
        libvlc_media_list_player_set_media_list(m_playlist, m_list);
        libvlc_media_list_player_set_media_player(m_playlist, m_pVlcPlayer);
        libvlc_media_list_player_set_playback_mode(m_playlist, libvlc_playback_mode_loop);//设置循环播放
        libvlc_media_player_set_hwnd(m_pVlcPlayer, out);
        libvlc_media_list_player_play(m_playlist);

}

4.使用

libvlc_event_manager_t *EventManger;

5.小白一名,有错误望大佬指出。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值