HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

window 交叉编译 ffmpeg

window Android

https://github.com/helloword202507/android-ffmpeg-compiler

联系作者

helloword202507@163.com

🎬 FFmpeg Android 编译配置

一个用于简化FFmpeg Android库编译的图形化配置工具,支持命令行和Web界面两种使用模式。

✨ 特性

  • 🖥️ 双模式支持: 命令行模式和Web图形界面
  • 📱 多架构支持: arm64-v8a, armeabi-v7a, x86, x86_64
  • 🎯 预设配置: 提供6种预设配置,满足不同使用场景
  • ⚙️ 灵活配置: 支持自定义编解码器、格式、协议等
  • 🚀 一键编译: 自动化编译流程,简化操作
  • 🧹 清理工具: 内置清理工具,管理编译产物
  • 📊 实时状态: Web界面实时显示编译进度

📦 预设配置

预设 描述 适用场景
最小版 仅包含基本H.264解码功能 简单播放器
基础版 常用编解码器和格式支持 基本视频播放应用
标准版 包含常用编解码器,适合大多数应用 通用移动应用
流媒体版 专为流媒体播放优化 在线视频播放
直播版 支持实时编码和推流协议 直播应用
完整版 包含所有功能的完整版本 专业视频处理

🚀 快速开始

环境要求

  • Python 3.7+
  • Android NDK
  • MSYS2 (Windows)
  • FFmpeg 源码

安装依赖

pip install -r requirements.txt

使用方式

1. Web界面模式 (推荐)

# 启动Web界面  
python main.py --web  

# 或使用快速启动脚本  
python start_web.py

然后在浏览器中访问 http://localhost:5000

2. 命令行模式

# 使用预设配置  
python main.py --preset standard  

# 使用自定义配置文件  
python main.py --config my_config.json  

# 交互式选择  
python main.py

3. 清理工具

# 清理所有文件  
python main.py --clean  

# 或使用专用清理脚本  
python clean.py --all

📁 项目结构

ffmpeg-android-builder/  
├── main.py                 # 主入口文件  
├── start_web.py           # Web界面快速启动  
├── clean.py               # 清理工具  
├── config_presets.json    # 预设配置文件  
├── src/                   # 源码目录  
│   ├── cli/              # 命令行界面模块  
│   ├── web/              # Web界面模块  
│   ├── core/             # 核心功能模块  
│   └── utils/            # 工具模块  
├── static/               # Web界面静态资源  
├── build/                # 编译输出目录  
├── logs/                 # 日志文件  
├── android-ndk/          # Android NDK  
├── ffmpeg/               # FFmpeg源码  
└── msys64/               # MSYS2环境

⚙️ 配置说明

基本配置

  • Android API: 目标Android API级别 (最低16)
  • 输出类型: shared (动态库) 或 static (静态库)
  • 目标架构: 支持的CPU架构

编解码器配置

  • 解码器: 支持的视频/音频解码器
  • 编码器: 支持的视频/音频编码器
  • 复用器: 支持的容器格式输出
  • 解复用器: 支持的容器格式输入

网络协议

支持配置各种网络协议,如HTTP、HTTPS、RTMP、HLS等

优化选项

  • 禁用汇编: 禁用汇编优化以提高兼容性
  • 启用PIC: 启用位置无关代码
  • 禁用调试: 移除调试信息减小体积
  • 启用小体积: 优化编译以减小最终库大小

🛠️ 开发说明

核心模块

  • ConfigManager: 配置管理,支持预设和自定义配置
  • EnvironmentManager: 环境检查和设置
  • BuildManager: 编译流程管理
  • CompilerManager: 编译器调用和参数生成

Web界面

基于Flask构建的Web界面,提供:

  • 图形化配置界面
  • 预设配置选择
  • 实时编译状态
  • 日志查看功能

命令行界面

提供完整的命令行操作支持:

  • 交互式配置
  • 批处理模式
  • 配置文件支持

📝 使用示例

