diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d48c759 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.idea +.vscode \ No newline at end of file diff --git a/cmake.md b/cmake.md index 175826c..2a613bb 100644 --- a/cmake.md +++ b/cmake.md @@ -24,7 +24,7 @@ cmake的使用围绕着 编译选项 头文件 库文件搜索路径,需要编 ```cmake set(key value) #定义变量 也可以拼接变量 # 使用时通过 ${key} 取值 -set(变量名1 ${变量名1} ${变量名2} ...) +set(变量名1 ${xxx1} ${xxx2} ...) list(APPEND [ ...]) # list 也可以移除 @@ -39,7 +39,7 @@ add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL]) ### cmake中常见的预设变量 -下面的列表中为大家整理了一些CMake中常用的宏: +下面的列表中为一些CMake中常用的宏: | 宏 | 含义 | | ------------------------ | ------------------------------------------------------------ | @@ -221,11 +221,11 @@ target_include_directories(test1 PUBLIC include/test2) ```cmake # 关于条件判断其语法格式如下: if() - + # elseif() # 可选快, 可以重复 - + # else() # 可选快 - + # endif() # 在进行条件判断的时候,如果有多个条件,那么可以写多个elseif,最后一个条件可以使用else,但是开始和结束是必须要成对出现的,分别为:if和endif。 ``` @@ -235,14 +235,14 @@ endif() # 基本表达式 if() # NOT AND OR #]=] -如果是基本表达式,expression 有以下三种情况:常量、变量、字符串。 -如果是1, ON, YES, TRUE, Y, 非零值,非空字符串时,条件判断返回True -如果是 0, OFF, NO, FALSE, N, IGNORE, NOTFOUND,空字符串时,条件判断返回False -#]=] +# 如果是基本表达式,expression 有以下三种情况:常量、变量、字符串。 +# 如果是1, ON, YES, TRUE, Y, 非零值,非空字符串时,条件判断返回True +# 如果是 0, OFF, NO, FALSE, N, IGNORE, NOTFOUND,空字符串时,条件判断返回False +# ]=] # 逻辑判断 if( ) # 其实这就是一个取反操作,如果条件condition为True将返回False,如果条件condition为False将返回True。 -如果cond1和cond2两个条件中至少有一个为True,返回True,如果两个条件都为False则返回False。 +# 如果cond1和cond2两个条件中至少有一个为True,返回True,如果两个条件都为False则返回False。 ``` 比较 @@ -280,7 +280,7 @@ if( STRGREATER_EQUAL ) ```cmake foreach( ) - + # endforeach() ``` @@ -315,7 +315,6 @@ project(test) foreach(item RANGE 10 30 2) message(STATUS "当前遍历的值为: ${item}" ) endforeach() - ``` diff --git a/ffmpeg.md b/ffmpeg.md index d3341ae..108f6d9 100644 --- a/ffmpeg.md +++ b/ffmpeg.md @@ -72,7 +72,7 @@ sudo make install # ./ffmpeg -hwaccels 查看支持哪些硬件编码 ``` -**编译ffmeg arm64版本** +### 编译ffmeg arm64安卓版本 在源码目录下创建buildarm64.sh,内容如下 @@ -149,6 +149,170 @@ chomd +x buildarm64.sh ./buildarm64.sh # 编译好后,对应的源文件和库文件会安装到./android/armv-v8a中 ``` +### 在rk3568上交叉编译ffmpeg +使用瑞芯微上使用其硬件加速编码和解码 +创建一个目录 ~/dev 之后所有的操作在这个目录下进行 +1. 编译mpp + ```shell + git clone -b jellyfin-mpp --depth=1 https://github.com/nyanmisaka/mpp.git rkmpp + mkdir rkmpp_build + pushd rkmpp_build + # 在cmake中指定交叉工具链gcc和g++ 改成自己的目录 + # 注意在不要安装到本机的系统目录,最好新建一个目录,之后把所有的依赖安装到这个目录 + cmake \ + -DCMAKE_INSTALL_PREFIX=~/dev/rkffmpeg \ + -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_SHARED_LIBS=ON \ + -DBUILD_TEST=OFF \ + -DCMAKE_C_COMPILER=/home/user/baidu/buildroot-cross/gcc_for_rk356x_buildroot/bin/aarch64-linux-gcc \ + -DCMAKE_CXX_COMPILER=/home/user/baidu/buildroot-cross/gcc_for_rk356x_buildroot/bin/aarch64-linux-g++ \ + .. + make -j $(nproc) + make install + ``` +2. build rga + + 创建一个在~/dev 目录下创建cross_file.txt, 将工具链换成自己的,以及安装目录 + ```txt + [host_machine] + system = 'linux' + cpu_family = 'aarch64' + cpu = 'armv8-a' + endian = 'little' + + [binaries] + c = '/home/user/baidu/buildroot-cross/gcc_for_rk356x_buildroot/bin/aarch64-linux-gcc' + cpp = '/home/user/baidu/buildroot-cross/gcc_for_rk356x_buildroot/bin/aarch64-linux-g++' + ar = '/home/user/baidu/buildroot-cross/gcc_for_rk356x_buildroot/aarch64-rockchip-linux-gnu/bin/ar' + strip = '/home/user/baidu/buildroot-cross/gcc_for_rk356x_buildroot/aarch64-rockchip-linux-gnu/bin/strip' + + [properties] + c_args = ['-fpermissive'] + cpp_args = ['-fpermissive'] + + [paths] + prefix = '~/dev/rkffmpeg' + libdir = 'lib' + ``` + ```shell + git clone -b jellyfin-rga --depth=1 https://github.com/nyanmisaka/rk-mirrors.git rkrga + # 不需要cd 进行 + meson setup rkrga rkrga_build \ + --prefix=/usr \ + --libdir=lib \ + --buildtype=release \ + --default-library=shared \ + -Dcpp_args=-fpermissive \ + -Dlibdrm=false \ + -cross-file=./cross_file.txt \ + -Dlibrga_demo=false + meson configure rkrga_build + ninja -C rkrga_build install + ``` +3. 编译drm + + 首先去官网下载源码包https://dri.freedesktop.org/libdrm/ + 下载完成后,开始解压缩,解压缩完成后,进入源码目录,首先创建install和build目录,然后创建cross_file.txt文件,文件内容如下 + ```txt + [host_machine] + system = 'linux' + cpu_family = 'aarch64' + cpu = 'armv8-a' + endian = 'little' + + [binaries] + c = '/home/user/baidu/buildroot-cross/gcc_for_rk356x_buildroot/bin/aarch64-linux-gcc' + cpp = '/home/user/baidu/buildroot-cross/gcc_for_rk356x_buildroot/bin/aarch64-linux-g++' + ar = '/home/user/baidu/buildroot-cross/gcc_for_rk356x_buildroot/aarch64-rockchip-linux-gnu/bin/ar' + strip = '/home/user/baidu/buildroot-cross/gcc_for_rk356x_buildroot/aarch64-rockchip-linux-gnu/bin/strip' + + [properties] + c_args = ['-fpermissive'] + cpp_args = ['-fpermissive'] + + [paths] + prefix = '~/dev/rkffmpeg' + libdir = 'lib' + ``` + 然后直接执行指令ninja && ninja install即可使用 + +4. 编译ffmpeg + + 上面的依赖编译并安装好后,正式开始编译ffmpeg,添加rk芯片的mpp来加速编解码 + 在~/dev 下载ffmpeg 进入到源码目录 创建build.sh 内容如下 + ```shell + #!/bin/bash + export TOOLCHAIN=/home/user/baidu/buildroot-cross/gcc_for_rk356x_buildroot/bin/aarch64-linux + export GCC=$TOOLCHAIN-gcc + export GXX=$TOOLCHAIN-g++ + + # 编译到开发版,尽可能小一些(--enable-small),取消了一些其它硬件加速和封装 + # 更换 cc cxx ar strip 以及--extra-cflags --extra-ldflags + function build_android + { + + ./configure \ + --sysroot=./ \ + --extra-cflags="-I~/dev/rkffmpeg/include" \ + --extra-ldflags="-L~/dev/rkffmpeg/lib" \ + --prefix=$PREFIX \ + --enable-cross-compile \ + --arch=arm64 \ + --cpu=armv8-a \ + ar=/home/user/baidu/buildroot-cross/gcc_for_rk356x_buildroot/aarch64-rockchip-linux-gnu/bin/ar \ + strip=/home/user/baidu/buildroot-cross/gcc_for_rk356x_buildroot/aarch64-rockchip-linux-gnu/bin/strip \ + --cc=$GCC \ + --cxx=$GXX \ + --enable-libdrm \ + --disable-nvenc \ + --disable-nvdec \ + --disable-vdpau \ + --disable-vaapi \ + --enable-rkmpp \ + --enable-rkrga \ + --enable-version3 \ + --disable-programs \ + --disable-avdevice \ + --disable-muxers \ + --disable-filters \ + --enable-neon \ + --enable-gpl \ + --disable-sdl2 \ + --disable-postproc \ + --disable-debug \ + --enable-small \ + --enable-static \ + --enable-shared \ + --disable-doc \ + --enable-ffmpeg \ + --disable-ffprobe \ + --disable-avdevice \ + --disable-doc \ + --disable-symver + + + + echo "============================ build android arm64-v8a success ==========================" + + } + + #arm64-v8a + + + PREFIX=$(pwd)/rk-arm64 + + build_android + ``` + 编译 + ```shell + chmod +x build.sh + + make clean + make -j16 + make install + ``` + 最后把编译好的ffmpeg 放到~/dev/rkffmpeg 中 一并打包移植到开发版上 + ## 硬编码