MediaPipe 怎么在 WSL 中完成环境安装并构建 Android 示例?
【免费下载链接】mediapipeCross-platform, customizable ML solutions for live and streaming media.项目地址: https://gitcode.com/GitHub_Trending/med/mediapipe
在 Windows 原生环境下无法直接构建 MediaPipe 的 Android 应用,官方安装文档明确建议改用 WSL(Windows Subsystem for Linux)完成这一工作。这篇文章按照 MediaPipe 安装文档 中 "Installing on Windows Subsystem for Linux (WSL)" 一节的步骤,走一遍完整路径:在 WSL 的 Ubuntu 中安装编译依赖,用 Hello World C++ 示例验证构建环境,然后安装 Android SDK/NDK 并构建 MediaPipe 的 Android 示例 APK,最后通过 ADB 安装到设备。全程只依赖仓库文档给出的命令和脚本,不做额外扩展。
准备条件:Windows 侧先装好 WSL 与 ADB
WSL 里的所有命令都在 Linux 环境中执行,但 ADB 服务需要在 Windows 侧启动。按 install.md 的要求准备三件事:
- 安装 WSL(Ubuntu 发行版),按微软官方 WSL 安装说明操作即可。
- 在 Windows 上安装 ADB 并启动 ADB 服务。注意一个硬性约束:Windows 侧与 WSL 侧的 adb 版本必须一致。文档给出的例子是:如果 WSL 里是 ADB 1.0.39,就需要下载与之对应的 Windows 版 platform-tools。版本不一致时 ADB 服务端与客户端会互相拒绝。
- 启动 WSL。文档同时提示:Linux 子系统对应的 Windows 目录位于
C:\Users\YourUsername\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_SomeID\LocalState\rootfs\home,需要回看 WSL 内文件时可用。
另外,如果你后续要在 WSL 里跑带摄像头的桌面示例,文档提前说明了一个限制:预编译的 OpenCV 包在 WSL 中不支持摄像头,实时摄像头演示不可用,只能用视频文件作为输入(除非自行用 FFMPEG 和 GStreamer 编译 OpenCV)。这条限制不影响本文的 Android 构建目标,构建时先知道即可。
在 WSL 中安装基础依赖并克隆仓库
进入 WSL 后,先安装编译所需的系统包。这条命令会写入系统目录,需要 sudo 权限,副作用是安装build-essential、git、python、zip、adb、openjdk-8-jdk:
sudo apt-get update && sudo apt-get install -y build-essential git python zip adb openjdk-8-jdk接下来按 Bazel 官方文档安装 Bazelisk(文档要求的是 Bazelisk 而不是直接装 Bazel)。然后克隆 MediaPipe 仓库并进入根目录:
cd $HOME git clone --depth 1 https://gitcode.com/GitHub_Trending/med/mediapipe.git cd mediapipe安装 OpenCV 和 FFmpeg
MediaPipe 的构建依赖 OpenCV,FFmpeg 通过libopencv-video-dev一并装好。文档给出三个选项,最短路径是选项 1,用 apt 安装预编译包:
sudo apt-get install libopencv-core-dev libopencv-highgui-dev \ libopencv-calib3d-dev libopencv-features2d-dev \ libopencv-imgproc-dev libopencv-video-dev选项 2 是运行仓库根目录的 setup_opencv.sh,自动从源码构建 OpenCV 并修改 MediaPipe 的 OpenCV 配置;选项 3 是按 OpenCV 官方文档手动从源码编译。
这里有一个容易踩的点:apt 装出来的 OpenCV 版本取决于 Ubuntu 发行版版本(例如 Ubuntu 20.04 是 4.2)。仓库的 WORKSPACE 和 opencv_linux.BUILD 默认按 OpenCV 2/3 配置;如果装到的是 OpenCV 4,需要修改third_party/opencv_linux.BUILD,按文档给出的 OpenCV 4 配置,并根据gcc -print-multiarch的结果(如x86_64-linux-gnu)取消对应行注释:
# opencv_linux.BUILD for OpenCV 4 installed from Debian package cc_library( name = "opencv", hdrs = glob([ # Uncomment according to your multiarch value (gcc -print-multiarch): # "include/aarch64-linux-gnu/opencv4/opencv2/cvconfig.h", # "include/arm-linux-gnueabihf/opencv4/opencv2/cvconfig.h", # "include/x86_64-linux-gnu/opencv4/opencv2/cvconfig.h", "include/opencv4/opencv2/**/*.h*", ]), includes = [ # Uncomment according to your multiarch value (gcc -print-multiarch): # "include/aarch64-linux-gnu/opencv4/", # "include/arm-linux-gnueabihf/opencv4/", # "include/x86_64-linux-gnu/opencv4/", "include/opencv4/", ], linkopts = [ "-l:libopencv_core.so", "-l:libopencv_calib3d.so", "-l:libopencv_features2d.so", "-l:libopencv_highgui.so", "-l:libopencv_imgcodecs.so", "-l:libopencv_imgproc.so", "-l:libopencv_video.so", "-l:libopencv_videoio.so", ], )如果从 OpenCV 4 链接阶段报undefined reference to 'cv::...'一类错误,文档把它归因为 OpenCV 未正确配置,应回到 Troubleshooting 的 "Incorrect MediaPipe OpenCV config" 一节对照修改 WORKSPACE 与opencv_linux.BUILD。
用 Hello World C++ 示例验证构建环境
在构建 Android 目标之前,先按文档跑一次桌面 Hello World 示例,确认 Bazel、OpenCV、FFmpeg 这一整条链是通的。文档要求纯 CPU 桌面环境带MEDIAPIPE_DISABLE_GPU=1标志:
export GLOG_logtostderr=1 # WSL 桌面 GPU 当前不受支持,使用 CPU 构建 bazel run --define MEDIAPIPE_DISABLE_GPU=1 \ mediapipe/examples/desktop/hello_world:hello_world判断标准是文档给出的预期输出(文档示例,连续打印 10 行):
Hello World! Hello World! ...(共 10 行)能打出这 10 行说明编译环境就绪。如果构建失败,先查 Troubleshooting,其中与 WSL 环境最常相关的几条是:找不到 Python 二进制时给 Bazel 命令加--action_env PYTHON_BIN_PATH=$(which python3);依赖仓库下载失败(多为网络问题)时可配置代理,或bazel clean --expunge后重试。
安装 Android SDK 和 NDK
环境验证通过后,运行仓库根目录的 setup_android_sdk_and_ndk.sh 安装 Android SDK 和 NDK。
这条脚本有几个必须提前知道的副作用:
- 它会从
dl.google.com下载 Android SDK commandlinetools 和 NDK 压缩包,需要可用的外网; - 它会把
android_sdk_repository、android_ndk_repository、bind、register_toolchains等规则追加写入WORKSPACE,即修改仓库文件; - 安装过程中会清理并重建
/tmp/android_sdk/、/tmp/android_ndk/两个临时目录。
脚本用法(不带参数时使用默认路径,NDK 默认版本 r28b):
cd mediapipe # 在仓库根目录 bash ./setup_android_sdk_and_ndk.sh也可以显式指定路径和版本,例如bash ./setup_android_sdk_and_ndk.sh ~/Android/Sdk ~/Android/Ndk r28b --accept-licenses(--accept-licenses会自动接受 SDK 许可协议)。
两个前置判断逻辑(读脚本可得):如果ANDROID_HOME和ANDROID_NDK_HOME都已设置,脚本直接退出,由 Bazel 自动定位 SDK/NDK;如果目标目录已存在内容,对应的 SDK 或 NDK 安装会跳过,但 WORKSPACE 的追加仍会执行——所以不要在同一个仓库里重复运行它。
脚本成功时的输出(文档示例,来自脚本自身打印):
Android SDK is now installed. Consider setting $ANDROID_HOME environment variable to be /root/Android/Sdk Android NDK is now installed. Consider setting $ANDROID_NDK_HOME environment variable to be /root/Android/Sdk/ndk-bundle/android-ndk-r28b Set android_ndk_repository and android_sdk_repository in WORKSPACE Done看到Set android_ndk_repository and android_sdk_repository in WORKSPACE和Done即表示配置完成。
构建 Android 示例
SDK/NDK 就绪后,构建主路径是单个示例目标。以文档中的objectdetectiongpu为例,--config=android_arm64指定 arm64-v8a 架构(该配置定义在仓库 .bazelrc 中):
bazel build -c opt --config=android_arm64 \ mediapipe/examples/android/src/java/com/google/mediapipe/apps/objectdetectiongpu:objectdetectiongpu构建成功时的输出(文档示例):
Target //mediapipe/examples/android/src/java/com/google/mediapipe/apps/objectdetectiongpu:objectdetectiongpu up-to-date: bazel-bin/mediapipe/examples/android/src/java/com/google/mediapipe/apps/objectdetectiongpu/objectdetectiongpu_deploy.jar bazel-bin/mediapipe/examples/android/src/java/com/google/mediapipe/apps/objectdetectiongpu/objectdetectiongpu_unsigned.apk bazel-bin/mediapipe/examples/android/src/java/com/google/mediapipe/apps/objectdetectiongpu/objectdetectiongpu.apk INFO: Build completed successfully, 2028 total actions产物就是bazel-bin/.../objectdetectiongpu.apk,Elapsed time和processes那几行数值因机器而异,不需要按示例数值核对。
如果你想一次构建全部示例,仓库根目录的 build_android_examples.sh 是批量入口。注意它没有目标筛选参数:会对mediapipe/examples/android/src/java/com/google/mediapipe/apps下的所有应用逐个执行build -c opt --config=android_arm64(basic目录对应目标名helloworld;objectdetection3d会按 shoe/chair/cup 等多个类别各构建一个 APK),把 APK 拷贝到-d指定的输出目录,然后在终端提示Press 'a' to abort, or press any other key to continue ...,不按a就会通过adb install -r把所有 APK 装到已连接的设备上。因此使用前提是你确实要构建并安装全部示例,且设备已通过 adb 连上:
./build_android_examples.sh -d out_dir--nostrip可保留符号(默认会加--linkopt=-s剥离);-i表示跳过构建、只安装-d目录里已有的 APK。
安装到设备并验证
单目标构建的产物直接用 adb 安装(hello world codelab 给出的方式):
adb install bazel-bin/mediapipe/examples/android/src/java/com/google/mediapipe/apps/objectdetectiongpu/objectdetectiongpu.apk前提是 Windows 侧 ADB 服务已启动、设备开启开发者选项并已连接。安装命令返回成功后,在设备上打开对应应用,能启动并出画面即完成端到端验证;helloworld 类示例的成功标准是应用内显示Hello World!界面。
限制与排查入口
- WSL 摄像头:预编译 OpenCV 在 WSL 中不支持摄像头,WSL 内跑桌面实时演示只能用视频文件输入;Android 示例的摄像头在设备端,不受此限制。
- adb 版本:Windows 与 WSL 两侧 adb 版本必须一致,否则连接异常。
- 构建报错:Python 路径、依赖下载失败、OpenCV 配置三类问题都有对应条目,集中在 Troubleshooting;
gcc/g++6.3 与 7.3 存在已知问题,使用 TensorFlow calculators 时应避开这两个版本。 - 自写 Android 应用:本文只覆盖构建仓库自带示例。要把 MediaPipe 图跑进自己的 Android 应用,接着读 Hello World! on Android,它给出了从空应用到
FrameProcessor的完整代码路径。
【免费下载链接】mediapipeCross-platform, customizable ML solutions for live and streaming media.项目地址: https://gitcode.com/GitHub_Trending/med/mediapipe
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考