RK3588移置ffmpeg实现4K硬件编解码

ffmpeg是音视频处理的底层所需的强大的sdk库,rk3588芯片结合ffmpeg可实现视频的硬件编码,解码,滤镜处理等强大功能,特别是对4k视频的处理。下面分享我实际操作步骤,因Linux环境各不相同,步骤有些差异。

1. 编译工具

:gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu

#1. 编译zlib zlib-1.2.11.tar.gz

./configure --prefix=/home/uw/cross/zlib

make

make install

2.  编译libpng libpng-1.6.43.tar.gz

#先执行下面命令

export LDFLAGS="-L/home/uw/cross/zlib/lib"

export CFLAGS="-I/home/uw/cross/zlib/include"

export CPPFLAGS="-I/home/uw/cross/zlib/include"

./configure --prefix=/home/uw/cross/libpng \

--host=aarch64-linux-gnu

make -j4

make install

#需要配置环境变量

export ARCH=aarch64

export PATH=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/:$PATH

export CROSS_COMPILE=aarch64-linux-gnu-

export CC=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc

export CXX=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++

export LD=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ld

export AR=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ar

export AS=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-as

export RANLIB=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ranlib

export STRIP=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-strip

export INCLUDE=/home/uw/cross/zlib/include

export LIBRARY_PATH=/home/uw/cross/zlib/lib

export LDFLAGS="-L/home/uw/cross/zlib/lib"

export CFLAGS="-I/home/uw/cross/zlib/include"

export CPPFLAGS="-I/home/uw/cross/zlib/include"

3. 编译 freetype freetype-2.13.2.tar.gz

#要去掉  harfbuzz

./configure --prefix=/home/uw/cross/freetype \

--host=aarch64-linux-gnu \

--with-png=yes \

--with-zlib=yes \

--with-harfbuzz=no

make -j4

make install

4. 编译xvidcore xvidcore-1.3.3.tar.gz

# XviD是个开源的视频编解码器

./configure --prefix=/home/uw/cross/xvid \

--host=aarch64-linux-gnu

make -j4

make install

5.  编译xmllibxml2-sources-2.9.10.tar.gz

#2.7.8 不支持aarch64

#配置环境变量

export ARCH=aarch64

export PATH=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/:$PATH

export CROSS_COMPILE=aarch64-linux-gnu-

export CC=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc

export CXX=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++

export LD=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ld

export AR=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ar

export AS=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-as

export RANLIB=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ranlib

export STRIP=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-strip

#export PYTHONPATH=/usr/local/lib/python2.7/

#export PYTHONHOME=/usr/lib/python2.7

#先执行下面就可以

export INCLUDE=/home/uw/cross/zlib/include:/home/uw/cross/libpng/include

export LIBRARY_PATH=/home/uw/cross/zlib/lib:/home/uw/cross/libpng/lib

export LDFLAGS="-L/home/uw/cross/zlib/lib -L/home/uw/cross/libpng/lib"

export CFLAGS="-I/home/uw/cross/zlib/include -I/home/uw/cross/libpng/include"

export CPPFLAGS="-I/home/uw/cross/zlib/include -I/home/uw/cross/libpng/include"

./configure --prefix=/home/uw/cross/xml \

--with-python=/usr/lib/python3.8 \

--host=aarch64-linux-gnu \

--with-zlib=/home/uw/cross/zlib

make -j4

make install

#编译失败:需要加上with-python

#parserInternals.c:36:18: fatal error: zlib.h: No such file or directory #include <zlib.h>

#执行如下语句后ok,前提是先编译好了zlib

export LDFLAGS="-L/home/uw/cross/zlib/lib"

export CFLAGS="-I/home/uw/cross/zlib/include"

export CPPFLAGS="-I/home/uw/cross/zlib/include"

6.  编译x264 x264-master.tar.gz

./configure --prefix=/home/uw/cross/x264 \

--host=aarch64-linux-gnu \

--cross-prefix=aarch64-linux-gnu- \

--enable-shared \

--disable-asm

make -j4

make install

7.  编译x265  x265-Release_3.5.zip

cd x265

mkdir build_aarch64

cd build_aarch64

cmake \

    -DCMAKE_SYSTEM_NAME=Linux \

    -DCMAKE_SYSTEM_PROCESSOR=aarch64 \

    -DCMAKE_C_COMPILER=$CC \

    -DCMAKE_CXX_COMPILER=$CXX \

    -DCMAKE_AR=$AR \

    -DCMAKE_ASM_COMPILER=$AS \

    -DCMAKE_INSTALL_PREFIX=/home/uw/cross/x265 \

    -DBUILD_SHARED_LIBS=ON \

    ../source