Web界面配置

  1. 启动Web界面: python main.py --web
  2. 在浏览器中打开配置页面
  3. 选择预设配置或自定义配置
  4. 点击"开始编译"按钮
  5. 查看实时编译进度和日志

命令行配置

# 使用标准预设  
python main.py --preset standard  

# 使用自定义配置  
python main.py --config custom_config.json  

# 清理编译产物  
python main.py --clean

🧹 清理工具

# 清理所有文件  
python clean.py --all  

# 仅清理编译输出  
python clean.py --build  

# 仅清理临时文件  
python clean.py --temp  

# 仅清理构建缓存  
python clean.py --cache

MSYS2 中运行

web 生成脚本后 build_ffmpeg.sh 在msys2中运行

📋 常见问题

Q: 编译失败怎么办?

A: 检查环境配置,确保Android NDK和MSYS2正确安装,查看logs目录下的日志文件。

Q: 如何添加自定义编解码器?

A: 在Web界面的自定义配置中添加,或修改配置JSON文件。

Q: 支持哪些Android版本?

A: 支持Android API 16+,推荐使用API 21+。

Q: 如何减小编译后的库大小?

A: 使用"最小版"预设,或启用"小体积优化"选项。

🤝 贡献

欢迎提交Issue和Pull Request来改进这个项目。

📄 许可证

本项目采用MIT许可证,详见LICENSE文件。

🔗 相关链接


注意: 首次使用前请确保已正确安装和配置所有依赖环境。

继续阅读 »

https://github.com/helloword202507/android-ffmpeg-compiler

联系作者

helloword202507@163.com

🎬 FFmpeg Android 编译配置

一个用于简化FFmpeg Android库编译的图形化配置工具,支持命令行和Web界面两种使用模式。

✨ 特性

  • 🖥️ 双模式支持: 命令行模式和Web图形界面
  • 📱 多架构支持: arm64-v8a, armeabi-v7a, x86, x86_64
  • 🎯 预设配置: 提供6种预设配置,满足不同使用场景
  • ⚙️ 灵活配置: 支持自定义编解码器、格式、协议等
  • 🚀 一键编译: 自动化编译流程,简化操作
  • 🧹 清理工具: 内置清理工具,管理编译产物
  • 📊 实时状态: Web界面实时显示编译进度

📦 预设配置

预设 描述 适用场景
最小版 仅包含基本H.264解码功能 简单播放器
基础版 常用编解码器和格式支持 基本视频播放应用
标准版 包含常用编解码器,适合大多数应用 通用移动应用
流媒体版 专为流媒体播放优化 在线视频播放
直播版 支持实时编码和推流协议 直播应用
完整版 包含所有功能的完整版本 专业视频处理

🚀 快速开始

环境要求

  • Python 3.7+
  • Android NDK
  • MSYS2 (Windows)
  • FFmpeg 源码

安装依赖

pip install -r requirements.txt

使用方式

1. Web界面模式 (推荐)

# 启动Web界面  
python main.py --web  

# 或使用快速启动脚本  
python start_web.py

然后在浏览器中访问 http://localhost:5000

2. 命令行模式

# 使用预设配置  
python main.py --preset standard  

# 使用自定义配置文件  
python main.py --config my_config.json  

# 交互式选择  
python main.py

3. 清理工具

# 清理所有文件  
python main.py --clean  

# 或使用专用清理脚本  
python clean.py --all

📁 项目结构

ffmpeg-android-builder/  
├── main.py                 # 主入口文件  
├── start_web.py           # Web界面快速启动  
├── clean.py               # 清理工具  
├── config_presets.json    # 预设配置文件  
├── src/                   # 源码目录  
│   ├── cli/              # 命令行界面模块  
│   ├── web/              # Web界面模块  
│   ├── core/             # 核心功能模块  
│   └── utils/            # 工具模块  
├── static/               # Web界面静态资源  
├── build/                # 编译输出目录  
├── logs/                 # 日志文件  
├── android-ndk/          # Android NDK  
├── ffmpeg/               # FFmpeg源码  
└── msys64/               # MSYS2环境

⚙️ 配置说明

