1. 实例代码(libvlc-android-samples)中 代码中播放视频的操作来自MediaPlayer类的对象
mLibVLC = new LibVLC(this, args);
mMediaPlayer = new MediaPlayer(mLibVLC);
...
final IVLCVout vlcVout = mMediaPlayer.getVLCVout();
vlcVout.setVideoView(mVideoSurface);
if (mSubtitlesSurface != null)
vlcVout.setSubtitlesView(mSubtitlesSurface);
vlcVout.attachViews(this);
Media media = new Media(mLibVLC, Uri.parse(SAMPLE_URL));
mMediaPlayer.setMedia(media);
media.release();
mMediaPlayer.play();
代码地址:https://code.videolan.org/videolan/libvlc-android-samples
2. 想要探究play到底干了什么,显然应该去看MediaPlayer类的代码,于是找到vlc for android(vlc-android)中的代码:srcorgvideolanlibvlcMediaPlayer.java, 代码如下:
public void play() {
synchronized (this) {
if (!mPlaying) {
/* HACK: stop() reset the audio output, so set it again before first play. */
if (mAudioReset) {
if (mAudioOutput != null)
nativeSetAudioOutput(mAudioOutput);
if (mAudioOutputDevice != null)
nativeSetAudioOutputDevice(mAudioOutputDevice);
mAudioReset = false;
}
if (!mAudioDeviceFromUser)
registerAudioPlug(true);
mPlayRequested = true;
if (mWindow.areSurfacesWaiting())
return;
}
mPlaying = true;
}
nativePlay();
}
目标锁定在nativePlay()函数,跟踪过去发现是这个东西:
private native void nativePlay();
从注视可以了解到,这个函数很可能是夸平台调用的C代码,于是找到libvlcjnilibvlcjni-mediaplayer.c里的函数:
void
Java_org_videolan_libvlc_MediaPlayer_nativePlay(JNIEnv *env, jobject thiz)
{
vlcjni_object *p_obj = VLCJniObject_getInstance(env, thiz);
if (!p_obj)
return;
libvlc_media_player_play(p_obj->u.p_mp);
}
这个函数的名字好像在告诉我,它就是被java代码里srcorgvideolanlibvlcMediaPlayer中的nativePlay调用的,而这个函数再一次调用了一个神秘的函数:libvlc_media_player_play,在vlc for android这个工程里我没找到相关的代码,但是我可以找到libvlcjnilibvlcjni-mediaplayer.c include了一个libvlcjni-vlcobject.h这个文件,而这个文件依然找不到libvlc_media_player_play的实现,但是这个文件include了如下文件:
#include <jni.h>
#include <vlc/vlc.h>
#include <vlc/libvlc_media_list.h>
#include <vlc/libvlc_media_discoverer.h>
于是将我们的注意力引入到了vlc这个工程。
代码地址:https://code.videolan.org/videolan/vlc-android/tree/master
3. vlc是这个播放器最底层的实现,我在include/vlc路径下找到了上面提到的文件,也就是:
#include <jni.h>
#include <vlc/vlc.h>
#include <vlc/libvlc_media_list.h>
#include <vlc/libvlc_media_discoverer.h>
在include/vlc/vlc.h找到了关于libvlc_media_player_play这个函数的声明,但是没有实现,实现在lib/media_player.c中
代码地址:https://github.com/videolan/vlc