make -j4

#以上方法会报错

#正确编译

#解压x265-Release_3.5.zip

cd x265-Release_3.5

cd /build/aarch64-linux

vim crosscompile.cmake

#修改下面

set(CROSS_COMPILE_ARM 1)

set(CMAKE_SYSTEM_NAME Linux)

set(CMAKE_SYSTEM_PROCESSOR aarch64)

#修改make-Makefiles.bash 文件权限

chmod 777 make-Makefiles.bash

#执行

./make-Makefiles.bash

#ccmake: command not found

#sudo apt-get install cmake-qt-gui

#需要安装cmke ccmake

sudo apt  install cmake-curses-gui

#弹出窗口修改

 CMAKE_INSTALL_PREFIX = /home/uw/cross/x265

 NASM_EXECUTABLE = /usr/bin/yasm

 LIBDL = /opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc/usr/lib/libdl.so

#按g 生成并退出

make -j4

make install

#成功编译2.5

# specify the cross compiler

set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)

set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)

# specify the target environment

SET(CMAKE_FIND_ROOT_PATH  /opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu)

./build/linux/make-Makefiles.bash \

--host=aarch64-linux-gnu \

--prefix=/home/uw/cross/x265

8.  编译openssl  openssl-1.1.1-latest.tar.gz

export PATH=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/:$PATH

export CC=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc

export CXX=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++

export LD=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ld

export AR=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ar

export AS=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-as

export RANLIB=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ranlib

export STRIP=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-strip

#修改 config 文件, 在437行处添加

GUESSOS=aach64-gnu-linux2

./config no-asm -shared --prefix=/home/uw/cross/ssl

# --cross-compile-prefix=aarch64-linux-gnu- 不需要这个

# 环境变量里 也不要设置CROSS_COMPILE ,否则编译提示找不到文件

make -j4

make install

9. 编译fontconfig fontconfig-2.14.0.tar.gz

#环境变量

#export ARCH=aarch64

export PATH=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/:$PATH

#export CROSS_COMPILE=aarch64-linux-gnu-

export CC=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc

export CXX=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++

export LD=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ld

export AR=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ar

export AS=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-as

export RANLIB=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ranlib

export STRIP=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-strip

#export PYTHONPATH=/usr/local/lib/python2.7/

#export PYTHONHOME=/usr/lib/python2.7

export PKG_CONFIG_PATH=/home/uw/cross/xml/lib/pkgconfig:/home/uw/cross/freetype/lib/pkgconfig:$PKG_CONFIG_PATH

export INCLUDE=/home/uw/cross/zlib/include:/home/uw/cross/libpng/include:/home/uw/cross/xml/include/libxml2:/home/uw/cross/xml/include:/home/uw/cross/freetype/include/freetype2

export LIBRARY_PATH=/home/uw/cross/zlib/lib:/home/uw/cross/libpng/lib:/home/uw/cross/xml/lib:/home/uw/cross/freetype/lib

export LDFLAGS="-L/home/uw/cross/zlib/lib -L/home/uw/cross/libpng/lib -L/home/uw/cross/xml/lib -L/home/uw/cross/freetype/lib"

export CFLAGS="-I/home/uw/cross/zlib/include -I/home/uw/cross/libpng/include -I/home/uw/cross/xml/include -I/home/uw/cross/xml/include/libxml2 -I/home/uw/cross/freetype/include/freetype2"

export CPPFLAGS="-I/home/uw/cross/zlib/include -I/home/uw/cross/libpng/include -I/home/uw/cross/xml/include -I/home/uw/cross/xml/include/libxml2 -I/home/uw/cross/freetype/include/freetype2"

./configure --prefix=/home/uw/cross/fontconfig \

--host=aarch64-linux-gnu \

--enable-libxml2 \

--disable-docs \

--with-xmldir=/home/uw/cross/xml

#gperf: command not found

#总提示找不到xml ,拷贝libxml2.pc 到 /usr/lib/pkgconfig 目录下, freetype 也是

make -j4

make install

#--disable-docs

10.  编译fribidi-1.0.13.tar.xz

#fribidi是个中东字体增强库,它实现了Unicode字符集的双向算法,以便处理阿拉伯语、希伯来语这些中东语言。

./configure --prefix=/home/uw/cross/fribidi \

--host=aarch64-linux-gnu