基本配置

  • Android API: 目标Android API级别 (最低16)
  • 输出类型: shared (动态库) 或 static (静态库)
  • 目标架构: 支持的CPU架构

编解码器配置

  • 解码器: 支持的视频/音频解码器
  • 编码器: 支持的视频/音频编码器
  • 复用器: 支持的容器格式输出
  • 解复用器: 支持的容器格式输入

网络协议

支持配置各种网络协议,如HTTP、HTTPS、RTMP、HLS等

优化选项

  • 禁用汇编: 禁用汇编优化以提高兼容性
  • 启用PIC: 启用位置无关代码
  • 禁用调试: 移除调试信息减小体积
  • 启用小体积: 优化编译以减小最终库大小

🛠️ 开发说明

核心模块

  • ConfigManager: 配置管理,支持预设和自定义配置
  • EnvironmentManager: 环境检查和设置
  • BuildManager: 编译流程管理
  • CompilerManager: 编译器调用和参数生成

Web界面

基于Flask构建的Web界面,提供:

  • 图形化配置界面
  • 预设配置选择
  • 实时编译状态
  • 日志查看功能

命令行界面

提供完整的命令行操作支持:

  • 交互式配置
  • 批处理模式
  • 配置文件支持

📝 使用示例

Web界面配置

  1. 启动Web界面: python main.py --web
  2. 在浏览器中打开配置页面
  3. 选择预设配置或自定义配置
  4. 点击"开始编译"按钮
  5. 查看实时编译进度和日志

命令行配置

# 使用标准预设  
python main.py --preset standard  

# 使用自定义配置  
python main.py --config custom_config.json  

# 清理编译产物  
python main.py --clean

🧹 清理工具

# 清理所有文件  
python clean.py --all  

# 仅清理编译输出  
python clean.py --build  

# 仅清理临时文件  
python clean.py --temp  

# 仅清理构建缓存  
python clean.py --cache

MSYS2 中运行

web 生成脚本后 build_ffmpeg.sh 在msys2中运行

📋 常见问题

Q: 编译失败怎么办?

A: 检查环境配置,确保Android NDK和MSYS2正确安装,查看logs目录下的日志文件。

Q: 如何添加自定义编解码器?

A: 在Web界面的自定义配置中添加,或修改配置JSON文件。

Q: 支持哪些Android版本?

A: 支持Android API 16+,推荐使用API 21+。

Q: 如何减小编译后的库大小?

A: 使用"最小版"预设,或启用"小体积优化"选项。

🤝 贡献

欢迎提交Issue和Pull Request来改进这个项目。

📄 许可证

本项目采用MIT许可证,详见LICENSE文件。

🔗 相关链接


注意: 首次使用前请确保已正确安装和配置所有依赖环境。

收起阅读 »

限时0.1元!!!iOS、纯血鸿蒙、安卓 获取唯一ID(UUID) 和 iOS钥匙串、鸿蒙AssetStore资产存储

鸿蒙 iOS插件 iOS uts插件 鸿蒙next

# 限时促销:0.1元 (截止8月30日)。

https://ext.dcloud.net.cn/plugin?name=aper-keychainmanager
iOSKeyChain(苹果钥匙串)、鸿蒙AssetStoreKit(资产存储),卸载重装不丢失数据,可用于记录唯一ID、游客登录、用户名、密码
本插件为UTS插件,支持UniappX

包含以下功能:

  1. iOS KeyChain管理器(钥匙串) 读取、写入、删除
  2. 鸿蒙AssetStoreKit管理器(资产管理器) 读取、写入、删除
  3. 安卓、iOS、鸿蒙 唯一ID生成和存储(一般用于游客登录,或记住用户名、密码)

使用过程中如有 疑问 或 建议 或 新需求,欢迎进插件群交流,本插件持续更新中。。。

继续阅读 »

# 限时促销:0.1元 (截止8月30日)。

https://ext.dcloud.net.cn/plugin?name=aper-keychainmanager
iOSKeyChain(苹果钥匙串)、鸿蒙AssetStoreKit(资产存储),卸载重装不丢失数据,可用于记录唯一ID、游客登录、用户名、密码
本插件为UTS插件,支持UniappX

