This commit is contained in:
LiXiaoqi 2024-11-21 16:41:04 +08:00
parent a848b3bd8f
commit 2efc74bfab
2 changed files with 174 additions and 1 deletions

View File

@ -70,3 +70,100 @@ sudo make install
make make
sudo make install sudo make install
``` ```
编译ffmeg arm64版本
在源码目录下创建buildarm64.sh内容如下
```shell
#!/bin/bash
export NDK=~/android/android-ndk-r20b #这里配置先你的 NDK 路径
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
# 编译到安卓上,尽可能小一些(--enable-small),只是用来解码,也就取消编译封装编码相关的
function build_android
{
./configure \
--disable-programs \
--disable-avdevice \
--disable-encoders \
--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-ffplay \
--disable-ffprobe \
--disable-avdevice \
--disable-doc \
--disable-symver \
--prefix=$PREFIX \
--cross-prefix=$CROSS_PREFIX \
--target-os=android \
--arch=$ARCH \
--cpu=$CPU \
--cc=$CC \
--cxx=$CXX \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS"
make clean
make -j16
make install
echo "============================ build android arm64-v8a success =========================="
}
#arm64-v8a
ARCH=arm64
CPU=armv8-a
API=21
CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=$CPU"
build_android
```
```shell
chomd +x buildarm64.sh
./buildarm64.sh
# 编译好后,对应的源文件和库文件会安装到./android/armv-v8a中
```
## 硬编码
```c++
// 与软编码相比,没有很多额外的配置
// 仅仅是在查找编码器时按名称查找 hevc_nvenc ,其余和软编码一样
auto pCodec = avcodec_find_encoder_by_name("hevc_nvenc");
// ...
// 其次就是注意软编码出来的每一帧数据 前面都会带有SEI增强帧关键帧后面才是I帧或者P帧
auto naluHeader = (pkt->data[4] & 0x7E) >> 1; // 前四个字节是0x00 00 00 01 分隔符
if (naluHeader == 39) { // SEI
auto header = getNextSplit(pkt->data, pkt->size); // 往后找跳过这个SEI
if (header == nullptr)
return 0;
naluHeader = ((*header) & 0x7E) >> 1;
// cout << "naluHeader: " << naluHeader << endl;
}
```

76
flutter_plugin.md Normal file
View File

@ -0,0 +1,76 @@
# flutter plugin
创建插件命令
```shell
flutter create --template=plugin --platforms=windows,android yourname
```
--platforms 可以指定支持哪些平台,如 windowsmacosiosandroidlinux
如果没有创建相应平台目录,可以使用下面的命令开启相应的平台
```bash
flutter config --enable-linux-desktop # 开启linux 桌面
flutter config --enable-macos-desktop # 开启macos 桌面
flutter config --enable-ios # 开启ios
# 更多的命令可以通过help查看
flutter config --help
```
## Android安卓
1. gradle文件配置
```gradle
defaultConfig {
minSdkVersion 19
ndk {
// 只编译arm64
abiFilters "arm64-v8a"
}
externalNativeBuild {
// 依赖的自定义cmake路径
cmake {
arguments "-DANDROID_ARM_NEON=TRUE", "-DANDROID_STL=c++_shared"
path "../src/CMakeLists.txt"
}
}
consumerProguardFiles "consumer-rules.pro"
}
// 一部分动态库需要安装时一并打包,避免出现找不到依赖的动态库
sourceSets {
main {
// 指定动态库路径 安卓的需要的动态库我放到了../src/bin/arm64-v8a, 在指定时只需要到bin即可但是一定得放到arm64-v8a里面
jniLibs.srcDirs = ['../src/bin/']
}
}
```
2. cmake 文件
```cmake
# 安卓使用
cmake_minimum_required(VERSION 3.18)
set(PROJECT_NAME "pass_track")
project(${PROJECT_NAME}) # CXX
# 包含头文件搜索目录和库的搜索目录
# 指定所有需要编译的头文件和源文件${all_sources} ${all_headers}
add_library(${PROJECT_NAME} SHARED
${all_sources}
${all_headers}
)
set_target_properties(${PROJECT_NAME} PROPERTIES
CXX_VISIBILITY_PRESET hidden)
target_compile_definitions(${PROJECT_NAME} PRIVATE FLUTTER_PLUGIN_IMPL)
target_link_libraries(${PROJECT_NAME} PRIVATE 。。。)
```