永发信息网

vlc-android要怎么用

答案:1  悬赏:60  手机版
解决时间 2021-03-11 19:36
  • 提问者网友:欺烟
  • 2021-03-11 07:20
vlc-android要怎么用
最佳答案
  • 五星知识达人网友:北城痞子
  • 2021-03-11 08:56
做vlc-android移植的道友都应该知道,当编译完vlc-android 源码后EventManager.java
类中定义了许多事件,下面是源码一部分:

  public class EventManager {

  

  

  

  //public static final int MediaMetaChanged = 0;

  //public static final int MediaSubItemAdded = 1;

  //public static final int MediaDurationChanged = 2;

  //public static final int MediaParsedChanged = 3;

  //public static final int MediaFreed = 4;

  //public static final int MediaStateChanged = 5;

  

  //public static final int MediaPlayerMediaChanged = 0x100;

  //public static final int MediaPlayerNothingSpecial = 0x101;

  //public static final int MediaPlayerOpening = 0x102;

  //public static final int MediaPlayerBuffering = 0x103;

  public static final int MediaPlayerPlaying = 0x104;

  public static final int MediaPlayerPaused = 0x105;

  public static final int MediaPlayerStopped = 0x106;

  

  ......

  }

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

  [java] view plaincopy

  private final VideoEventHandler mEventHandler = new VideoEventHandler(this);

  private class VideoEventHandler extends WeakHandler<DtvPlayer>{

  public VideoEventHandler(DtvPlayer owner) {

  super(owner);

  }

  @Override

  public void handleMessage(Message msg) {

  DtvPlayer activity = getOwner();

  if(activity == null) return;

  switch (msg.getData().getInt("event")) {

  case EventManager.MediaPlayerBuffering:

  Log.d(TAG, "MediaPlayerBuffering");

  break;

  case EventManager.MediaPlayerEncounteredError:

  Log.d(TAG, "MediaPlayerEncounteredError");

  break;

  ......

  default:

  Log.e(TAG, String.format("Event not handled (0x%x)", msg.getData().getInt("event")));

  break;

  }

  super.handleMessage(msg);

  }

  }

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

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

  [html] view plaincopy

  static const libvlc_event_type_t mp_events[] = {

  libvlc_MediaPlayerPlaying,

  libvlc_MediaPlayerPaused,

  libvlc_MediaPlayerEndReached,

  libvlc_MediaPlayerStopped,

  libvlc_MediaPlayerVout,

  libvlc_MediaPlayerPositionChanged

  };

  你可以将自己需要的事件添加在里面,然后将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

  #define DEF( a ) { libvlc_##a, #a, },

  

  typedef struct

  {

  int type;

  const char name[40];

  } event_name_t;

  

  static const event_name_t event_list[] = {

  DEF(MediaMetaChanged)

  DEF(MediaSubItemAdded)

  DEF(MediaDurationChanged)

  DEF(MediaParsedChanged)

  DEF(MediaFreed)

  DEF(MediaStateChanged)

  

  DEF(MediaPlayerMediaChanged)

  DEF(MediaPlayerNothingSpecial)

  DEF(MediaPlayerOpening)

  DEF(MediaPlayerBuffering)

  DEF(MediaPlayerPlaying)

  DEF(MediaPlayerPaused)

  DEF(MediaPlayerStopped)

  DEF(MediaPlayerForward)

  DEF(MediaPlayerBackward)

  DEF(MediaPlayerEndReached)

  DEF(MediaPlayerEncounteredError)

  DEF(MediaPlayerTimeChanged)

  DEF(MediaPlayerPositionChanged)

  DEF(MediaPlayerSeekableChanged)

  DEF(MediaPlayerPausableChanged)

  DEF(MediaPlayerTitleChanged)

  DEF(MediaPlayerSnapshotTaken)

  DEF(MediaPlayerLengthChanged)

  DEF(MediaPlayerVout)

  

  DEF(MediaListItemAdded)

  DEF(MediaListWillAddItem)

  DEF(MediaListItemDeleted)

  DEF(MediaListWillDeleteItem)

  

  DEF(MediaListViewItemAdded)

  DEF(MediaListViewWillAddItem)

  DEF(MediaListViewItemDeleted)

  DEF(MediaListViewWillDeleteItem)

  

  DEF(MediaListPlayerPlayed)

  DEF(MediaListPlayerNextItemSet)

  DEF(MediaListPlayerStopped)

  

  DEF(MediaDiscovererStarted)

  DEF(MediaDiscovererEnded)

  

  DEF(VlmMediaAdded)

  DEF(VlmMediaRemoved)

  DEF(VlmMediaChanged)

  DEF(VlmMediaInstanceStarted)

  DEF(VlmMediaInstanceStopped)

  DEF(VlmMediaInstanceStatusInit)

  DEF(VlmMediaInstanceStatusOpening)

  DEF(VlmMediaInstanceStatusPlaying)

  DEF(VlmMediaInstanceStatusPause)

  DEF(VlmMediaInstanceStatusEnd)

  DEF(VlmMediaInstanceStatusError)

  };

  #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中。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