VLC做客户端解Rtsp码流

来源:互联网 发布:linux debug调试 编辑:程序博客网 时间:2024/06/05 04:35

转载地址:http://download.csdn.net/detail/arvinotw/4934860

RTSP流解码为RGBA数据。

VLC版本2.1.3

vs 2008.



为了从Rtsp地址获取实时帧数据,看了Live555和VLC的一些Demo。


VLC作为Rtsp的客户端,拉网络视频流。然后进行实时解码(内部进行),自己获得码流(RGBA数据,32位RGB),显示.

[cpp] view plaincopy
  1. </pre><pre name="code" class="cpp">介绍就不说了,基本流程。  
  2. 1. libvlc_new  
  3. 2. libvlc_media_new_location  
  4. 3. libvlc_media_player_new_from_media  
  5.    libvlc_media_release  
  6. 4. libvlc_video_set_callbacks  
  7.    libvlc_video_set_format  
  8.      
  9.    如果仅仅只想显示,第四步骤换为:  
  10.    libvlc_media_player_set_hwnd  
  11. 5. libvlc_media_player_play  
  12.   
  13. loop  
  14.   
  15. 6. libvlc_media_player_release  
  16.    libvlc_release  
[cpp] view plaincopy
  1. </pre><pre name="code" class="cpp">介绍就不说了,基本流程。  
  2. 1. libvlc_new  
  3. 2. libvlc_media_new_location  
  4. 3. libvlc_media_player_new_from_media  
  5.    libvlc_media_release  
  6. 4. libvlc_video_set_callbacks  
  7.    libvlc_video_set_format  
  8.      
  9.    如果仅仅只想显示,第四步骤换为:  
  10.    libvlc_media_player_set_hwnd  
  11. 5. libvlc_media_player_play  
  12.   
  13. loop  
  14.   
  15. 6. libvlc_media_player_release  
  16.    libvlc_release  



[cpp] view plaincopy
  1. if(m_bNew == true)  
  2.     {  
  3.         m_bNew = false;  
  4.   
  5.         m_vlcMedia = libvlc_media_new_location(m_vlcInst, "rtsp://码流地址");  
  6.   
  7.         m_vlcMplay = libvlc_media_player_new_from_media(m_vlcMedia);  
  8.         libvlc_media_release(m_vlcMedia);  
  9.   
  10.         libvlc_media_player_set_hwnd(m_vlcMplay, m_hWndVideo);  
  11.         libvlc_video_set_callbacks(m_vlcMplay, libvlc_video_lock_cb_callback, libvlc_video_unlock_cb_callback, libvlc_video_display_cb_callback, 0);  
  12.         libvlc_video_set_format(m_vlcMplay, "RGBA", width, height, width*4);  
  13.     }  
  14.       
  15.     int res = libvlc_media_player_play(m_vlcMplay);  
[cpp] view plaincopy
  1. if(m_bNew == true)  
  2.     {  
  3.         m_bNew = false;  
  4.   
  5.         m_vlcMedia = libvlc_media_new_location(m_vlcInst, "rtsp://码流地址");  
  6.   
  7.         m_vlcMplay = libvlc_media_player_new_from_media(m_vlcMedia);  
  8.         libvlc_media_release(m_vlcMedia);  
  9.   
  10.         libvlc_media_player_set_hwnd(m_vlcMplay, m_hWndVideo);  
  11.         libvlc_video_set_callbacks(m_vlcMplay, libvlc_video_lock_cb_callback, libvlc_video_unlock_cb_callback, libvlc_video_display_cb_callback, 0);  
  12.         libvlc_video_set_format(m_vlcMplay, "RGBA", width, height, width*4);  
  13.     }  
  14.       
  15.     int res = libvlc_media_player_play(m_vlcMplay);  


为了获得实时流,就需要进行回调libvlc_video_set_callbacks

就需要设置三个回调, 我们需要获得buffer的大小,视频的width和height,buffer大小为width*height*4。在lock函数中需要锁住,在unlock中解锁。干活在display中,