make -j4

make install

#注意,这里要下载xz, 我下载gz格式编译错误

#configure 错误,提示需要glib2.0

#出现了如下错误:

11.  编译glib glib-2.56.1.tar.xz

#checking for growing stack pointer... configure: error: cannot run test program while cross compiling

#原来configure不能为交叉编译检查glib_cv_stack_grows,glib_cv_stack_grows表示堆栈的增长方向。configure无法在目标机上运行测试程序,自然无法检查,只好手工指定。顺便看一下还哪些相关的变量不能检查的,一起写到cache文件中,并重新配置:

#export ARCH=aarch64

config.sh

export PATH=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/:$PATH

export CROSS_COMPILE=aarch64-linux-gnu-

export CC=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc

export CXX=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++

export LD=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ld

export AR=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ar

export AS=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-as

export RANLIB=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ranlib

export STRIP=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-strip

export PKG_CONFIG_PATH=/home/uw/cross/icu/lib/pkgconfig:/home/uw/cross/zlib/lib/pkgconfig:/home/uw/cross/ffi/lib/pkgconfig:/home/uw/cross/fribidi/lib/pkgconfig:/home/uw/cross/fontconfig/lib/pkgconfig:/home/uw/cross/xml/lib/pkgconfig:/home/uw/cross/freetype/lib/pkgconfig:$PKG_CONFIG_PATH

# 下面直接执行

echo ac_cv_type_long_long=yes>aarch64-linux-gnu.cache

echo glib_cv_stack_grows=no>>aarch64-linux-gnu.cache

echo glib_cv_uscore=no>>aarch64-linux-gnu.cache

echo ac_cv_func_posix_getpwuid_r=yes>>aarch64-linux-gnu.cache

./configure --prefix=/home/uw/cross/glib \

--host=aarch64-linux-gnu \

--disable-libmount \

--disable-libelf \

--with-pcre=internal \

--cache-file=aarch64-linux-gnu.cache

#,You must have either have gettext support in your C library, or use the GNU gettext library

# sudo apt-get install -y gettext 就不再提示上面错误

make -j4

#编译错误 gclosure.c:28:10: fatal error: ffi.h: No such file or directory

#先编译ffi

#编译libffi  libffi-3.4.6.tar.gz

./configure --prefix=/home/uw/cross/ffi \

--host=aarch64-linux-gnu

make -j4

make install

#重新配置glib

make -j4

make install

12.  编译harfbuzz harfbuzz-2.5.0.tar.xz  harfbuzz-1.8.1.tar.bz2

#harfbuzz是一个文本塑形引擎,它能够将Unicode字符转换为格式正确的字形输出,可用于调试和预览字体效果。

tar xfjv  harfbuzz-1.8.1.tar.bz2

./configure --prefix=/home/uw/cross/harfbuzz \

--host=aarch64-linux-gnu \

--disable-gtk-doc \

--with-cairo=no

#freetype 需要2.0以上 编译arfbuzz-2.1.0 harfbuzz-1.8.1 成功

# 不要cairo 成功编译

make -j4

make install

# 编译1.27 不成功

export PKG_CONFIG_PATH=/home/uw/cross/libpng/lib/pkgconfig:/home/uw/cross/glib/lib/pkgconfig:/home/uw/cross/icu/lib/pkgconfig:/home/uw/cross/zlib/lib/pkgconfig:/home/uw/cross/ffi/lib/pkgconfig:/home/uw/cross/fribidi/lib/pkgconfig:/home/uw/cross/fontconfig/lib/pkgconfig:/home/uw/cross/xml/lib/pkgconfig:/home/uw/cross/freetype/lib/pkgconfig:$PKG_CONFIG_PATH

#各种依赖库太多,不好解决,总是提示找不到png库

#解决办法就是 把依赖库及头文件 拷贝到编译环境 ,比如下面考libpng库及头文件

