zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    虚拟主机导入MySQL出现Unknown character set: ‘utf8mb4’
    解决导入MySQL数据库提示"Unknown character set: 'utf8mb4'"错误
    在js中怎样获得checkbox里选中的多个值?
    CSharp设计模式读书笔记(0):设计原则(学习难度:★★☆☆☆,使用频率:★★★★★)
    how to install maven and svn plugin into eclipse 3.6
    三个月不编程,能力下降80%
    maven管理的struts2spring3mybatisfreemarker框架整合
    Wiki: JavaHL for subversion & ubuntu lucid
    重装系统要装的库包 for ubuntu lucid
    Q for Eclipse is an Apache Maven plugin for the Eclipse IDE
  • 原文地址:https://www.cnblogs.com/zhuangliu/p/6843709.html
Copyright © 2011-2022 走看看