思路:利用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.小白一名,有错误望大佬指出。