3

我想订阅 android vlc 应用程序中的 MediaPlayer 缓冲事件。

我编辑了 EventHandler 类并取消了事件常量的注释。

public static final int MediaPlayerBuffering            = 0x103; // ** uncommented this**
public static final int MediaPlayerPlaying                = 0x104;

然后我在 libvlcjni.c 中添加了变量

libvlc_event_manager_t *ev = libvlc_media_player_event_manager(mp);
static const libvlc_event_type_t mp_events[] = {
    libvlc_MediaPlayerPlaying,
    libvlc_MediaPlayerPaused,
    libvlc_MediaPlayerEndReached,
    libvlc_MediaPlayerStopped,
    libvlc_MediaPlayerVout,
    libvlc_MediaPlayerPositionChanged,
    libvlc_MediaPlayerEncounteredError,
    libvlc_MediaPlayerBuffering // **added this here**
};

重新编译 jni 以获取 so 文件,然后构建 vlc 应用程序,但该事件似乎永远不会触发。

当由于带宽不足而发生缓冲事件时,我还必须链接到哪里才能触发事件。

我可以在 logcat 中看到它打印 1001 毫秒缓冲在 6 毫秒内。但这来自较低层而不是 java 层

4

2 回答 2

4

必须在 libvlcjni.c 文件中添加它

else if(ev->type == libvlc_MediaPlayeBuffering) {
    /* For determining the vout/ES track change */
    jstring sData = (*env)->NewStringUTF(env, "data");
    (*env)->CallVoidMethod(env, bundle, putFloat, sData, ev->u.media_player_buffer.new_cache);
    (*env)->DeleteLocalRef(env, sData);
}

希望这可以帮助某人

于 2013-06-25T19:29:44.780 回答
2

else if(ev->type == libvlc_MediaPlayerBuffering) { /* For determining the vout/ES track change */ jstring sData = (*env)->NewStringUTF(env, "data"); (*env)->CallVoidMethod(env, bundle, putFloat, sData, ev->u.media_player_buffering.new_cache); (*env)->DeleteLocalRef(env, sData); }

答案是 ev->u.media_player_buffering.new_cache

在 VLC 文件 mediaPlayer.c 我找到了这段代码:

`else if( newval.i_int == INPUT_EVENT_CACHE )
   {
    event.type = libvlc_MediaPlayerBuffering;
    event.u.media_player_buffering.new_cache = (int)(100 * var_GetFloat( p_input, "cache" ));
    libvlc_event_send( p_mi->p_event_manager, &event );
}

`

并在 libvlc_events.h

/* media instance */ struct { float new_cache; } media_player_buffering;

然后,我编译它并且它工作。特别感谢我在海岸的男孩特蕾西!

于 2013-08-02T06:24:13.387 回答