#!/bin/bash # RK3588S 简化依赖安装脚本 # 假设已克隆项目,third_party/mpp 和 third_party/rknpu2 已存在 # 只需要额外下载 ffmpeg-rockchip set -e RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" TEMP_DIR="/tmp/rk3588_deps_$(date +%s)" echo -e "${BLUE}╔════════════════════════════════════════════════════════════╗${NC}" echo -e "${BLUE}║ RK3588S 简化依赖安装脚本 ║${NC}" echo -e "${BLUE}╚════════════════════════════════════════════════════════════╝${NC}" echo "" if [ "$(id -u)" -ne 0 ]; then echo -e "${RED}错误: 请使用 sudo 运行此脚本${NC}" exit 1 fi # 检查项目目录 echo -e "${YELLOW}[检查项目目录]${NC}" if [ ! -d "$PROJECT_DIR/third_party/mpp" ]; then echo -e "${RED}错误: third_party/mpp 不存在${NC}" echo "请确保已克隆完整项目: git clone <项目地址>" exit 1 fi if [ ! -d "$PROJECT_DIR/third_party/rknpu2" ]; then echo -e "${RED}错误: third_party/rknpu2 不存在${NC}" exit 1 fi echo -e "${GREEN}✓${NC} third_party/mpp 存在" echo -e "${GREEN}✓${NC} third_party/rknpu2 存在" echo "" # 检查 ffmpeg-rockchip echo -e "${YELLOW}[检查 FFmpeg]${NC}" FFMPEG_SRC="" if [ -d "$PROJECT_DIR/ffmpeg-rockchip" ]; then echo -e "${GREEN}✓${NC} 发现 ffmpeg-rockchip 目录" FFMPEG_SRC="$PROJECT_DIR/ffmpeg-rockchip" elif [ -f "/tmp/ffmpeg-rockchip-master.zip" ]; then echo -e "${GREEN}✓${NC} 发现本地文件: /tmp/ffmpeg-rockchip-master.zip" mkdir -p "$TEMP_DIR" cd "$TEMP_DIR" unzip -q /tmp/ffmpeg-rockchip-master.zip FFMPEG_SRC="$TEMP_DIR/ffmpeg-rockchip-master" else echo -e "${RED}✗${NC} 未找到 ffmpeg-rockchip" echo "请下载并放到 /tmp/ffmpeg-rockchip-master.zip" echo "下载地址: https://github.com/nyanmisaka/ffmpeg-rockchip/archive/refs/heads/master.zip" exit 1 fi echo "" # ============================================ # 1. 基础工具 # ============================================ echo -e "${YELLOW}[1/4] 安装基础工具...${NC}" apt-get update apt-get install -y \ build-essential cmake git wget curl pkg-config \ libdrm-dev libx11-dev libxext-dev libgles2-mesa-dev \ libwayland-dev libpulse-dev libasound2-dev libv4l-dev \ libsqlite3-dev libcurl4-openssl-dev \ python3 python3-pip python3-dev python3-venv \ htop vim net-tools v4l-utils unzip echo -e "${GREEN}✓${NC} 基础工具安装完成" # ============================================ # 2. MPP (项目自带) # ============================================ echo -e "${YELLOW}[2/4] 安装 Rockchip MPP...${NC}" cd "$PROJECT_DIR/third_party/mpp" # 清理旧的构建 rm -rf build # 创建 version.in 和 version.h mkdir -p build/cmake # version.in 用于 CMake configure_file cat > build/cmake/version.in << 'EOF' #ifndef MPP_VERSION_H #define MPP_VERSION_H #define MPP_VERSION "1.0.0" #define MPP_GIT_VERSION "unknown" #define MPP_GIT_BRANCH "master" #define MPP_BUILD_TIME "unknown" #define MPP_VER_HIST_CNT 10 #define MPP_VER_HIST_0 "unknown" #define MPP_VER_HIST_1 "unknown" #define MPP_VER_HIST_2 "unknown" #define MPP_VER_HIST_3 "unknown" #define MPP_VER_HIST_4 "unknown" #define MPP_VER_HIST_5 "unknown" #define MPP_VER_HIST_6 "unknown" #define MPP_VER_HIST_7 "unknown" #define MPP_VER_HIST_8 "unknown" #define MPP_VER_HIST_9 "unknown" #endif EOF # version.h 用于直接编译 cp build/cmake/version.in mpp/version.h # 给 merge_static_lib.sh 添加执行权限 chmod +x merge_static_lib.sh 2>/dev/null || true # 编译安装 mkdir -p build cd build cmake .. \ -DCMAKE_INSTALL_PREFIX=/usr \ -DCMAKE_BUILD_TYPE=Release \ -DHAVE_DRM=ON make -j$(nproc) make install ldconfig echo -e "${GREEN}✓${NC} MPP 安装完成" # ============================================ # 3. RKNN Runtime # ============================================ echo -e "${YELLOW}[3/4] 安装 RKNN Runtime...${NC}" RKNN_INSTALLED=false # 优先使用本地上传的 rknpu2 zip(覆盖系统版本) for zip_file in "/tmp/rknpu2-1.5.2.zip" "/tmp/rknpu2-1.6.0.zip" "/tmp/rknpu2_1.6.0_arm64.zip"; do if [ -f "$zip_file" ]; then echo " 发现本地文件: $(basename $zip_file),优先使用" cd /tmp rm -rf rknpu2-* 2>/dev/null || true unzip -q -o "$zip_file" 2>/dev/null || true # 查找解压后的目录 RKNPU_DIR=$(find /tmp -maxdepth 1 -type d -name "rknpu*" | head -1) if [ -n "$RKNPU_DIR" ]; then echo " 解压目录: $RKNPU_DIR" if [ -d "$RKNPU_DIR/runtime/RK3588/Linux/aarch64" ]; then echo " 安装 RKNN 库..." cp "$RKNPU_DIR/runtime/RK3588/Linux/aarch64/"*.so /usr/lib/ 2>/dev/null || true fi if [ -d "$RKNPU_DIR/runtime/RK3588/Linux/librknn_api/include" ]; then cp -r "$RKNPU_DIR/runtime/RK3588/Linux/librknn_api/include/"* /usr/include/ 2>/dev/null || true fi RKNN_INSTALLED=true fi break fi done # 如果没有本地 zip,检查系统是否已有 if [ "$RKNN_INSTALLED" != "true" ]; then if [ -f "/usr/lib/librknnrt.so" ] || [ -f "/usr/lib/aarch64-linux-gnu/librknnrt.so" ]; then echo " 系统已存在 RKNN 库" RKNN_INSTALLED=true fi fi # 安装头文件(项目自带) if [ -d "$PROJECT_DIR/third_party/rknpu2/runtime/RK3588/Linux/librknn_api/include" ]; then echo " 安装 RKNN 头文件..." cp -r "$PROJECT_DIR/third_party/rknpu2/runtime/RK3588/Linux/librknn_api/include/"* /usr/include/ 2>/dev/null || true fi # 如果库还没安装,尝试系统仓库 if [ "$RKNN_INSTALLED" != "true" ]; then echo " 尝试从系统仓库安装..." apt-get install -y librknn-runtime librknn-api 2>/dev/null && { RKNN_INSTALLED=true } || { echo -e "${YELLOW}警告: 无法安装 RKNN 运行时库${NC}" echo " 请手动下载并安装:" echo " https://github.com/rockchip-linux/rknpu2/releases" echo " 或将 rknpu2-1.5.2.zip 上传到 /tmp/ 后重试" } fi ldconfig echo -e "${GREEN}✓${NC} RKNN Runtime 安装完成" # ============================================ # 4. FFmpeg # ============================================ echo -e "${YELLOW}[4/4] 安装 FFmpeg (带Rockchip支持)...${NC}" # 卸载系统ffmpeg if dpkg -l | grep -q "^ii ffmpeg "; then apt-mark unhold ffmpeg 2>/dev/null || true apt-get remove -y ffmpeg 2>/dev/null || true fi cd "$FFMPEG_SRC" # 安装依赖 apt-get install -y \ libgnutls28-dev libaom-dev libdav1d-dev \ libmp3lame-dev libopus-dev libtheora-dev \ libvorbis-dev libvpx-dev libx264-dev libx265-dev libnuma-dev # 配置编译 ./configure \ --prefix=/usr/local \ --enable-gpl --enable-version3 \ --enable-libdrm --enable-rkmpp \ --enable-libx264 --enable-libx265 \ --enable-shared --disable-static \ --extra-libs=-lpthread --extra-libs=-lm 2>&1 | tail -20 make -j$(nproc) make install ldconfig ln -sf /usr/local/bin/ffmpeg /usr/bin/ffmpeg-rk 2>/dev/null || true echo -e "${GREEN}✓${NC} FFmpeg 安装完成" # ============================================ # 5. 系统配置 # ============================================ echo -e "${YELLOW}[系统配置]${NC}" cat > /etc/udev/rules.d/99-rockchip-npu.rules << 'EOF' KERNEL=="rknpu*", MODE="0666", GROUP="video" KERNEL=="mpp_service", MODE="0666", GROUP="video" KERNEL=="rga*", MODE="0666", GROUP="video" EOF udevadm control --reload-rules udevadm trigger usermod -a -G video orangepi 2>/dev/null || true usermod -a -G render orangepi 2>/dev/null || true # 清理 rm -rf "$TEMP_DIR" echo "" echo -e "${GREEN}╔════════════════════════════════════════════════════════════╗${NC}" echo -e "${GREEN}║ 依赖安装完成! ║${NC}" echo -e "${GREEN}╚════════════════════════════════════════════════════════════╝${NC}" echo "" echo "验证:" echo " ls /dev/rknpu*" echo " pkg-config --modversion rockchip_mpp" echo " pkg-config --exists sqlite3 && echo 'sqlite3: OK'" echo " pkg-config --exists libcurl && echo 'libcurl: OK'" echo " ffmpeg -version | head -1" echo "" echo "下一步:" echo " cd ~/apps/OrangePi3588Media/build" echo " cmake .. && make -j\$(nproc)"