296 lines
9.6 KiB
Bash
Executable File
296 lines
9.6 KiB
Bash
Executable File
#!/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)"
|