包含以下功能:

  1. iOS KeyChain管理器(钥匙串) 读取、写入、删除
  2. 鸿蒙AssetStoreKit管理器(资产管理器) 读取、写入、删除
  3. 安卓、iOS、鸿蒙 唯一ID生成和存储(一般用于游客登录,或记住用户名、密码)

使用过程中如有 疑问 或 建议 或 新需求,欢迎进插件群交流,本插件持续更新中。。。

收起阅读 »

建议没有强类型语言开发经验的“攻城狮”们不要轻易尝试uts

uts

建议没有强类型语言开发经验的“攻城狮”们不要轻易尝试uts,这都是教训啊,对于template部分,确实非常上手,在布局方面和css基本无异,即使出错也很容易解决,但是到了uts,基本写一行代码要半小时到好几个小时的时间,为什么会这样,我哭着告诉你们,太特么坑了,为了用uts开发程序,我还提前一个星期研究官方提供的文档,对数据类型要求的太严格,基本每一步都要规定数据类型,对于我这种写个十几年弱类型语言的开发者来说,每一步都是困难,浪费了七八天把app的界面都写出来了,在对接接口的时候,基本就是寸步难行啊,编译的时候你必须要掌握每种数据的类型,有的时候莫名的报错,数据类型搞不懂,书写习惯改不了,你进本连最简单的if语句都写不下去,因为会报错,没办法编译,为了能尽快把代码写下去,我写程序的时候deepseek、豆包、文心一言、通义千问必须打开,其实这些ai能解决的只是一部分少的简单的问题,在复杂的问题上面,你把所有代码都丢给它们,它们也不能帮你解决任何问题,因为ai也不能给你解决任何问题,唯一能参考的就是官方提供的uni-app x的demo。

切记切记,千万不要轻易尝试,要是抱着学习的态度去尝试是没有任何问题的,如果你想用uvue+uts开发正式项目,我劝你还是省省心吧,没有对强类型语言进行系统的学习,你连想都不要想了。

我开发半截的项目已经打算放弃了,还是改用vue和nvue吧,可怜我这端时间全部浪费了。哭死!!!!!!!

继续阅读 »

建议没有强类型语言开发经验的“攻城狮”们不要轻易尝试uts,这都是教训啊,对于template部分,确实非常上手,在布局方面和css基本无异,即使出错也很容易解决,但是到了uts,基本写一行代码要半小时到好几个小时的时间,为什么会这样,我哭着告诉你们,太特么坑了,为了用uts开发程序,我还提前一个星期研究官方提供的文档,对数据类型要求的太严格,基本每一步都要规定数据类型,对于我这种写个十几年弱类型语言的开发者来说,每一步都是困难,浪费了七八天把app的界面都写出来了,在对接接口的时候,基本就是寸步难行啊,编译的时候你必须要掌握每种数据的类型,有的时候莫名的报错,数据类型搞不懂,书写习惯改不了,你进本连最简单的if语句都写不下去,因为会报错,没办法编译,为了能尽快把代码写下去,我写程序的时候deepseek、豆包、文心一言、通义千问必须打开,其实这些ai能解决的只是一部分少的简单的问题,在复杂的问题上面,你把所有代码都丢给它们,它们也不能帮你解决任何问题,因为ai也不能给你解决任何问题,唯一能参考的就是官方提供的uni-app x的demo。

切记切记,千万不要轻易尝试,要是抱着学习的态度去尝试是没有任何问题的,如果你想用uvue+uts开发正式项目,我劝你还是省省心吧,没有对强类型语言进行系统的学习,你连想都不要想了。

我开发半截的项目已经打算放弃了,还是改用vue和nvue吧,可怜我这端时间全部浪费了。哭死!!!!!!!

收起阅读 »

Shiply Android应用内升级:灵活高效的版本发布解决方案

Shiply Android应用内升级功能为开发者提供了一套完整的版本发布管理工具,支持灰度放量和立即全量等发布模式,帮助开发者在确保应用稳定性的同时,高效完成新版本推送。

