media-kit编译libmpv
这篇文章大致讲一下libmpv.so如何编译,以及如何在跨平台编译。
mpv播放器提供了C接口给其他程序执行mpv指令,libmpv.so则是C接口代码实现的动态库产物。mpv官网提供了解释:https://mpv.io/manual/stable/#embedding-into-other-programs-libmpv
mpv播放器提供了源码让开发者编译安装使用,mpv源码仓库
除此之外,mpv还提供了一个专门用于编译的命令集仓库,可以快速简单的完成mpv播放器编译。Mpv-build源码仓库
接下来讲如何编译libmpv
编译前置条件,需要安装以下软件:
sudo apt-get install meson
# 如果报错meson.build:1:0: ERROR: Meson version is 0.53.2 but project requires >=0.63
# 执行 pip3 install meson==0.63
# autoreconf: command not found
sudo apt-get install autoconf automake libtool
sudo apt-get install pkg-config
# No package 'freetype2' found
sudo apt install libfreetype6-dev
# No package 'fribidi' found
sudo apt-get install libfribidi-dev
# No package 'harfbuzz' found
sudo apt-get install libharfbuzz0 libharfbuzz-dev
sudo apt-get install build-essential autoconf libtool pkg-config
sudo apt-get install libicu-dev icu-devtools
sudo apt-get install libglib2.0-dev
sudo apt-get install libcairo2-dev
sudo apt-get install libfontconfig1-dev
# nasm/yasm not found or too old
sudo apt-get install nasm
# ERROR: x264 not found using pkg-config
sudo apt-get install libx264-dev
# nasm/yasm not found or too old
sudo apt-get install nasm
# Did not find CMake 'cmake'
sudo apt-get install cmake
下载编译
# 本地编译路径下创建存放mpv代码的目录
mkdir mpv
cd mpv
# 下载mpv-build
git clone https://github.com/mpv-player/mpv-build
cd mpv-build
# 使能编译libmpv
echo -Dlibmpv=true > mpv_options
# 编译
./rebuild -j4
# 如果失败了,根据提示下载缺失的软件,并重新执行./rebuild -j4
# 如果libmpv内容更改了,可以执行如下命令只编译libmpv
./scripts/mpv-config
./scripts/mpv-build
Flutter三方库media-kit:
https://pub.dev/packages/media_kit
Flutter三方库media-kit源码仓库:
https://github.com/media-kit/media-kit
举例android在哪里编译libmpv.so,并如何引用libmpv.so适配Flutter三方库media-kit。
libmpv编译,包括音频audio和视频video,安卓对应的编译工具集源码仓:
https://github.com/media-kit/libmpv-android-audio-build
https://github.com/media-kit/libmpv-android-video-build
在libmpv-android-video-build中,安卓采用gradle去打包编译工具集,生成可发布的release的jar包,用jar包的方式去执行编译。在jar包里面,需要关注的两个文件,是buildscripts/build.sh和buildscripts/download.sh。
buildscripts/build.sh里面判断当前脚本编译的平台和交叉编译链,并调用需要编译的模块编译脚本,如果编译的是mpv,则调用buildscripts/scripts/mpv.sh。/buildscripts/scripts/mpv.sh会通过meson设置编译环境,然后执行ninja编译。其最终是会调用到https://github.com/mpv-player/mpv里的meson.build文件。
buildscripts/download.sh里面包含了download-sdk.sh和download-deps.sh脚本执行,正如脚本的文件名,一个是下载安卓sdk,另一个是下载编译所需要的依赖文件。
回到libmpv-android-video-build刚开始讲的jar包,这个jar包会被https://github.com/media-kit/media-kit编译安卓时调用,而media-kit作为Flutter三方库被Flutter应用依赖。如此形成了一条这样的链路:
https://github.com/media-kit/media-kit ->
https://github.com/media-kit/libmpv-android-video-build ->
https://github.com/mpv-player/mpv
至此libmpv.so如何在跨平台编译的大致思路梳理完成。后面需要详细理解各个平台下编译所需的工具,以及编译的参数。