这里为了方便,直接利用opencv显示出来了。

原先用CMutex类和CSinglelock进行锁,结果一直出问题,就自己弄了两个函数。目前在单个视频流还没问题。


这里比较重要的是,display会将 *planes  赋值,数据指针,就必须传给*planes。 


[cpp] view plaincopy
  1. void *libvlc_video_lock_cb_callback(void *opaque, void **planes)  
  2. {  
  3.     Lock();  
  4.     memset(buffer, 0, sizeof buffer);  
  5.     *planes = buffer;  
  6.     return NULL;  
  7. }  
  8. void libvlc_video_unlock_cb_callback(void *opaque, void *picture,  
  9.                                void *const *planes)  
  10. {     
  11.     Unlock();  
  12. }  
  13.   
  14.   
  15. void libvlc_video_display_cb_callback(void *opaque, void *picture)  
  16. {  
  17.     if (Islock())  
  18.     {  
  19.         IplImage *img = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 4);  
  20.         img->imageData = buffer;  
  21.         cvShowImage(name, img);  
  22.         cvWaitKey(10);  
  23.         cvReleaseImage(&img);  
  24.         //fwrite(buffer, sizeof buffer, 1, fp);   
  25.     }  
  26. }  
[cpp] view plaincopy
  1. void *libvlc_video_lock_cb_callback(void *opaque, void **planes)  
  2. {  
  3.     Lock();  
  4.     memset(buffer, 0, sizeof buffer);  
  5.     *planes = buffer;  
  6.     return NULL;  
  7. }  
  8. void libvlc_video_unlock_cb_callback(void *opaque, void *picture,  
  9.                                void *const *planes)  
  10. {     
  11.     Unlock();  
  12. }  
  13.   
  14.   
  15. void libvlc_video_display_cb_callback(void *opaque, void *picture)  
  16. {  
  17.     if (Islock())  
  18.     {  
  19.         IplImage *img = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 4);  
  20.         img->imageData = buffer;  
  21.         cvShowImage(name, img);  
  22.         cvWaitKey(10);  
  23.         cvReleaseImage(&img);  
  24.         //fwrite(buffer, sizeof buffer, 1, fp);  
  25.     }  
  26. }  

[cpp] view plaincopy
  1. BOOL lock = FALSE;  
  2. void Lock()  
  3. {  
  4.     lock = TRUE;  
  5. }  
  6. void Unlock()  
  7. {  
  8.     lock = FALSE;  
  9. }  
  10. BOOL Islock()  
  11. {  
  12.     return lock;  
  13. }  
[cpp] view plaincopy
  1. BOOL lock = FALSE;  
  2. void Lock()  
  3. {  
  4.     lock = TRUE;  
  5. }  
  6. void Unlock()  
  7. {  
  8.     lock = FALSE;  
  9. }  
  10. BOOL Islock()  
  11. {  
  12.     return lock;  
  13. }  



VLC Doxygen文档: http://www.videolan.org/developers/vlc/doc/doxygen/html/group__libvlc.html


VLC网址: videolan.org


VLC Documentation: https://wiki.videolan.org/LibVLC/


VLC维护人员?不知道是不是: http://www.jbkempf.com/blog/


VLC平台编译: http://jeremiah.blog.51cto.com/539865/114550


VS编译VLC方法: http://wenku.baidu.com/link?url=i91eXbrOY7Gf-8tO1TG6J7BWC7lIOZtheFSQ9YRaTuMD1kQowxQUFdX--LmYyTMnZAVU4NHdJ6VoztRnZmLpeTJQ2XXnFxadX97bfRWHnDq


VLC简介及使用说明、编译: http://blog.csdn.net/zhoujiaxq/article/details/9958793


windows使用libvlc进行网络串流遇到的一些问题及解决方法: http://www.cnblogs.com/youfal/p/3830830.html
0 0
原创粉丝点击