用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

posted @ 2015-08-22 11:05  foo__hack  阅读(3164)  评论(0编辑  收藏  举报