vlc-android 获取MediaPlayerEncounteredError,MediaPlayerBuffering等各种事件的响应

来源:互联网 发布:网络监控系统主要功能 编辑:程序博客网 时间:2024/04/30 01:46
前面有篇文章介绍了调用libvlcjni.so 实现流媒体播放器,在将那篇文章写了之后,开发的项目中又需要更新,其中涉及到了获取MediaPlayerEncounteredError,MediaPlayerBuffering等事件的响应,在网上找了好久都无果,自己花了不少时间终于找到了想要的结果。再次记录出来以防以后淡忘再做重复工作,也希望可以帮助遇到同样问题的道友。

         做vlc-android移植的道友都应该知道,当编译完vlc-android 源码后EventManager.java 类中定义了许多事件,下面是源码一部分:

 

[java] view plaincopy
  1. public class EventManager {  
  2.   
  3.     /* 
  4.      * Be sure to subscribe to events you need in the JNI too. 
  5.      */  
  6.   
  7.     //public static final int MediaMetaChanged                = 0;  
  8.     //public static final int MediaSubItemAdded               = 1;  
  9.     //public static final int MediaDurationChanged            = 2;  
  10.     //public static final int MediaParsedChanged              = 3;  
  11.     //public static final int MediaFreed                      = 4;  
  12.     //public static final int MediaStateChanged               = 5;  
  13.   
  14.     //public static final int MediaPlayerMediaChanged         = 0x100;  
  15.     //public static final int MediaPlayerNothingSpecial       = 0x101;  
  16.     //public static final int MediaPlayerOpening              = 0x102;  
  17.     //public static final int MediaPlayerBuffering            = 0x103;  
  18.     public static final int MediaPlayerPlaying                = 0x104;  
  19.     public static final int MediaPlayerPaused                 = 0x105;  
  20.     public static final int MediaPlayerStopped                = 0x106;  
  21.   
  22. ......  
  23. }  


 

        可是对于这些事件有很多都被注释掉了,当我们需要被注释掉的事件时,就算把注释拿掉,再调用mEventManager.addHandler(EventManager.getInstance())添加事件之后,也不会在定义的mEventHandler 的handleMessage()中监听到,下面为一个mEventHandler定义的demo:

