vlc源碼分析
❶ vlc源代碼如何使用
如果是用VC 6的打開dsw 後綴的文件,如果是VS 20003 打開sln 文件
如果是VS2005則打開 vcproject(這個名稱比較長,忘了,不知是不是這個,不過差不多的)
❷ vlc源碼中,main函數所在文件在哪裡。找不到main函數了
bin/vlc.c
❸ vlc-android要怎麼用
做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: [java] view plain 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 plain 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 plain #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中。
❹ 怎麼在新版本的vlcandroid中使用舊版本的vlc
做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 = 0
❺ 求vlc播放器的源代碼
最新版源碼下載地址: http://download.videolan.org/pub/videolan/vlc/1.1.7/vlc-1.1.7.tar.bz2
但是官方不支持使用VC編譯,並且不建議使用VC,移植難度很大。
官方支持的是MingW或者Cygwin,也就是GCC的Windows版。編譯方法見官方Wiki:
- http://wiki.videolan.org/Win32CompileMSYS
- http://wiki.videolan.org/Win32CompileCygwin
❻ vlc for android為什麼沒有串流功能
做vlc-android移植的道友都應該知道,當編譯完vlc-android源碼後EventManager.java類中定義了許多事件,下面是源碼一部分:publicclassEventManager{/**.*///=0;//=1;//=2;//=3;//=4;//=5;//=0x100;//=0x101;//=0x102;//=0x103;=0x104;=0x105;=0x106;}可是對於這些事件有很多都被注釋掉了,當我們需要被注釋掉的事件時,就算把注釋拿掉,再調用mEventManager.addHandler(EventManager.getInstance())添加事件之後,也不會在定義的mEventHandler的handleMessage()中監聽到,下面為一個mEventHandler定義的demo:[java]=newVideoEventHandler(this);{publicVideoEventHandler(DtvPlayerowner){super(owner);}@(Messagemsg){DtvPlayeractivity=getOwner();if(activity==null)return;switch(msg.getData().getInt("event")){caseEventManager.MediaPlayerBuffering:Log.d(TAG,"MediaPlayerBuffering");break;caseEventManager.MediaPlayerEncounteredError:Log.d(TAG,"MediaPlayerEncounteredError");break;default:Log.e(TAG,String.format("Eventnothandled(0x%x)",msg.getData().getInt("event")));break;}super.handleMessage(msg);}}那麼如何才能夠在mEventHandler中監聽到我們需要的事件呢,下面將進入主題。在libvlcjni.c中有一個靜態常量,其中指定了我們目前需要獲取哪些事件:[html]viewplainstaticconstlibvlc_event_type_tmp_events[]={libvlc_MediaPlayerPlaying,libvlc_MediaPlayerPaused,libvlc_MediaPlayerEndReached,libvlc_MediaPlayerStopped,libvlc_MediaPlayerVout,libvlc_MediaPlayerPositionChanged};你可以將自己需要的事件添加在裡面,然後將EventManager中響應的事件注釋拿掉,之後重新編譯源碼就可以再mEventHandler中獲取你剛添加的事件了。(例如:你要想獲取MediaPlayerEncounteredError事件,先將libvlc_MediaPlayerEncounteredError添加在mp_events[]靜態常量中(注意,這里前面多了libvlc_),然後把EventManager中的=0x10a;注釋拿掉,重新編譯源碼之後就可以在你得mEventHandler的handleMessage()中獲取到EventManger.MediaPlayerEncounteredError事件)。在vlc-android/vlc/lib/event.c中定義了所有事件:[cpp]viewplain#defineDEF(a){libvlc_##a,#a,},typedefstruct{inttype;constcharname[40];}event_name_t;staticconstevent_name_tevent_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)};#undefDEF其中DEF()將MediaPlayerEncounteredError定義為libvlc_MediaPlayerEncounteredError,當本地代碼產生MediaPlayerEncounteredError事件時會將libvlc_MediaPlayerEncounteredError傳遞給jni,與此同時jni又會傳遞給java層。不管是本地libvlc_MediaPlayerEncounteredError還是java層MediaPlayerEncounteredError,對於同一個事件被定義的值都是相同的,傳輸的是同一個消息值。本地代碼定義在vlc-android/vlc/include/libvlc_events.h,java代碼定義在EventManager.java中。