vlc play函数跟踪

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

原文地址:https://www.cnblogs.com/zhuangliu/p/6843709.html