核心功能亮点

灰度发布能力

  • 精准控制:逐步向部分用户推送新版本,降低发布风险
  • 智能匹配:基于用户画像、设备特征等维度进行精准下发
  • 实时监控:关键指标动态追踪,确保发布过程可控

全量升级支持

  • 一键推送:快速完成全量用户版本覆盖
  • 强制更新:确保关键版本及时渗透
  • 版本追溯:完整记录发布历史,支持快速排查定位问题

插件地址:https://ext.dcloud.net.cn/plugin?id=21913

继续阅读 »

Shiply Android应用内升级功能为开发者提供了一套完整的版本发布管理工具,支持灰度放量和立即全量等发布模式,帮助开发者在确保应用稳定性的同时,高效完成新版本推送。

核心功能亮点

灰度发布能力

  • 精准控制:逐步向部分用户推送新版本,降低发布风险
  • 智能匹配:基于用户画像、设备特征等维度进行精准下发
  • 实时监控:关键指标动态追踪,确保发布过程可控

全量升级支持

  • 一键推送:快速完成全量用户版本覆盖
  • 强制更新:确保关键版本及时渗透
  • 版本追溯:完整记录发布历史,支持快速排查定位问题

插件地址:https://ext.dcloud.net.cn/plugin?id=21913

收起阅读 »

Uniapp cli项目引用UTS插件(基于uniapp x)的一些异常问题

uniapp插件 uniapp x uts插件

1.[plugin:uni:uts-uni_modules] compiler.compile is not a function

2.createUniXKotlinCompilerOnce is not a function

3.Definite Assignment Assertions is not supported.

我当前的环境:
HBuilderX版本:4.24
cli 的@dcloudio/uni-app版本: 3.0.0-4020420240722002

首先检查package.json中的@dcloudio/uni-uts-v1是否和别的@dcloudio/uni-xxx版本不一致,需要保持一致
如果有异常就执行下hx 菜单栏 -> 工具 -> 插件安装 -> 卸载重装uni-app(vue3),最好是让hx自动触发重新下载
上面的执行后还有问题可以尝试把uts相关的都删除重新安装一次,感觉像是有安装顺序的问题,我全部删除重新安装后就没问题了,不知道是啥原因造成的

#package.json的部分配置    
"devDependencies": {  
    "@dcloudio/types": "3.4.8",  
    "@dcloudio/uni-automator": "3.0.0-4020420240722002",  
    "@dcloudio/uni-cli-shared": "3.0.0-4020420240722002",  
    "@dcloudio/uni-stacktracey": "3.0.0-4020420240722002",  
    ###这个需要和其他的保持一样  
    "@dcloudio/uni-uts-v1": "3.0.0-4020420240722002",  
    ###  
    "@dcloudio/vite-plugin-uni": "3.0.0-4020420240722002",  
   ...  
  },

https://ask.dcloud.net.cn/question/195186
https://ask.dcloud.net.cn/question/202241

继续阅读 »

1.[plugin:uni:uts-uni_modules] compiler.compile is not a function

2.createUniXKotlinCompilerOnce is not a function

3.Definite Assignment Assertions is not supported.

我当前的环境:
HBuilderX版本:4.24
cli 的@dcloudio/uni-app版本: 3.0.0-4020420240722002

首先检查package.json中的@dcloudio/uni-uts-v1是否和别的@dcloudio/uni-xxx版本不一致,需要保持一致
如果有异常就执行下hx 菜单栏 -> 工具 -> 插件安装 -> 卸载重装uni-app(vue3),最好是让hx自动触发重新下载
上面的执行后还有问题可以尝试把uts相关的都删除重新安装一次,感觉像是有安装顺序的问题,我全部删除重新安装后就没问题了,不知道是啥原因造成的

