vlc-android 获取MediaPlayerEncounteredError,MediaPlayerBuffering等各种事件的响应
来源:互联网 发布:扑克牌发牌程序 java 编辑:程序博客网 时间:2024/05/17 03:11
前面有篇文章介绍了调用libvlcjni.so 实现流媒体播放器,在将那篇文章写了之后,开发的项目中又需要更新,其中涉及到了获取MediaPlayerEncounteredError,MediaPlayerBuffering等事件的响应,在网上找了好久都无果,自己花了不少时间终于找到了想要的结果。再次记录出来以防以后淡忘再做重复工作,也希望可以帮助遇到同样问题的道友。
做vlc-android移植的道友都应该知道,当编译完vlc-android 源码后EventManager.java 类中定义了许多事件,下面是源码一部分:
- public class EventManager {
- /*
- * Be sure to subscribe to events you need in the JNI too.
- */
- //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:
- 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中有一个静态常量,其中指定了我们目前需要获取哪些事件:
- 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中定义了所有事件:
- #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
- vlc-android 获取MediaPlayerEncounteredError,MediaPlayerBuffering等各种事件的响应
- vlc-android 获取MediaPlayerEncounteredError,MediaPlayerBuffering等各种事件的响应
- vlc-android 获取MediaPlayerEncounteredError,MediaPlayerBuffering等各种事件的响应
- 【转】android对OnTouchListener、OnClickListener等事件响应的研究
- android对OnTouchListener、OnClickListener等事件响应的研究
- Android EditText响应drawableRight等的点击事件
- VLC 修改源码,添加对鼠标事件的响应
- android各种点击事件不响应
- android对OnTouchListener、OnClickListener等事件响应
- VLC控件使用及点击事件响应
- Android键盘事件的响应
- android对OnTouchListener、OnClickListener等事件响应的研究(转)
- Android GridView 的item 使用 Button,imagebutton 等ui控件后,不能响应OnItemClick()事件
- 响应事件中屏幕坐标的获取
- 获取table的行,响应onclick事件
- Android 开发事件响应之基于监听的事件响应
- vlc android的编译及截图,录制视频等功能
- vlc android的编译及截图,录制视频等功能
- 清华这个宝塔的基座——“人文日新”一解
- 安卓自定义日期控件(仿QQ,IOS7)续
- iOS - 版面实现记录一
- rstudio server包的安装位置
- ofstream和ifstream详细用法
- vlc-android 获取MediaPlayerEncounteredError,MediaPlayerBuffering等各种事件的响应
- OpenGL模版
- 深入理解RunLoop
- EXTJS4 创建panel,deferredRender : false,
- 使用common-fileupload实现文件上传
- No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386).
- 关于hibernate的一些错误和异常
- 假日1737棋牌源码加几款精品游戏源码,附带数据库完整下载
- ArcGIS对未知坐标系要素建立拓扑查错修错