用vlc SDK创建一个播放视频文件和RTSP流视频的Demo
1 #include <stdio.h> 2 #include <tchar.h> 3 #include <time.h> 4 #include <windows.h> 5 6 #include <vlc/vlc.h> 7 #pragma comment(lib, "libvlc.lib") 8 #pragma comment(lib, "libvlccore.lib") 9 10 int main(int argc, char* argv[]) 11 { 12 libvlc_instance_t * vlc_ins = NULL; 13 libvlc_media_player_t * vlc_player = NULL; 14 libvlc_media_t * vlc_media = NULL; 15 16 //创建一个vlc实例 17 vlc_ins = libvlc_new(0,NULL); 18 19 if (vlc_ins != NULL) 20 { 21 //从实例上创建一个VLC播放器供视频播放 22 vlc_player = libvlc_media_player_new(vlc_ins); 23 24 if (vlc_player != NULL) 25 { 26 //打开一个RTSP流地址,通过地址创建一个媒体实例 27 vlc_media = libvlc_media_new_location(vlc_ins, "rtsp://218.204.223.237:554/live/1/0547424F573B085C/gsfp90ef4k0a6iap.sdp"); 28 29 30 //打开一个视频文件,通过文件创建一个媒体实例 31 //vlc_media = libvlc_media_new_path(vlc_ins, "D:\\Youku Files\\transcode\\test.avi"); 32 33 if (vlc_media != NULL) 34 { 35 // 解析媒体实例 36 libvlc_media_parse(vlc_media); 37 // 获取媒体文件的播放长度, 返回 ms 38 libvlc_time_t duration = libvlc_media_get_duration(vlc_media); 39 40 // 此处是获取媒体包含多个的视频和音频轨以及其他类型的轨道信息 41 libvlc_media_track_info_t *media_tracks = NULL; 42 int trackCount = libvlc_media_get_tracks_info(vlc_media, &media_tracks); 43 // 这里是释放内存,但我测试的时候会有问题,还没仔细研究是为何 44 // free(media_tracks); // crash? 45 46 // 把打开的媒体文件设置给播放器 47 libvlc_media_player_set_media(vlc_player, vlc_media); 48 49 // 因为是windows系统,所以需要设置一个HWND给播放器作为窗口,这里就直接使用桌面窗口,这里仅是测试 50 libvlc_media_player_set_hwnd(vlc_player, ::GetDesktopWindow()); 51 // 开始播放视频 52 libvlc_media_player_play(vlc_player); 53 54 // 这里仅是为了打印一些信息出来,100000秒后退出 55 time_t last_time = time(NULL); 56 while ((time(NULL) < (last_time + 100000))) 57 { 58 Sleep(10); 59 // 获取当前播放位置 60 libvlc_time_t play_time = libvlc_media_player_get_time(vlc_player); 61 printf("playing time : %lld ms\r", (__int64)(play_time)); 62 63 // 获取媒体的状态 64 // libvlc_state_t media_state = libvlc_media_get_state(vlc_media); 65 // printf("\nmedia state : %d\n", (int)(media_state)); 66 } 67 // 停止 68 libvlc_media_player_stop(vlc_player); 69 // 释放 70 libvlc_media_release(vlc_media); 71 } 72 73 libvlc_media_player_release(vlc_player); 74 75 } 76 77 libvlc_release(vlc_ins); 78 } 79 return 0; 80 }
因为是建立了控制台的程序,播放RTSP流的时候控制台上打印出来了core input error: ES_OUT_RESET_PCR called。
播放本地AVI的时候,控制台上打印出来了core vout display error: Failed to set on top
google了一下,没什么问题,第一个错误消息,可能是网络上的流有什么冲突之类的。第二个错误也不是什么问题。
references:
http://www.bubuko.com/infodetail-782716.html
http://blog.csdn.net/sno_guo/article/details/22388233
http://stackoverflow.com/questions/31636150/vlclib-error-es-out-reset-pcr
http://blog.csdn.net/friendan/article/details/45773629
http://blog.chinaunix.net/uid-26611383-id-3789962.html
https://github.com/kevin-shanghai/Strong_RTSP_Player