#package.json的部分配置    
"devDependencies": {  
    "@dcloudio/types": "3.4.8",  
    "@dcloudio/uni-automator": "3.0.0-4020420240722002",  
    "@dcloudio/uni-cli-shared": "3.0.0-4020420240722002",  
    "@dcloudio/uni-stacktracey": "3.0.0-4020420240722002",  
    ###这个需要和其他的保持一样  
    "@dcloudio/uni-uts-v1": "3.0.0-4020420240722002",  
    ###  
    "@dcloudio/vite-plugin-uni": "3.0.0-4020420240722002",  
   ...  
  },

https://ask.dcloud.net.cn/question/195186
https://ask.dcloud.net.cn/question/202241

收起阅读 »

uts组件插件 使用this.$emit 时提示 fireEvent must be called by main thread

要在 emit 触发的外层使用
UTSAndroid.getDispatcher("main").async(function (_) {

}, null)
包括(必须在第一层)

UTSAndroid.getDispatcher("main").async(function (_) {  
    this.$emit('disconnectCallBack')  
}, null)
继续阅读 »

要在 emit 触发的外层使用
UTSAndroid.getDispatcher("main").async(function (_) {

}, null)
包括(必须在第一层)

UTSAndroid.getDispatcher("main").async(function (_) {  
    this.$emit('disconnectCallBack')  
}, null)
收起阅读 »

uts与uniapp踩坑集锦

uniapp uts

自定义类型永远不要直接定义在函数声明中,特别是长一点的自定义类型。类型定义要设置在专门的声明文件中
类implements接口编辑器自动补全的代码,只留下函数名,(),{},这三个东西就行,其他的删掉自己写。记得 public和override这两个修饰符
uts暴露给js的函数的参数,参数类型不要设置成复杂的嵌套,uniapp1.0下会有问题。
uts传递数组,使用Array接受,元素类型后续再转化
uts export * from “...”再导出类,在js环境调用时报错
uts类没有重载函数能力,可让函数参数的类型为一个对象(UTSJSONOBJECT 或 types),对象属性可为空来规避。亦可直接写2个不同名的函数
uni.navigateBack函数,在网页中,刷新页面,页面堆栈会被清空,这时使用该api只会不停relauch页面,你会发现此时与log一起使用的话,log不见了,灵异事件,不好调试代码,不建议在网页应用中使用该api。相关源码如下

// 真正的h5平台源码,此时 浏览器没有“上一页”可返回,所以浏览器的行为是:刷新当前页面(而不是跳转)  
getApp().$router.go(-args.delta);  

//  \uni-app\packages\uni-app-plus\src\service\api\route\navigateBack.ts,app-plus平台相关源码,可以辅助理解,reLaunchEntryPage这句导致的relauch,api就是选择了原地刷新页面  
else if (isDirectPage(page)) {  
      reLaunchEntryPage()  
  }
继续阅读 »

自定义类型永远不要直接定义在函数声明中,特别是长一点的自定义类型。类型定义要设置在专门的声明文件中
类implements接口编辑器自动补全的代码,只留下函数名,(),{},这三个东西就行,其他的删掉自己写。记得 public和override这两个修饰符
uts暴露给js的函数的参数,参数类型不要设置成复杂的嵌套,uniapp1.0下会有问题。
uts传递数组,使用Array接受,元素类型后续再转化
uts export * from “...”再导出类,在js环境调用时报错
uts类没有重载函数能力,可让函数参数的类型为一个对象(UTSJSONOBJECT 或 types),对象属性可为空来规避。亦可直接写2个不同名的函数
uni.navigateBack函数,在网页中,刷新页面,页面堆栈会被清空,这时使用该api只会不停relauch页面,你会发现此时与log一起使用的话,log不见了,灵异事件,不好调试代码,不建议在网页应用中使用该api。相关源码如下

// 真正的h5平台源码,此时 浏览器没有“上一页”可返回,所以浏览器的行为是:刷新当前页面(而不是跳转)  
getApp().$router.go(-args.delta);  

//  \uni-app\packages\uni-app-plus\src\service\api\route\navigateBack.ts,app-plus平台相关源码,可以辅助理解,reLaunchEntryPage这句导致的relauch,api就是选择了原地刷新页面  
else if (isDirectPage(page)) {  
      reLaunchEntryPage()  
  }
收起阅读 »