如何去除vlc android 播放时的libvlc 缓存机制圈圈

[原]第四篇、vlc-android和Vitamio使用比较 - 推酷
[原]第四篇、vlc-android和Vitamio使用比较
在开始接触udp组播的时候先使用的Vitamio,播放时候声音卡顿 画面也会出现卡顿,后来又使用了VLC,画面挺好,但是声音卡顿。最后不断测试发现是由于设备底层驱动处理视频部分有问题,导致程序播出的效果不太好,后来经过底层更改了声音的输出比特率等一些配置,再进行测试发现两个都可以使用,效果都不错。但是对两个长时间测试整理了以下。
优点:对H264的视频,支持硬解MPEG2的不能硬解
缺点:对直播一小段视频不能重复的播放,直播完,再继续播放时候会停止。可能程序还需要设置一下。这个问题应该不难。具体可以参考官网给的API进行设置&
优点:程序打开可以一直播放UDP组播流,如果一段播放完还可以重复播放,对播放事件处理比较好。
缺点:对设备版本在4.4 下不支持硬解 。有时候在释放资源时候会出现无法释放现象。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致3267人阅读
多媒体(9)
android入门(12)
在这篇文章《》里,我找到了用vlc实现Android版本截图的功能,但是录制视频的功能是不正确的。
其录制视频的方法,对vlc底层的开始录制和结束录制,都不能很好的控制。
鉴于此,我们对vlc代码进行修改,编译。
参见http://patches.videolan.org/patch/606/
diff --git a/include/vlc/libvlc_events.h b/include/vlc/libvlc_events.h
index 2cfedbf..25a16ea 100644
--- a/include/vlc/libvlc_events.h
+++ b/include/vlc/libvlc_events.h
@@ -72,6 +72,8 @@
enum libvlc_event_e {
libvlc_MediaPlayerSnapshotTaken,
libvlc_MediaPlayerLengthChanged,
libvlc_MediaPlayerVout,
libvlc_MediaPlayerRecordableChanged,
libvlc_MediaPlayerRecordingFinished,
libvlc_MediaListItemAdded=0x200,
libvlc_MediaListWillAddItem,
@@ -165,6 +167,14 @@
typedef struct libvlc_event_t
} media_player_pausable_
} media_player_recordable_
char *psz_
} media_player_recording_
} media_player_
diff --git a/include/vlc/libvlc_media_player.h b/include/vlc/libvlc_media_player.h
index aefef02..8ddef37 100644
--- a/include/vlc/libvlc_media_player.h
+++ b/include/vlc/libvlc_media_player.h
@@ -28,121 @@
LIBVLC_API int libvlc_audio_set_delay( libvlc_media_player_t *p_mi, int64_t i_de
/** @} audio */
+ * Can the media player record the current media?
+ * Media must be buffering or playing before it can be recorded.
+ * The media player event manager will emit a libvlc_MediaPlayerRecordableChanged event
+ * when the recordable state changes after starting media playback. The event data will
+ * describe the new recordable state, so invocation of this API method is not strictly
+ * necessary to determine when recording can be started.
+ * A libvlc_MediaPlayerRecordableChanged event will not be emitted if the media is
+ * stopped (notified by a libvlc_MediaPlayerStoppedEvent) or finishes normally (notified
+ * by a libvlc_MediaPlayerFinished event).
+ * A calling application should therefore register an event callback for those events
+ * so that it may query the new recordable state and manage recording at the appropriate
+ * \param p_mi media player
+ * \return true if the media player can record, false if it can not
+ * \version LibVLC 2.1.0 or later
+LIBVLC_API bool libvlc_media_player_is_recordable( libvlc_media_player_t *p_mi );
+ * Is the current media being recorded?
+ * \param p_mi media player
+ * \return true if recording, false if not
+ * \version LibVLC 2.1.0 or later
+LIBVLC_API bool libvlc_media_player_is_recording( libvlc_media_player_t *p_mi );
+ * Start recording the current media.
+ * Media must be buffering or playing before it can be recorded. A calling application
+ * can begin recording immediately on receipt of a libvlc_MediaPlayerRecordableChanged
+ * event sent via the media player event manager (if recording is possible for the
+ * currently playing media), and any time thereafter until the media stops.
+ * Media will be saved to the file path denoted by the psz_filename parameter if it is
+ * supplied. Any such supplied filename should not include a file extension as the
+ * correct file extension will automatically be appended when the file is created. This
+ * filename may denote a full path name, but each directory in the path must already
+ * exist or recording will silently fail. If the calling application chooses to specify
+ * the filename then it is the responsibility of that application to take account of
+ * this and itself make sure any needed directories are created.
+ * Alternatively, a calling application need not supply a filename and so instead let
+ * vlc automatically generate a unique filename. This will cause vlc to create a new
+ * file in the appropriate media directory for the user - for example &~/Videos&. The
+ * actual filename used will be sent in an event when the recording is complete.
+ * When recording has finished and the new file has been completely saved, a
+ * libvlc_MediaPlayerRecordingFinished event will be sent via the media player event
+ * manager. The event data will contain the filename of the newly recorded file - this
+ * will either be the filename as specified by the calling application or a filename
+ * generated by vlc if the application did not supply a filename. In either case, this
+ * filename will include the automatically appended file extension.
+ * The saved media file will not be immediately available or visible until recording
+ * has completely finished and the libvlc_MediaPlayerRecordingFinished event has been
+ * received, or the media has stopped or finished normally.
+ * Recording can be stopped and started on-the-fly once the rec
+ * each time recording is stopped and restarted a new file will be created so a calling
+ * application should take care to provide unique filenames, or defer to vlc to create
+ * unique filenames.
+ * Recording will be stopped when the media stops playing, and must be explicitly
+ * started again to restart recording, i.e. the recording state is not automatically
+ * preserved when playing media subsequently.
+ * Media player functionailty such as next/previous chapter, set time or position and
+ * so on are ineffective when recording is enabled. However, pausing the media is
+ * possible and will unpausing the media will resume playback and
+ * recording.
+ * Recording of the primary media or sub-items is possible.
+ * \param p_mi media player
+ * \param psz_filename name of the file to save the media to, not including any file extension,
or NULL if vlc should generate the filename automatically
+ * \return 0 if recording was started, -1 on error
+ * \version LibVLC 2.1.0 or later
+LIBVLC_API int libvlc_media_player_record_start( libvlc_media_player_t *p_mi, const char *psz_filename );
+ * Stop recording the current media.
+ * This method requests that the recording stop, and will return immediately. Recording
+ * will not stop immediately.
+ * When the recording actually stops some short time later and the new file has
+ * finished being written, a libvlc_MediaPlayerRecordingFinished event will be sent via
+ * the media player event manager. The newly recorded file will not be visible or
+ * available until after this event has been sent.
+ * The event data will contain the full name of the file that was created. The filename
+ * will either be that as was specified by the calling application on invoking
+ * libvlc_media_player_record_start(), or the filename that vlc automatically generated
+ * if the calling application did not supply its own filename. In either case the
+ * filename will contain the automatically appended file extension.
+ * There is no need to invoke this method to stop the recording if the media is stopped
+ * or finishes playing normally.
+ * \param p_mi media player
+ * \return 0 if recording was stopped, -1 on error
+ * \version LibVLC 2.1.0 or later
+LIBVLC_API int libvlc_media_player_record_stop( libvlc_media_player_t *p_mi );
/** @} media_player */
# ifdef __cplusplus
diff --git a/lib/event.c b/lib/event.c
index c71a48a..7ef4abd 100644
--- a/lib/event.c
+++ b/lib/event.c
@@ -279,6 +279,8 @@
static const event_name_t event_list[] = {
DEF(MediaPlayerSnapshotTaken)
DEF(MediaPlayerLengthChanged)
DEF(MediaPlayerVout)
DEF(MediaPlayerRecordableChanged)
DEF(MediaPlayerRecordingFinished)
DEF(MediaListItemAdded)
DEF(MediaListWillAddItem)
diff --git a/lib/libvlc.sym b/lib/libvlc.sym
index 42dad5c..3ff67ef 100644
--- a/lib/libvlc.sym
+++ b/lib/libvlc.sym
@@ -137,6 +137,8 @@
libvlc_media_player_get_title
libvlc_media_player_get_title_count
libvlc_media_player_get_xwindow
libvlc_media_player_has_vout
+libvlc_media_player_is_recordable
+libvlc_media_player_is_recording
libvlc_media_player_is_seekable
libvlc_media_player_is_playing
libvlc_media_player_new
@@ -146,6 +148,8 @@
libvlc_media_player_set_pause
libvlc_media_player_pause
libvlc_media_player_play
libvlc_media_player_previous_chapter
+libvlc_media_player_record_start
+libvlc_media_player_record_stop
libvlc_media_player_release
libvlc_media_player_retain
libvlc_media_player_set_agl
diff --git a/lib/media_player.c b/lib/media_player.c
index a41b8c7..644
--- a/lib/media_player.c
+++ b/lib/media_player.c
@@ -64,6 +64,10 @@
input_pausable_changed( vlc_object_t * p_this, char const * psz_cmd,
vlc_value_t oldval, vlc_value_t newval,
void * p_userdata );
static int
+input_recordable_changed( vlc_object_t *p_this, char const *psz_cmd,
vlc_value_t oldval, vlc_value_t newval,
void *p_userdata );
+static int
input_event_changed( vlc_object_t * p_this, char const * psz_cmd,
vlc_value_t oldval, vlc_value_t newval,
void * p_userdata );
@@ -72,6 +76,10 @@
static int
snapshot_was_taken( vlc_object_t *p_this, char const *psz_cmd,
vlc_value_t oldval, vlc_value_t newval, void *p_data );
+static int
+file_recording_finished( vlc_object_t *p_this, char const *psz_cmd,
vlc_value_t oldval, vlc_value_t newval, void *p_data );
static void libvlc_media_player_destroy( libvlc_media_player_t *p_mi );
@@ -132,6 +140,8 @@
static void release_input_thread( libvlc_media_player_t *p_mi, bool b_input_abor
input_seekable_changed, p_mi );
var_DelCallback( p_input_thread, &can-pause&,
input_pausable_changed, p_mi );
var_DelCallback( p_input_thread, &can-record&,
input_recordable_changed, p_mi );
var_DelCallback( p_input_thread, &intf-event&,
input_event_changed, p_mi );
@@ -227,6 +237,25 @@
input_pausable_changed( vlc_object_t * p_this, char const * psz_cmd,
static int
+input_recordable_changed( vlc_object_t *p_this, char const *psz_cmd,
vlc_value_t oldval, vlc_value_t newval,
void *p_userdata )
VLC_UNUSED(p_this);
VLC_UNUSED(psz_cmd);
VLC_UNUSED(oldval);
libvlc_media_player_t *p_mi = p_
libvlc_event_
event.type = libvlc_MediaPlayerRecordableC
event.u.media_player_recordable_changed.new_recordable = newval.b_
libvlc_event_send( p_mi-&p_event_manager, &event );
return VLC_SUCCESS;
+static int
input_event_changed( vlc_object_t * p_this, char const * psz_cmd,
vlc_value_t oldval, vlc_value_t newval,
void * p_userdata )
@@ -357,6 +386,23 @@
static int snapshot_was_taken(vlc_object_t *p_this, char const *psz_cmd,
return VLC_SUCCESS;
+static int file_recording_finished(vlc_object_t *p_this, char const *psz_cmd,
vlc_value_t oldval, vlc_value_t newval, void *p_data )
VLC_UNUSED(p_this);
VLC_UNUSED(psz_cmd);
VLC_UNUSED(oldval);
libvlc_media_player_t *p_mi = p_
libvlc_event_
event.type = libvlc_MediaPlayerRecordingF
event.u.media_player_recording_finished.psz_filename = newval.psz_
libvlc_event_send(p_mi-&p_event_manager, &event);
return VLC_SUCCESS;
static input_thread_t *find_input (vlc_object_t *obj)
libvlc_media_player_t *mp = (libvlc_media_player_t *)
@@ -480,6 +526,10 @@
libvlc_media_player_new( libvlc_instance_t *instance )
var_Create (mp, &amem-set-volume&, VLC_VAR_ADDRESS);
var_Create (mp, &amem-format&, VLC_VAR_STRING | VLC_VAR_DOINHERIT);
var_Create (mp, &amem-rate&, VLC_VAR_INTEGER | VLC_VAR_DOINHERIT);
var_Create (mp, &recording-finished&, VLC_VAR_STRING);
var_AddCallback (mp, &recording-finished&, file_recording_finished, mp);
var_Create (mp, &amem-channels&, VLC_VAR_INTEGER | VLC_VAR_DOINHERIT);
mp-&p_md = NULL;
@@ -515,6 +565,9 @@
libvlc_media_player_new( libvlc_instance_t *instance )
register_event(mp, TitleChanged);
register_event(mp, PausableChanged);
register_event(mp, RecordableChanged);
register_event(mp, RecordingFinished);
register_event(mp, Vout);
/* Snapshot initialization */
@@ -566,6 +619,8 @@
static void libvlc_media_player_destroy( libvlc_media_player_t *p_mi )
var_DelCallback( p_mi-&p_libvlc,
&snapshot-file&, snapshot_was_taken, p_mi );
var_DelCallback( p_mi, &recording-finished&, file_recording_finished, p_mi );
/* No need for lock_input() because no other threads knows us anymore */
if( p_mi-&input.p_thread )
release_input_thread(p_mi, true);
@@ -732,12 +787,14 @@
int libvlc_media_player_play( libvlc_media_player_t *p_mi )
var_AddCallback( p_input_thread, &can-seek&, input_seekable_changed, p_mi );
var_AddCallback( p_input_thread, &can-pause&, input_pausable_changed, p_mi );
var_AddCallback( p_input_thread, &can-record&, input_recordable_changed, p_mi );
var_AddCallback( p_input_thread, &intf-event&, input_event_changed, p_mi );
if( input_Start( p_input_thread ) )
unlock_input(p_mi);
var_DelCallback( p_input_thread, &intf-event&, input_event_changed, p_mi );
var_DelCallback( p_input_thread, &can-record&, input_recordable_changed, p_mi );
var_DelCallback( p_input_thread, &can-pause&, input_pausable_changed, p_mi );
var_DelCallback( p_input_thread, &can-seek&, input_seekable_changed, p_mi );
vlc_object_release( p_input_thread );
@@ -66,62 @@
void libvlc_media_player_next_frame( libvlc_media_player_t *p_mi )
vlc_object_release( p_input_thread );
+bool libvlc_media_player_is_recordable( libvlc_media_player_t *p_mi )
input_thread_t *p_input_
bool b_can_
p_input_thread = libvlc_get_input_thread( p_mi );
if( !p_input_thread )
b_can_record = var_GetBool( p_input_thread, &can-record& );
vlc_object_release( p_input_thread );
return b_can_
+bool libvlc_media_player_is_recording( libvlc_media_player_t *p_mi )
input_thread_t *p_input_
p_input_thread = libvlc_get_input_thread( p_mi );
if( !p_input_thread )
b_record = var_GetBool( p_input_thread, &record& );
vlc_object_release( p_input_thread );
+int libvlc_media_player_record_start( libvlc_media_player_t *p_mi, const char* psz_filename )
input_thread_t *p_input_
p_input_thread = libvlc_get_input_thread( p_mi );
if( !p_input_thread )
return -1;
var_SetString( p_input_thread, &input-record-path&, psz_filename );
var_SetBool( p_input_thread, &record&, true );
vlc_object_release( p_input_thread );
+int libvlc_media_player_record_stop( libvlc_media_player_t *p_mi )
input_thread_t *p_input_
p_input_thread = libvlc_get_input_thread( p_mi );
if( !p_input_thread )
return -1;
var_SetBool( p_input_thread, &record&, false );
vlc_object_release( p_input_thread );
diff --git a/modules/stream_out/record.c b/modules/stream_out/record.c
index de6d32e..40ddfea 100644
--- a/modules/stream_out/record.c
+++ b/modules/stream_out/record.c
@@ -110,6 +110,8 @@
struct sout_stream_sys_t
sout_stream_id_t **
char *psz_record_
static void OutputStart( sout_stream_t *p_stream );
@@ -158,6 +160,8 @@
static int Open( vlc_object_t *p_this )
p_sys-&i_dts_start = 0;
TAB_INIT( p_sys-&i_id, p_sys-&id );
p_sys-&psz_record_file = NULL;
return VLC_SUCCESS;
@@ -172,6 +176,19 @@
static void Close( vlc_object_t * p_this )
if( p_sys-&p_out )
sout_StreamChainDelete( p_sys-&p_out, p_sys-&p_out );
if( p_sys-&psz_record_file ) {
for( vlc_object_t *p_mp = p_stream-&p_ p_ p_mp = p_mp-&p_parent )
if( var_Type( p_mp, &recording-finished& ) )
var_SetString( p_mp, &recording-finished&, p_sys-&psz_record_file );
free( p_sys-&psz_record_file );
TAB_CLEAN( p_sys-&i_id, p_sys-&id );
free( p_sys-&psz_prefix );
free( p_sys );
@@ -352,7 +369,10 @@
static int OutputNew( sout_stream_t *p_stream,
if( psz_file && psz_extension )
p_sys-&psz_record_file = strdup( psz_file );
var_SetString( p_stream-&p_libvlc, &record-file&, psz_file );
free( psz_file );
free( psz_output );
diff --git a/src/input/var.c b/src/input/var.c
index f33b9 100644
--- a/src/input/var.c
+++ b/src/input/var.c
@@ -210,6 +210,9 @@
void input_ControlVarInit ( input_thread_t *p_input )
text.psz_string = _(&Subtitles Track&);
var_Change( p_input, &spu-es&, VLC_VAR_SETTEXT, &text, NULL );
/* ES Out */
var_Create( p_input, &input-record-path&, VLC_VAR_STRING | VLC_VAR_DOINHERIT );
/* Special read only objects variables for intf */
var_Create( p_input, &bookmarks&, VLC_VAR_STRING | VLC_VAR_DOINHERIT );
再此基础上,添加jni的接口,编译,然后给java应用层调用,就可以实现Android版的vlc录制视频了。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:73424次
积分:1053
积分:1053
排名:千里之外
原创:20篇
评论:103条
(1)(2)(1)(1)(1)(1)(3)(2)(4)(4)(5)(1)vlc_android显示缓存吧_百度贴吧
签到排名:今日本吧第个签到,
本吧因你更精彩,明天继续来努力!
本吧排名:
本吧签到人数:0
可签7级以上的吧50个
本月漏签0次!
成为超级会员,赠送8张补签卡
连续签到:天&&累计签到:天
超级会员单次开通12个月以上,赠送连续签到卡3张
亲爱的各位吧友:欢迎来到vlc_android显示缓存
发贴红色标题
签到六倍经验
兑换本吧会员
赠送补签卡1张,获得
助攻总额: 43W
使用签名档&2598人阅读
VLC android(9)
前面有篇文章介绍了调用libvlcjni.so 实现流媒体播放器,在将那篇文章写了之后,开发的项目中又需要更新,其中涉及到了获取MediaPlayerEncounteredError,MediaPlayerBuffering等事件的响应,在网上找了好久都无果,自己花了不少时间终于找到了想要的结果。再次记录出来以防以后淡忘再做重复工作,也希望可以帮助遇到同样问题的道友。
&&&&&&& &做vlc-android移植的道友都应该知道,当编译完vlc-android 源码后EventManager.java 类中定义了许多事件,下面是源码一部分:
public&class&EventManager&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&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&&&&&&&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中。
from:http://blog.csdn.net/memegood123/article/details/8769008
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1230288次
积分:12547
积分:12547
排名:第804名
原创:66篇
转载:534篇
评论:133条
(1)(1)(1)(6)(1)(4)(2)(2)(2)(7)(22)(19)(7)(7)(18)(17)(25)(20)(35)(24)(24)(8)(4)(8)(21)(14)(6)(5)(8)(12)(6)(13)(15)(28)(9)(21)(31)(16)(6)(14)(4)(5)(3)(5)(1)(1)(6)(6)(4)(5)(5)(11)(31)(21)(5)

我要回帖

更多关于 ios vlc 设置缓存 的文章

 

随机推荐