vlc的核心,libvlc, 里面集成解复用,解码, 提供出来这些解复用解码的功能集成在libvlc库中,提供统一调用接口,这样在windows,linux, 都可以统一调用这个libvlc的接口。 对于在android 上的vlc播放器,同样的道理,将libvlc进行了jni的一层封装,

在源码中:(2019)   (源码可以在VideoLAN / VLC-Android · GitLab 在线看vlc-Android)

android libvlc 添加音频 安卓 vlc_android

vlc:这个是vlc 核心功能,其中的解复用解码都在这里面,主要功能都在这里面,linux版本的vlc基本在这个里面编译。

如果只是看vlc源码,可以直接下载  https://www.videolan.org/vlc/download-sources.html 看vlc目录的源码结构:

3.0.17版本为例子  版本总在更新,之前有分析过3.0.6,已经不一样了

        modules目录:

可以看官方的wiki Hacker Guide/Modules source tree - VideoLAN Wiki

  • access  用于输入的。 比如 file.c(普通文件读取)、 udp.c  (udp数据流) 、tcp.c (tcp数据流)、rtsp子目录(看起开原本是用来拉取rtsp流的,已经没什么用了,现在对与播放rtsp流,内部默认使用live555这个子插件)、live555.cpp(对live555库的调用包装,用来拉取rtsp)  http(http上的流) 、。。。
  • arm_neon   为了性能,用汇编写的部分代码,比如视频格式转换函数,yuv_rgb之间的转换
  • audio_filter
  • audio_mixer
  • audio_output 音频输出,比如 alsa.c(linux的alsa音频架构)、audiotrack.c (Android Java AudioTrack audio output module  ,这个是native反过来调用java,使用Android的java接口--AudioTrack播放)、opensles_android.c (顾名思义,Android上 opensles接口, 可能后续会有添加oboe 或者aaudio接口。)
  • codec 编解码, 不仅仅是编码,同时也是有解码的功能在这里, 具体看源码里面的模块描述,vlc_module_begin()   后面的set_capability("encoder",xx)   就表示这个是encoder编码插件。比如: x264.c  (使用libx264库,编码264)其中的源码描述:
vlc_module_begin ()
#ifdef MODULE_NAME_IS_x26410b
    set_description( N_("H.264/MPEG-4 Part 10/AVC encoder (x264 10-bit)"))
set_capability( "encoder", 0 )
#endif
#ifdef MODULE_NAME_IS_x262
    set_description( N_("H.262/MPEG-2 encoder (x262)"))
    set_capability( "encoder", 0 )
#endif
#ifdef MODULE_NAME_IS_x264
    set_description( N_("H.264/MPEG-4 Part 10/AVC encoder (x264)"))
    set_capability( "encoder", 200 )
#endif

x265.c 同上,  HEVC/H.265 video encoder。 用于265的编码

zvbi.c VBI and Teletext PES demux and decoder using libzvbi   (一般文件开头有注释描述,或者直接看vlc_module_begin 后面的代码推测)

  • gstreamer 使用gstreamer 库, 比如里面的  gstdecode.c Decoder module making use of gstreamer
  • avcodec  使用ffmpeg 的libavcodec 进行编解码的, 比u人avcodec.c  video and audio decoder and encoder using libavcodec

从上面可以看到,编解码部分,vlc基本上用的第三方 ffmpeg 或者 gstreamer。 (并没有看到直接使用 android ndk MediaCodec解码的封装,其实ffmpeg里面已经包括了使用ndk MediaCodec解码部分,所以,可以直接利用ffmpeg)

当然vlc会用到其他的第三方项目,其中子目录 contrib 就是用来下载所有这些第三方项目的源码,然后编译,比如 用来解复用和解码的ffmpeg , 支持压缩解压缩的 glib zib  ,支持字体的 freetype2,  用来编码的 x254 x255 vpx , 支持rtsp的live555, 支持图片编解码的jpeg png等等

android libvlc 添加音频 安卓 vlc_android_02

libvlc: 对上面vlc的jni封装,这个就是 提供给android 调用的sdk包--package org.videolan.libvlc

medialibrary  这也是一个单独的功能,在android版本的vlc app中有使用到,只是播放器的话,并不需要,猜想是比较老的一些多媒体格式文件信息之类, 这个medialibrary 内部有 medialibrary  c实现的源码,和jni+java封装,所以这个文件夹最终提供一个package org.videolan.medialibrary 的jar包。 

vlc-android  :这就是vlc app android源码。其中 通过调用 package org.videolan.medialibrary  和 package org.videolan.libvlc 的api, 来实现具体的文件显示和播放等功能。 所以如果想使用vlc 的sdk来开发自己的app, 就是使用  package org.videolan.libvlc 这个包了。

java-libs:顾名思义,这就是vlc-android使用的一些其他的jar包。