[java] view plaincopy
  1. private final VideoEventHandler mEventHandler = new VideoEventHandler(this);  
  2.  private class VideoEventHandler extends WeakHandler<DtvPlayer>{  
  3.     public VideoEventHandler(DtvPlayer owner) {  
  4.          super(owner);  
  5.      }  
  6.     @Override  
  7.     public void handleMessage(Message msg) {  
  8.         DtvPlayer activity = getOwner();              
  9.          if(activity == nullreturn;  
  10.          switch (msg.getData().getInt("event")) {  
  11.          case EventManager.MediaPlayerBuffering:  
  12.              Log.d(TAG, "MediaPlayerBuffering");  
  13.              break;  
  14.           case EventManager.MediaPlayerEncounteredError:  
  15.             Log.d(TAG, "MediaPlayerEncounteredError");  
  16.         break;  
  17.     ......  
  18.           default:  
  19.               Log.e(TAG, String.format("Event not handled (0x%x)", msg.getData().getInt("event")));  
  20.               break;  
  21.       }  
  22.         super.handleMessage(msg);  
  23.     }  
  24.  }  

        那么如何才能够在mEventHandler中监听到我们需要的事件呢,下面将进入主题。

        在libvlcjni.c中有一个静态常量,其中指定了我们目前需要获取哪些事件:

[html] view plaincopy
  1. static const libvlc_event_type_t mp_events[] = {  
  2.     libvlc_MediaPlayerPlaying,  
  3.     libvlc_MediaPlayerPaused,  
  4.     libvlc_MediaPlayerEndReached,  
  5.     libvlc_MediaPlayerStopped,  
  6.     libvlc_MediaPlayerVout,  
  7.     libvlc_MediaPlayerPositionChanged  
  8. };  

        你可以将自己需要的事件添加在里面,然后将EventManager中响应的事件注释拿掉,之后重新编译源码就可以再mEventHandler中获取你刚添加的事件了。

(例如:你要想获取MediaPlayerEncounteredError事件,先将libvlc_MediaPlayerEncounteredError添加在mp_events[]静态常量中(注意,这里前面多了libvlc_),然后把EventManager中的public static final int MediaPlayerEncounteredError     = 0x10a;注释拿掉,重新编译源码之后就可以在你得mEventHandler 的handleMessage()中获取到EventManger.MediaPlayerEncounteredError事件)。

        在vlc-android/vlc/lib/event.c中定义了所有事件:

[cpp] view plaincopy
  1. #define DEF( a ) { libvlc_##a, #a, },  
  2.   
  3. typedef struct  
  4. {  
  5.     int type;  
  6.     const char name[40];  
  7. } event_name_t;  
  8.   
  9. static const event_name_t event_list[] = {  
  10.     DEF(MediaMetaChanged)  
  11.     DEF(MediaSubItemAdded)  
  12.     DEF(MediaDurationChanged)  
  13.     DEF(MediaParsedChanged)  
  14.     DEF(MediaFreed)  
  15.     DEF(MediaStateChanged)  
  16.   
  17.     DEF(MediaPlayerMediaChanged)  
  18.     DEF(MediaPlayerNothingSpecial)  
  19.     DEF(MediaPlayerOpening)  
  20.     DEF(MediaPlayerBuffering)  
  21.     DEF(MediaPlayerPlaying)  
  22.     DEF(MediaPlayerPaused)  
  23.     DEF(MediaPlayerStopped)  
  24.     DEF(MediaPlayerForward)  
  25.     DEF(MediaPlayerBackward)  
  26.     DEF(MediaPlayerEndReached)  
  27.     DEF(MediaPlayerEncounteredError)  
  28.     DEF(MediaPlayerTimeChanged)  
  29.     DEF(MediaPlayerPositionChanged)  
  30.     DEF(MediaPlayerSeekableChanged)  
  31.     DEF(MediaPlayerPausableChanged)  
  32.     DEF(MediaPlayerTitleChanged)  
  33.     DEF(MediaPlayerSnapshotTaken)  
  34.     DEF(MediaPlayerLengthChanged)  
  35.     DEF(MediaPlayerVout)  
  36.   
  37.     DEF(MediaListItemAdded)  
  38.     DEF(MediaListWillAddItem)  
  39.     DEF(MediaListItemDeleted)  
  40.     DEF(MediaListWillDeleteItem)  
  41.   
  42.     DEF(MediaListViewItemAdded)  
  43.     DEF(MediaListViewWillAddItem)  
  44.     DEF(MediaListViewItemDeleted)  
  45.     DEF(MediaListViewWillDeleteItem)  
  46.   
  47.     DEF(MediaListPlayerPlayed)  
  48.     DEF(MediaListPlayerNextItemSet)  
  49.     DEF(MediaListPlayerStopped)  
  50.   
  51.     DEF(MediaDiscovererStarted)  
  52.     DEF(MediaDiscovererEnded)  
  53.   
  54.     DEF(VlmMediaAdded)  
  55.     DEF(VlmMediaRemoved)  
  56.     DEF(VlmMediaChanged)  
  57.     DEF(VlmMediaInstanceStarted)  
  58.     DEF(VlmMediaInstanceStopped)  
  59.     DEF(VlmMediaInstanceStatusInit)  
  60.     DEF(VlmMediaInstanceStatusOpening)  
  61.     DEF(VlmMediaInstanceStatusPlaying)  
  62.     DEF(VlmMediaInstanceStatusPause)  
  63.     DEF(VlmMediaInstanceStatusEnd)  
  64.     DEF(VlmMediaInstanceStatusError)  
  65. };  
  66. #undef DEF  

        其中DEF()将MediaPlayerEncounteredError定义为libvlc_MediaPlayerEncounteredError,当本地代码产生MediaPlayerEncounteredError事件时会将libvlc_MediaPlayerEncounteredError传递给jni,与此同时jni又会传递给java层。不管是本地libvlc_MediaPlayerEncounteredError还是java层MediaPlayerEncounteredError,对于同一个事件被定义的值都是相同的,传输的是同一个消息值。本地代码定义在vlc-android/vlc/include/libvlc_events.h, java代码定义在EventManager.java中。

from:http://blog.csdn.net/memegood123/article/details/8769008

0 0