mirror of
https://github.com/mofeng-git/One-KVM.git
synced 2026-01-29 00:51:53 +08:00
- FFmpeg/hwcodec 增加 RKMPP MJPEG 解码与 RAM FFI,ARM 构建启用对应解码器 - 共享视频管线新增 MJPEG 解码路径(RKMPP/TurboJPEG),优化 WebRTC 发送与 MJPEG 去重 - MSD 配置改为 msd_dir 并自动创建子目录,接口与前端设置同步更新 - 更新包依赖与版本号
319 lines
12 KiB
Docker
319 lines
12 KiB
Docker
# Cross-compilation image for ARMv7 based on Debian 11
|
|
# Build on Debian 11 (GLIBC 2.31) for maximum runtime compatibility
|
|
|
|
FROM debian:11
|
|
|
|
# Set Rustup mirrors (Aliyun)
|
|
ENV RUSTUP_UPDATE_ROOT=https://mirrors.aliyun.com/rustup/rustup \
|
|
RUSTUP_DIST_SERVER=https://mirrors.aliyun.com/rustup
|
|
|
|
# Install Rust toolchain
|
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
curl \
|
|
ca-certificates \
|
|
&& curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain stable \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
ENV PATH="/root/.cargo/bin:${PATH}"
|
|
|
|
# Add armhf architecture
|
|
RUN dpkg --add-architecture armhf
|
|
|
|
# Install cross-compiler and native build tools
|
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
build-essential \
|
|
pkg-config \
|
|
cmake \
|
|
nasm \
|
|
git \
|
|
libclang-dev \
|
|
llvm \
|
|
meson \
|
|
ninja-build \
|
|
wget \
|
|
file \
|
|
gcc-arm-linux-gnueabihf \
|
|
g++-arm-linux-gnueabihf \
|
|
libc6-dev-armhf-cross \
|
|
# Autotools for libopus (requires autoreconf)
|
|
autoconf \
|
|
automake \
|
|
libtool \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
# Install ARMv7 development libraries (without VAAPI/X11 for ARM)
|
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
libasound2-dev:armhf \
|
|
libv4l-dev:armhf \
|
|
libudev-dev:armhf \
|
|
zlib1g-dev:armhf \
|
|
libdrm-dev:armhf \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
# Build static libjpeg-turbo from source (cross-compile for ARMv7)
|
|
RUN git clone --depth 1 https://github.com/libjpeg-turbo/libjpeg-turbo /tmp/libjpeg-turbo \
|
|
&& cd /tmp/libjpeg-turbo \
|
|
&& mkdir build && cd build \
|
|
&& cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
|
|
-DCMAKE_INSTALL_PREFIX=/usr/arm-linux-gnueabihf \
|
|
-DCMAKE_SYSTEM_NAME=Linux \
|
|
-DCMAKE_SYSTEM_PROCESSOR=arm \
|
|
-DCMAKE_C_COMPILER=arm-linux-gnueabihf-gcc \
|
|
-DENABLE_SHARED=OFF -DENABLE_STATIC=ON \
|
|
&& make -j$(nproc) \
|
|
&& make install \
|
|
&& rm -rf /tmp/libjpeg-turbo
|
|
|
|
# Build static libyuv from source (cross-compile for ARMv7)
|
|
RUN git clone --depth 1 https://github.com/lemenkov/libyuv /tmp/libyuv \
|
|
&& cd /tmp/libyuv \
|
|
&& mkdir build && cd build \
|
|
&& cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
|
|
-DCMAKE_INSTALL_PREFIX=/usr/arm-linux-gnueabihf \
|
|
-DCMAKE_SYSTEM_NAME=Linux \
|
|
-DCMAKE_SYSTEM_PROCESSOR=arm \
|
|
-DCMAKE_C_COMPILER=arm-linux-gnueabihf-gcc \
|
|
-DCMAKE_CXX_COMPILER=arm-linux-gnueabihf-g++ \
|
|
&& make -j$(nproc) \
|
|
&& make install \
|
|
&& rm -rf /tmp/libyuv
|
|
|
|
# Build static libvpx from source (cross-compile for ARMv7)
|
|
RUN git clone --depth 1 https://github.com/webmproject/libvpx /tmp/libvpx \
|
|
&& cd /tmp/libvpx \
|
|
&& export CC=arm-linux-gnueabihf-gcc \
|
|
&& export CXX=arm-linux-gnueabihf-g++ \
|
|
&& export LD=arm-linux-gnueabihf-ld \
|
|
&& export AR=arm-linux-gnueabihf-ar \
|
|
&& export CROSS=arm-linux-gnueabihf- \
|
|
&& ./configure \
|
|
--prefix=/usr/arm-linux-gnueabihf \
|
|
--target=armv7-linux-gcc \
|
|
--enable-static --disable-shared --enable-pic \
|
|
--disable-examples --disable-tools --disable-docs \
|
|
--disable-unit-tests \
|
|
&& make -j$(nproc) \
|
|
&& make install \
|
|
&& rm -rf /tmp/libvpx
|
|
|
|
# Build static libx264 from source (cross-compile for ARMv7)
|
|
RUN git clone --depth 1 https://code.videolan.org/videolan/x264.git /tmp/x264 \
|
|
&& cd /tmp/x264 \
|
|
&& export CC=arm-linux-gnueabihf-gcc \
|
|
&& export AR=arm-linux-gnueabihf-ar \
|
|
&& export RANLIB=arm-linux-gnueabihf-ranlib \
|
|
&& ./configure \
|
|
--prefix=/usr/arm-linux-gnueabihf \
|
|
--host=arm-linux-gnueabihf \
|
|
--cross-prefix=arm-linux-gnueabihf- \
|
|
--enable-static --disable-shared \
|
|
--enable-pic \
|
|
--disable-cli \
|
|
&& make -j$(nproc) \
|
|
&& make install \
|
|
&& rm -rf /tmp/x264
|
|
|
|
# Build static libx265 from source (cross-compile for ARMv7)
|
|
RUN git clone --depth 1 https://bitbucket.org/multicoreware/x265_git /tmp/x265 \
|
|
&& cd /tmp/x265 \
|
|
&& cd source \
|
|
&& mkdir -p build \
|
|
&& cd build \
|
|
&& cmake .. -DCMAKE_BUILD_TYPE=Release \
|
|
-DCMAKE_INSTALL_PREFIX=/usr/arm-linux-gnueabihf \
|
|
-DCMAKE_SYSTEM_NAME=Linux \
|
|
-DCMAKE_SYSTEM_PROCESSOR=arm \
|
|
-DCMAKE_C_COMPILER=arm-linux-gnueabihf-gcc \
|
|
-DCMAKE_CXX_COMPILER=arm-linux-gnueabihf-g++ \
|
|
-DENABLE_SHARED=OFF \
|
|
-DENABLE_CLI=OFF \
|
|
-DBUILD_SHARED_LIBS=OFF \
|
|
-DCMAKE_POSITION_INDEPENDENT_CODE=ON \
|
|
&& make -j$(nproc) \
|
|
&& make install \
|
|
&& rm -rf /tmp/x265
|
|
|
|
# Create pkg-config file for x265 (required by FFmpeg)
|
|
RUN mkdir -p /usr/arm-linux-gnueabihf/lib/pkgconfig && \
|
|
cat > /usr/arm-linux-gnueabihf/lib/pkgconfig/x265.pc <<EOF
|
|
prefix=/usr/arm-linux-gnueabihf
|
|
exec_prefix=\${prefix}
|
|
libdir=\${exec_prefix}/lib
|
|
includedir=\${prefix}/include
|
|
|
|
Name: x265
|
|
Description: H.265/HEVC video encoder
|
|
Version: 199
|
|
Libs: -L\${libdir} -lx265 -lstdc++ -lm -ldl -lpthread
|
|
Cflags: -I\${includedir}
|
|
EOF
|
|
|
|
# Build static libopus from source (cross-compile for ARMv7)
|
|
RUN git clone --depth 1 https://github.com/xiph/opus /tmp/opus \
|
|
&& cd /tmp/opus \
|
|
&& export CC=arm-linux-gnueabihf-gcc \
|
|
&& export AR=arm-linux-gnueabihf-ar \
|
|
&& export RANLIB=arm-linux-gnueabihf-ranlib \
|
|
&& ./autogen.sh \
|
|
&& ./configure \
|
|
--prefix=/usr/arm-linux-gnueabihf \
|
|
--host=arm-linux-gnueabihf \
|
|
--enable-static --disable-shared \
|
|
--disable-doc \
|
|
&& make -j$(nproc) \
|
|
&& make install \
|
|
&& rm -rf /tmp/opus
|
|
|
|
# Download and build FFmpeg with RKMPP support
|
|
RUN mkdir -p /tmp/ffmpeg-build && cd /tmp/ffmpeg-build \
|
|
&& wget -q https://files.mofeng.run/src/image/other/ffmpeg.tar.gz \
|
|
&& tar -xzf ffmpeg.tar.gz \
|
|
&& cd ffmpeg \
|
|
# Build RKMPP
|
|
&& mkdir -p rkmpp/build && cd rkmpp/build \
|
|
&& cmake .. \
|
|
-DCMAKE_SYSTEM_NAME=Linux \
|
|
-DCMAKE_SYSTEM_PROCESSOR=arm \
|
|
-DCMAKE_C_COMPILER=arm-linux-gnueabihf-gcc \
|
|
-DCMAKE_CXX_COMPILER=arm-linux-gnueabihf-g++ \
|
|
-DCMAKE_INSTALL_PREFIX=/usr/arm-linux-gnueabihf \
|
|
-DCMAKE_BUILD_TYPE=Release \
|
|
-DBUILD_SHARED_LIBS=OFF \
|
|
-DBUILD_TEST=OFF \
|
|
&& make -j$(nproc) \
|
|
&& make install \
|
|
&& sed -i 's/^Libs:.*$/& -lstdc++ -lm -lpthread/' /usr/arm-linux-gnueabihf/lib/pkgconfig/rockchip_mpp.pc \
|
|
&& cd ../.. \
|
|
# Build RKRGA - create cross file for meson
|
|
&& echo '[binaries]' > /tmp/armhf-cross.txt \
|
|
&& echo "c = 'arm-linux-gnueabihf-gcc'" >> /tmp/armhf-cross.txt \
|
|
&& echo "cpp = 'arm-linux-gnueabihf-g++'" >> /tmp/armhf-cross.txt \
|
|
&& echo "ar = 'arm-linux-gnueabihf-ar'" >> /tmp/armhf-cross.txt \
|
|
&& echo "strip = 'arm-linux-gnueabihf-strip'" >> /tmp/armhf-cross.txt \
|
|
&& echo "pkgconfig = 'pkg-config'" >> /tmp/armhf-cross.txt \
|
|
&& echo '[host_machine]' >> /tmp/armhf-cross.txt \
|
|
&& echo "system = 'linux'" >> /tmp/armhf-cross.txt \
|
|
&& echo "cpu_family = 'arm'" >> /tmp/armhf-cross.txt \
|
|
&& echo "cpu = 'armv7'" >> /tmp/armhf-cross.txt \
|
|
&& echo "endian = 'little'" >> /tmp/armhf-cross.txt \
|
|
&& cd rkrga \
|
|
&& meson setup build --prefix=/usr/arm-linux-gnueabihf --libdir=lib \
|
|
--cross-file=/tmp/armhf-cross.txt \
|
|
--buildtype=release \
|
|
--default-library=static \
|
|
-Dcpp_args=-fpermissive \
|
|
-Dlibdrm=false \
|
|
-Dlibrga_demo=false \
|
|
&& ninja -C build \
|
|
&& ninja -C build install \
|
|
# Create static librga.a from built objects (rkrga uses shared_library)
|
|
&& ar rcs /usr/arm-linux-gnueabihf/lib/librga.a $(find build -name '*.o') \
|
|
&& ranlib /usr/arm-linux-gnueabihf/lib/librga.a \
|
|
&& sed -i 's/^Libs:.*$/& -lstdc++ -lm -lpthread/' /usr/arm-linux-gnueabihf/lib/pkgconfig/librga.pc \
|
|
&& cd .. \
|
|
# Create pkg-config wrapper for cross-compilation
|
|
&& echo '#!/bin/sh' > /tmp/armhf-pkg-config \
|
|
&& echo 'export PKG_CONFIG_LIBDIR=/usr/arm-linux-gnueabihf/lib/pkgconfig:/usr/arm-linux-gnueabihf/lib/pkgconfig:/usr/lib/arm-linux-gnueabihf/pkgconfig' >> /tmp/armhf-pkg-config \
|
|
&& echo 'export PKG_CONFIG_PATH=""' >> /tmp/armhf-pkg-config \
|
|
&& echo 'export PKG_CONFIG_SYSROOT_DIR=""' >> /tmp/armhf-pkg-config \
|
|
&& echo 'exec pkg-config "$@"' >> /tmp/armhf-pkg-config \
|
|
&& chmod +x /tmp/armhf-pkg-config \
|
|
# Build FFmpeg with RKMPP (minimal build for encoding only)
|
|
&& cd ffmpeg-rockchip \
|
|
&& ./configure \
|
|
--prefix=/usr/arm-linux-gnueabihf \
|
|
--cross-prefix=arm-linux-gnueabihf- \
|
|
--arch=arm \
|
|
--target-os=linux \
|
|
--enable-cross-compile \
|
|
--pkg-config=/tmp/armhf-pkg-config \
|
|
--enable-gpl \
|
|
--enable-version3 \
|
|
--disable-shared \
|
|
--enable-static \
|
|
--enable-pic \
|
|
# Hardware acceleration (ARM: RKMPP + V4L2, no VAAPI)
|
|
--enable-libdrm \
|
|
--enable-rkmpp \
|
|
--enable-rkrga \
|
|
--disable-vaapi \
|
|
--enable-v4l2-m2m \
|
|
# Software encoding libraries
|
|
--enable-libx264 \
|
|
--enable-libx265 \
|
|
--enable-libvpx \
|
|
# Disable programs and docs
|
|
--disable-programs \
|
|
--disable-doc \
|
|
--disable-htmlpages \
|
|
--disable-manpages \
|
|
--disable-podpages \
|
|
--disable-txtpages \
|
|
# Disable network
|
|
--disable-network \
|
|
--disable-protocols \
|
|
# Disable unused libraries
|
|
--disable-avformat \
|
|
--disable-swscale \
|
|
--disable-swresample \
|
|
--disable-avfilter \
|
|
--disable-avdevice \
|
|
--disable-postproc \
|
|
# Disable all decoders (re-enable only what we need)
|
|
--disable-decoders \
|
|
--enable-decoder=mjpeg \
|
|
--enable-decoder=mjpeg_rkmpp \
|
|
# Disable all encoders, enable only needed ones
|
|
--disable-encoders \
|
|
--enable-encoder=h264_rkmpp \
|
|
--enable-encoder=hevc_rkmpp \
|
|
--enable-encoder=h264_v4l2m2m \
|
|
--enable-encoder=hevc_v4l2m2m \
|
|
--enable-encoder=libx264 \
|
|
--enable-encoder=libx265 \
|
|
--enable-encoder=libvpx_vp8 \
|
|
--enable-encoder=libvpx_vp9 \
|
|
# Disable muxers/demuxers
|
|
--disable-muxers \
|
|
--disable-demuxers \
|
|
# Disable parsers except needed ones
|
|
--disable-parsers \
|
|
--enable-parser=h264 \
|
|
--enable-parser=hevc \
|
|
--enable-parser=vp8 \
|
|
--enable-parser=vp9 \
|
|
# Disable BSFs except needed ones
|
|
--disable-bsfs \
|
|
--enable-bsf=h264_mp4toannexb \
|
|
--enable-bsf=hevc_mp4toannexb \
|
|
# Hardware decoding uses explicit rkmpp decoder (no hwaccel flag)
|
|
# Disable other unused features
|
|
--disable-indevs \
|
|
--disable-outdevs \
|
|
--disable-filters \
|
|
--disable-debug \
|
|
&& make -j$(nproc) \
|
|
&& make install \
|
|
&& cd / \
|
|
&& rm -rf /tmp/ffmpeg-build /tmp/armhf-cross.txt /tmp/armhf-pkg-config
|
|
|
|
# Add Rust target
|
|
RUN rustup target add armv7-unknown-linux-gnueabihf
|
|
|
|
# Configure environment for cross-compilation
|
|
ENV CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_LINKER=arm-linux-gnueabihf-gcc \
|
|
CC_armv7_unknown_linux_gnueabihf=arm-linux-gnueabihf-gcc \
|
|
CXX_armv7_unknown_linux_gnueabihf=arm-linux-gnueabihf-g++ \
|
|
AR_armv7_unknown_linux_gnueabihf=arm-linux-gnueabihf-ar \
|
|
PKG_CONFIG_LIBDIR=/usr/arm-linux-gnueabihf/lib/pkgconfig:/usr/lib/arm-linux-gnueabihf/pkgconfig \
|
|
PKG_CONFIG_PATH="" \
|
|
PKG_CONFIG_ALLOW_CROSS=1 \
|
|
FFMPEG_STATIC=1 \
|
|
LIBYUV_STATIC=1 \
|
|
OPUS_STATIC=1 \
|
|
PKG_CONFIG_ALL_STATIC=1 \
|
|
RUSTFLAGS="-C linker=arm-linux-gnueabihf-gcc"
|
|
|
|
# Default command
|
|
CMD ["bash"]
|