cp /home/uw/cross/libpng/lib/* /opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc/usr/lib -rd

cp /home/uw/cross/libpng/include/* /opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc/usr/include -rd

make -j4

# cannot find -lcairo,需要编译 lcairo

13. 编译iconv  libiconv-1.16.tar.gz 字符编码之间的转换

#在Linux系统中,不同的应用程序可能使用不同的字符编码方式,而iconv正是为了解决这种编码不匹配问题而被广泛使用

./configure \

--prefix=/home/uw/cross/iconv \

--host=aarch64-linux-gnu

14.  编译ICU icu4c-70_1-src.tgz

tar xfzv icu4c-70_1-src.tgz

cd icu

#在源码同级目录建立 buildA

mkdir buildA

cd ./buildA

../source/runConfigureICU Linux/gcc

#一定要先make 编译一个x86 de icu, 先生成config/icucross.mk 文件,没有该文件无法完成 交叉编译配置

make j4

#在源码同级目录建立 buildB

cd ../

mkdir buildB

cd buildB

./source/configure \

--disable-samples \

--disable-tests \

--with-cross-build=/home/uw/tools/icu/build \

--prefix=/home/uw/cross/icu \

--host=aarch64-linux-gnu

make j4

make install

15. 编译libass 添加字幕 libass-0.17.1.tar.gz

#libass 是一个跨平台的高级字幕渲染引擎,专注于处理ASS和SSA格式的字幕文件

#libass是一个适用于ASS和SSA格式(Advanced Substation Alpha/Substation Alpha)的字幕渲染器,

#支持的字幕类型包括srt、ass等,

#凡是涉及到给视频画面添加字幕,均需事先集成libass

# 需要先编译freetype字库

#

#export ARCH=aarch64

export PATH=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/:$PATH

export CROSS_COMPILE=aarch64-linux-gnu-

export CC=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc

export CXX=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++

export LD=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ld

export AR=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ar

export AS=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-as

export RANLIB=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ranlib

export STRIP=/opt/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-strip

#export PYTHONPATH=/usr/local/lib/python2.7/

#export PYTHONHOME=/usr/lib/python2.

#export TARGET=aarch64-linux-gnu

export PKG_CONFIG_PATH=/home/uw/cross/harfbuzz/lib/pkgconfig:/home/uw/cross/libpng/lib/pkgconfig:/home/uw/cross/glib/lib/pkgconfig:/home/uw/cross/zlib/lib/pkgconfig:/home/uw/cross/ffi/lib/pkgconfig:/home/uw/cross/fribidi/lib/pkgconfig:/home/uw/cross/fontconfig/lib/pkgconfig:/home/uw/cross/xml/lib/pkgconfig:/home/uw/cross/freetype/lib/pkgconfig:$PKG_CONFIG_PATH

export INCLUDE=/home/uw/cross/zlib/include:/home/uw/cross/libpng/include:/home/uw/cross/xml/include:/home/uw/cross/freetype/include

export LIBRARY_PATH=/home/uw/cross/zlib/lib:/home/uw/cross/libpng/lib:/home/uw/cross/xml/lib:/home/uw/cross/freetype/lib:$LIBRARY_PATH

export LDFLAGS="-L/home/uw/cross/zlib/lib -L/home/uw/cross/libpng/lib -L/home/uw/cross/xml/lib -L/home/uw/cross/freetype/lib -lfreetype"

export CFLAGS="-I/home/uw/cross/zlib/include -I/home/uw/cross/libpng/include -I/home/uw/cross/xml/include -I/home/uw/cross/freetype/include"

export CPPFLAGS="-I/home/uw/cross/zlib/include -I/home/uw/cross/libpng/include -I/home/uw/cross/xml/include -I/home/uw/cross/freetype/include"

./configure --prefix=/home/uw/cross/libass \

--host=aarch64-linux-gnu

make -j4

make install

#'freetype2' requires 'harfbuzz >= 2.0.0' but version of harfbuzz is 1.8.1

#16 编译lib fdk-aac-2.0.3.tar.gz

# 一次编译成功

# LT_INIT: command not found ,autoconf not found

#需要装autoconf automake

sudo apt-get install autoconf automake libtool

sudo ln -s /usr/bin/libtoolize /usr/bin/libtoo

#安装好后 需要重新运行

./autogen.sh

./configure \

--prefix=/home/uw/cross/fdk-aac \

--host=aarch64-linux-gnu

make -j4

make install


17.  编译openjpeg openjpeg-2.3.0.tar.gz 成功编译

# 安装交叉编译工具链(以交叉编译为arm架构为例)

#下载OpenJPEG源代码 openjpeg-2.3.0.tar.gz

#git clone https://github.com/uclouvain/openjpeg.git

cd openjpeg-2.3.0

# 创建构建目录

mkdir build && cd build

# 配置CMake(使用交叉编译工具链)

cmake .. \

    -DCMAKE_SYSTEM_NAME=Linux \

    -DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc \

    -DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ \

    -DCMAKE_INSTALL_PREFIX=/home/uw/cross/openjpeg \

    -DCMAKE_INSTALL_LIBDIR=lib \

    -DBUILD_SHARED_LIBS=ON \

    -DWITH_TURBOJPEG=OFF \

    -DBUILD_STATIC_LIBS=ON

# 编译OpenJPEG

make -j4

make install

18. 编译rtmp rtmpdump.tar.gz

#下载:git clone git://git.ffmpeg.org/rtmpdump

#修改两个Makefile 注意配置openssl和zlib路径

cd rtmpdump

vim Makefile

#在前面加上

CROSS_COMPILE=aarch64-linux-gnu-

XCFLAGS +=-I /home/uw/cross/zlib/include

XCFLAGS += -I /home/uw/cross/zlib/include

XLDFLAGS += -L /home/uw/cross/zlib/lib

XLDFLAGS += -L /home/uw/cross/ssl/lib

#修改

prefix=/home/uw/cross/rtmp

#修改librtmp 目录下的Makefile 方法同上

#需要openssl ,将编译好的openssl 库和头文件拷贝到编译器libc/usr/ 目录下

make -j4

make install

#成功编译

19.  编译libmp3lame 支持mp3编码 lame-3.100.tar.gz

./configure \

--prefix=/home/uw/cross/lame \

--host=aarch64-linux-gnu

make -j4

make install

#编译成功,但是没有pkg-config ,编译ffmpg 直接加库

20. 编译 pixman pixman-pixman-0.42.0.tar.gz

#Pixman是由三星工程师开发的像素操作库,广泛应用于矢量图形Cario和X服务器等。

#它能够提供低级像素处理能力,同时具备图像合成、图形变化以及光栅化等功能

./autogen.sh

./configure \

--prefix=/home/uw/cross/pixman \

--host=aarch64-linux-gnu

make -j4

make install

#编译成功

21.  编译cairo cairo-1.14.8.tar.xz  1.17编译有错误

#Cairo是一个跨平台的2D图形库,支持多种输出设备如X-Windows、Win32和PDF

./configure --prefix=/home/uw/cross/cairo \

--host=aarch64-linux-gnu \

--enable-win32=no   \

--enable-win32-font=no   \

--enable-pdf=no   \

--enable-ps=no  \

--enable-xlib=no   \

--enable-xlib-xrender=no   \

--enable-xcb=no \

--enable-xlib-xcb=no \

--enable-xcb-shm=no \

--enable-ft=yes \

make j4

make install

#ok

22. 编译libv4l2  v4l-utils-1.18.1.tar.bz2

tar xvjf v4l-utils-1.18.1.tar.bz2

./configure \

--prefix=/home/uw/cross/v4l2 \

--host=aarch64-linux-gnu

# 要先编译libX11 libX11-1.6.9.tar.bz2

tar xvjf libX11-1.6.9.tar.bz2

./configure \

--prefix=/home/uw/cross/libX11 \

--host=aarch64-linux-gnu

#configure: error: cannot run test program while cross compiling

23. 编译--enable-libflite 语音合成

#b

./configure \

--prefix=/home/uw/cross/openssh \

--host=aarch64-linux-gnu

#23 编译libssh

mkdir build && cd build

cmake ..\

   -DCMAKE_SYSTEM_NAME=Linux \

   -DCMAKE_INSTALL_PREFIX=/home/uw/cross/ssh \

   -DCMAKE_C_COMPILER=$CC \

   -DCMAKE_CXX_COMPILER=$CXX \

   -DCMAKE_INSTALL_LIBDIR=lib \

   -DBUILD_SHARED_LIBS=ON \

   -DBUILD_STATIC_LIBS=ON \

   -DZLIB_LIBRARY:FILEPATH="/home/uw/cross/zlib/lib/libz.so" \

   -DZLIB_INCLUDE_DIR:PATH="/home/uw/cross/zlib/include"

#编译libssh-0.11.1.tar.xz

#CMake 3.12.0 or higher is required.  You are running version 3.10.2

#改为libssh-0.10.3

#Could NOT find ZLIB (missing: ZLIB_LIBRARY) (found version "1.3.1")

#加上下面这个

      -DZLIB_LIBRARY:FILEPATH="/home/uw/cross/zlib/lib/libz.so"

      -DZLIB_INCLUDE_DIR:PATH="/home/uw/cross/zlib/include"

     

#新问题

    

24.  编译libdrm  libdrm-2.4.100.tar.gz

#使用Meson和Ninja交叉编译libdrm

#sudo apt-get update

#sudo apt-get install meson ninja-build

#tar xvjf drm-libdrm-2.4.122.tar.bz2

#meson setup --prefix=/home/uw/cross/drm

#2.4.100 直接用configure

tar xfzv  libdrm-2.4.100.tar.gz

cd libdrm-2.4.100

./configure \

--prefix=/home/uw/cross/libdrm \

--host=aarch64-linux-gnu \

--disable-intel \

#ok

25.  编译rk-mpp

#--with-kernel-source=/home/uw/RK3588/rk3588_linux_release_v1.2.1/kernel

# rk-mpp 编译很简单,没有什么依赖库

cd ./mpp-1.0.7/build/linux/aarch64

#核实一下编译器

vim arm.linux.cross.cmake

./make-Makefiles.bash

make -j4

make install

#注意:make install 将安装在usr/目录下 ,将相关lib库文件和include 文件拷贝到指定目录

26.  编译ffmpeg

#先要执行下面环境变量,不然会提示找不到相关库,尽快库已经拷贝到编译器目录,但是配置程序还是用pkg-config 去检查是否有该库

export PKG_CONFIG_PATH=/home/uw/cross/pkgconfig-all:/home/uw/cross/mpp/lib/pkgconfig:/home/uw/cross/rtmp/lib/pkgconfig:/home/uw/cross/openjpeg/lib/pkgconfig:/home/uw/cross/libdrm/lib/pkgconfig:/home/uw/cross/libass/lib/pkgconfig:/home/uw/cross/harfbuzz/lib/pkgconfig:/home/uw/cross/libpng/lib/pkgconfig:/home/uw/cross/glib/lib/pkgconfig:/home/uw/cross/zlib/lib/pkgconfig:/home/uw/cross/ffi/lib/pkgconfig:/home/uw/cross/fribidi/lib/pkgconfig:/home/uw/cross/fontconfig/lib/pkgconfig:/home/uw/cross/xml/lib/pkgconfig:/home/uw/cross/freetype/lib/pkgconfig:$PKG_CONFIG_PATH

./configure \

--prefix=/home/uw/cross/ffmpeg \

--cross-prefix=aarch64-linux-gnu- \

--arch=aarch64 \

--target-os=linux \

--enable-shared \

--disable-static \

--enable-gpl \

--enable-nonfree   \

--enable-pthreads \

--enable-version3 \

--enable-runtime-cpudetect \

--enable-libx264 \

--enable-encoder=libx264 \

--enable-encoder=mjpeg \

--enable-libx265 \

--enable-openssl \

--enable-libfdk-aac \

--enable-libxml2 \

--enable-librtmp \

--enable-libfreetype \

--enable-libfontconfig \

--enable-libharfbuzz \

--enable-libxvid  \

--enable-libfribidi \

--enable-libass \

--enable-libopenjpeg \

--enable-libmp3lame \

--enable-libdrm \

--enable-rkmpp \

--enable-decoder=h264_rkdec \

--enable-encoder=h264_rkvenc \

--pkg-config=/usr/bin/pkg-config

make -j4

make install

#直接成功:

#到此为止,ffmpeg6.1.2 for rk3588 编译大功告成!
 

27. 下面是之前没有拷贝库的配置错误处理

#RROR: libass >= 0.11.0 not found using pkg-config

#需要加上 --pkg-config=/usr/bin/pkg-config

#提示找不到x265 的库, 发现x265库编译的有问题,重新正确编译后可以

#用 file 命令查看 库文件 编译器架构

#加上--enable-libxml2

#ERROR: libxml-2.0 not found using pkg-config ,明明有这个库,?

# pkg-config --list-all | grep libxml 确实查不到 ?

# 将libxml-2.0.pc 复制到/usr/lib/pkgconfig 下就可以查到了

cp /home/uw/cross/xml/lib/pkgconfig/libxml-2.0.pc /usr/lib/pkgconfig

#设置环境变量PKG_CONFIG_PATH

#发现PKG_CONFIG_PATH 只有最后三个,不知道什么原因,改为统一把.pc 考到一个目录下

export PKG_CONFIG_PATH=/home/uw/cross/all-config/pkgconfig

#configure 还是提示找不到xml ,查看日志,ffbuild/config.log 发现测试代码编译确实有问题,主要是找不到头文件 和库文件

#解决办法,修改 vim libxml-2.0.pc 该问题查了很久,还是要看日志文件 查找错误

#源文件

prefix=/home/uw/cross/xml

exec_prefix=${prefix}

libdir=${exec_prefix}/lib

includedir=${prefix}/include

modules=1

Name: libXML

Version: 2.9.10

Description: libXML library version2.

Requires:

Libs: -L${libdir} -lxml2

Libs.private:   -L/home/uw/cross/zlib/lib -lz   -lm

Cflags: -I${includedir}/libxml2

#修改后

prefix=/home/uw/cross/xml

exec_prefix=${prefix}

libdir=${exec_prefix}/lib

includedir=${prefix}/include

modules=1

Name: libXML

Version: 2.9.10

Description: libXML library version2.

Requires:

Libs: -L${libdir} -lxml2 -L/home/uw/cross/zlib/lib -lz

Libs.private:   -L/home/uw/cross/zlib/lib -lz   -lm

Cflags: -I${includedir}/libxml2 -I${includedir}

#

#成功配置

./configure \

--prefix=/home/uw/cross/ffmpeg \

--cross-prefix=aarch64-linux-gnu- \

--arch=aarch64 \

--target-os=linux \

--enable-shared \

--disable-static \

--enable-gpl \

--enable-nonfree   \

--enable-pthreads \

--enable-version3 \

--enable-runtime-cpudetect \

--enable-libx264 \

--enable-libx265 \

--enable-openssl \

--enable-libfdk-aac \

--enable-libxml2 \

--pkg-config=/usr/bin/pkg-config

#配置rtmp 模块也是aarch64-linux-gnu/bin/ld: cannot find -lz

#继续修改librtmp.pc

Libs: -L${libdir} -lrtmp -L/home/uw/cross/zlib/lib -lz

#接下来加上freetype 等,应该类似的问题, 修改.pc

Libs: -L/home/uw/cross/freetype/lib -lfreetype -L/home/uw/cross/libpng/lib -lpng -L/home/uw/cross/zlib/lib -lz

#配置rtmp 模块 --enable-libfontconfig

#修改 .pc

Libs: -L${libdir} -lfontconfig -L/home/uw/cross/xml/lib -lxml2

#配置xvid ,由于xvid 编译时候没有pkgconfig, 所以直接加上

--extra-cflags="-I/home/uw/cross/xvid/include" \

--extra-ldflags="-L/home/uw/cross/xvid/lib" \

#配置 --enable-libfribidi ,直接就可以了 ,复制.pc 到指定目录下

#配置--enable-libass  这一步加了 好多依赖库

--extra-cflags="-I/home/uw/cross/freetype/include -I/home/uw/cross/harfbuzz/include/harfbuzz -I/home/uw/cross/glib/include/glib-2.0 -I/home/uw/cross/glib/include/glib-2.0/include -I/home/uw/cross/xvid/include -I/home/uw/cross/libpng/include -I/home/uw/cross/xml/include/libxml2 -I/home/uw/cross/zlib/include" \

--extra-ldflags="-L/home/uw/cross/freetype/lib -lfreetype -L/home/uw/cross/harfbuzz/lib -lharfbuzz -L/home/uw/cross/glib/lib -lglib-2.0 -L/home/uw/cross/xvid/lib -L/home/uw/cross/libpng/lib -lpng -L/home/uw/cross/xml/lib -lxml2 -L/home/uw/cross/zlib/lib -lz"  \

#配置--enable-libopenjpeg

#配置mpp

ERROR: rkmpp requires --enable-libdrm

#用meson ninja 交叉编译 libdrm

#1

sudo apt-get install meson ninja-build

#2

mkdir build

cd build

#3配置交叉编译环境变量,例如设置目标操作系统、架构和交叉编译工具链:

export CC=your_cross_compiler_prefix-gcc

export CXX=your_cross_compiler_prefix-g++

export AR=your_cross_compiler_prefix-ar

export RANLIB=your_cross_compiler_prefix-ranlib

#4使用Meson配置项目,指定交叉编译参数:

meson setup --cross-file cross-compilation.txt --prefix /home/uw/corss/libdrm --buildtype release builddir

#cross-compilation.txt 文件内容如下

[binaries]

c = 'aarch64-linux-gnu-gcc'

cpp = 'aarch64-linux-gnu-g++'

ar = 'aarch64-linux-gnu-ar'

strip = 'aarch64-linux-gnu-strip'

[host_machine]

system = 'linux'

cpu_family = 'aarch64'

cpu = 'aarch64'

endian = 'little'

#5编译项目:

ninja -C builddir

#6安装编译好的库:

ninja -C builddir install

#libdrm-2.4.80.tar.bz2

./configure \

--prefix=/home/uw/cross/libdrm \

--host=aarch64-linux-gnu







 

rk3588 下使用v4l2 采集摄像头,然后使用 mpp 压缩成 h264 最后用rtsp 输出流媒体,个人原创,学习v4l2, mpp 压缩, rtsp 流媒体可以参考学习,已工程使用,分辨率自动支持不完善,有时间再改优化 在现代数字媒体处理领域,rk3588处理器由于其强大的性能和高集成度,已成为众多开发者和制造商的首选。rk3588是一块高性能的系统级芯片(SoC),广泛应用于智能电视、平板电脑、工业控制等多种场景。本项目主要探讨了如何在rk3588平台上,通过v4l2接口采集摄像头的图像数据,再利用MPP(Media Processing Platform,多媒体处理平台)将其压缩成h264格式的视频流,并最终通过RTSP(Real Time Streaming Protocol,实时流媒体传输协议)实现流媒体的输出。 v4l2是Linux内核中用于视频输入输出的设备驱动架构,它是Video4Linux的第二版。v4l2提供了一套标准的编程接口,让应用程序能够访问和控制摄像头等视频捕获设备。在这个项目中,v4l2的作用是作为视频数据采集的接口,把摄像头捕获到的原始图像数据读取出来。 MPP是Rockchip公司为RK系列芯片开发的一套多媒体处理方案,它能在硬件层面上实现对多媒体数据的编解码处理。在本项目中,MPP的主要工作是接收来自v4l2的原始视频数据,并将这些数据压缩编码成h264格式。h264是一种广泛使用的视频压缩标准,具有高压缩比和良好的视频质量,非常适合作为网络传输的视频格式。 RTSP是一种网络控制协议,用来控制音频和视频流的点播,允许像播放、暂停、停止等控制,因此它经常被用于流媒体服务中。项目最后通过RTSP协议输出压缩后的视频流,使用户可以通过网络实时观看视频内容。 该工程的一个主要亮点是它支持自动分辨率调整。这意味着摄像头采集的视频数据可以自动适应不同的输出需求,无需手动设置,极大地方便了用户使用。然而,开发者也提到目前分辨率的自动支持还不完善,存在一些兼容性和稳定性方面的问题,因此计划未来会进一步优化和改进。 整个项目是一个典型的多媒体数据处理流程,从视频数据的采集、处理到传输,覆盖了多媒体应用的多个关键环节。对于学习和掌握v4l2、MPP压缩技术和RTSP流媒体传输的开发者来说,该项目的代码和工程实践可以提供非常宝贵的参考价值。同时,由于它已经应用于实际工程,因此项目的成熟度和实用性也得到了验证。 由于该项目还处于开发和完善阶段,它也给开发者留下了一定的改进空间。例如,对分辨率自动支持的完善,以及可能的性能优化等,都是值得进一步研究的方向。对于那些希望在rk3588平台上开发流媒体服务的开发者来说,该项目无疑是一个非常值得研究的案例。
前端实现上移下移置顶置底需要使用 JavaScript 来操作 DOM 元素。 具体实现可以参考以下代码: ```html <ul id="list"> <li>列表项1</li> <li>列表项2</li> <li>列表项3</li> <li>列表项4</li> <li>列表项5</li> </ul> <button onclick="moveUp()">上移</button> <button onclick="moveDown()">下移</button> <button onclick="moveTop()">置顶</button> <button onclick="moveBottom()">置底</button> ``` ```javascript // 获取列表元素和当前选中的项 var list = document.getElementById("list"); var selectedItem; // 上移操作 function moveUp() { if (selectedItem) { var prevItem = selectedItem.previousElementSibling; if (prevItem) { list.insertBefore(selectedItem, prevItem); } } } // 下移操作 function moveDown() { if (selectedItem) { var nextItem = selectedItem.nextElementSibling; if (nextItem) { list.insertBefore(nextItem, selectedItem); } } } // 置顶操作 function moveTop() { if (selectedItem) { list.insertBefore(selectedItem, list.firstChild); } } // 置底操作 function moveBottom() { if (selectedItem) { list.appendChild(selectedItem); } } // 监听列表项点击事件,记录当前选中的项 list.addEventListener("click", function(e) { selectedItem = e.target; }); ``` 这段代码实现了一个简单的列表操作,通过点击按钮可以实现上移、下移、置顶、置底等操作。需要注意的是,这里的操作只是在前端进行了 DOM 元素的移动,如果需要将这些操作的结果保存到后端,还需要进行相应的 AJAX 请求。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值