OrangePi3588Media/scripts/install_deps.sh

296 lines
9.6 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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
# 优先使用项目 lib 目录中的 RKNN 库(最高优先级,确保版本一致)
if [ -f "$PROJECT_DIR/lib/librknnrt.so.2.3.2" ]; then
echo " 发现项目自带 RKNN 库: librknnrt.so.2.3.2"
echo " 安装 RKNN 库到系统..."
cp "$PROJECT_DIR/lib/librknnrt.so.2.3.2" /usr/lib/librknnrt.so
chmod 755 /usr/lib/librknnrt.so
# 创建兼容性符号链接
ln -sf /usr/lib/librknnrt.so /usr/local/lib/librknnrt.so 2>/dev/null || true
RKNN_INSTALLED=true
elif [ -f "$PROJECT_DIR/lib/librknnrt.so" ]; then
echo " 发现项目自带 RKNN 库: librknnrt.so"
echo " 安装 RKNN 库到系统..."
cp "$PROJECT_DIR/lib/librknnrt.so" /usr/lib/librknnrt.so
chmod 755 /usr/lib/librknnrt.so
ln -sf /usr/lib/librknnrt.so /usr/local/lib/librknnrt.so 2>/dev/null || true
RKNN_INSTALLED=true
fi
# 其次使用本地上传的 rknpu2 zip
if [ "$RKNN_INSTALLED" != "true" ]; then
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
fi
# 如果没有本地文件,检查系统是否已有
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)"