尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
交叉编译ffmpeg后只需要几十行jni代码-----直接用命令行调用ffmpeg
不能是so库需要去掉这行--disable‑ffmpeg 生成可执行文件然后用这个文件就可以了--------------------------------------------------调用 ffmpeg 命令行模式JNI 代码确实极少原理你交叉编译出来完整的ffmpeg可执行文件binary 程序不是 so 库放到 Android app 的私有目录然后 JNI 层用fork/execvp执行这个二进制就像 Linux 终端跑ffmpeg -i xxx.mp4 ...。✅ 这时不需要调用任何 ffmpeg 的 C API不用avformat_open_input那一堆接口。 JNI 只做一件事启动子进程执行 ffmpeg 二进制命令拿到输出、返回码。JNI 代码就几十行。⚠️ 重要区分两种模式链接 libavformat/libavcodec.so库模式JNI 调用 FFmpeg C 函数胶水代码多适合实时处理、内存中处理。执行 ffmpeg 命令行二进制exec 子进程JNI 只负责起进程传命令参数代码极少适合文件转码、剪辑。1. 编译出 ffmpeg 可执行程序不是只编译 so修改你的 configure 脚本不要关闭 ffmpeg 程序# 去掉这两行 # --disable-ffmpeg \ # --disable-ffplay \ # --disable-ffprobe \保留--enable-shared --enable-static编译完 prefix 目录下bin/ffmpeg→ Android 平台可执行二进制文件lib/*.so→ ffmpeg 依赖库ffmpeg 二进制运行依赖这些 soffmpeg 这个 bin 程序运行时需要同版本的 libav*.so缺一不可。2. JNI 少量 C 代码执行 ffmpeg 命令纯 C几十行#include jni.h #include stdio.h #include unistd.h #include sys/wait.h #include android/log.h #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,FFMPEG_EXEC,__VA_ARGS__) extern C JNIEXPORT jint JNICALL Java_com_xxx_FfmpegExecutor_runFfmpeg(JNIEnv *env, jobject thiz, jstring binPath, jobjectArray args) { const char* bin (*env)-GetStringUTFChars(env, binPath, NULL); //把java字符串数组转char*[] int argCount (*env)-GetArrayLength(env, args); char** argv malloc(sizeof(char*) * (argCount 1)); for(int i0;iargCount;i){ jstring str (jstring)(*env)-GetObjectArrayElement(env, args, i); argv[i] (char*)(*env)-GetStringUTFChars(env, str, NULL); } argv[argCount] NULL; pid_t pid fork(); int ret -1; if(pid 0){ //子进程执行ffmpeg execvp(bin, argv); //execvp返回说明出错 LOGD(execvp failed); _exit(127); }else if(pid0){ int status; waitpid(pid, status, 0); ret WIFEXITED(status) ? WEXITSTATUS(status) : -1; } //释放内存 for(int i0;iargCount;i){ jstring str (jstring)(*env)-GetObjectArrayElement(env, args, i); (*env)-ReleaseStringUTFChars(env, str, argv[i]); } free(argv); (*env)-ReleaseStringUTFChars(env, binPath, bin); return ret; }JNI 就这么多没有任何 ffmpeg 头文件Java 层调用public class FfmpegExecutor { static { System.loadLibrary(native-lib); } // 返回ffmpeg进程退出码0代表成功 public native int runFfmpeg(String ffmpegBinPath, String[] cmdArgs); }使用示例// 把assets里面的ffmpeg二进制复制到app私有目录 /data/data/包名/files/ffmpeg String bin getFilesDir().getAbsolutePath()/ffmpeg; String[] cmd { bin, -i,inputPath, -vcodec,copy, outputPath, -y }; int exitCode new FfmpegExecutor().runFfmpeg(bin, cmd);关键坑点Android 上 exec ffmpeg 二进制ffmpeg 二进制需要执行权限复制到 files 目录后必须new File(binPath).setExecutable(true);ffmpeg bin 运行依赖 libav*.soso 要放在同目录或者配置 LD_LIBRARY_PATH子进程的环境变量要设置否则会报cannot find libavcodec.so在 fork 之后 execvp 之前设置环境变量setenv(LD_LIBRARY_PATH, /data/data/xxx/files, 1);Android 10 存储权限只能访问 app 私有目录不能直接访问外部存储需要文件拷贝。不能在主线程调用ffmpeg 是阻塞子进程会卡死 UI必须放到子线程。包体积大完整 ffmpeg 二进制 so 会好几 MB可以 configure 裁剪。Android 14 新限制forkexec 依然可用但不要在 app 进程大量 fork 子进程。和库模式对比表格模式JNI 代码量特点调用 ffmpeg so 库C API多需要处理 AVFormatContext、内存、异常可以内存处理不写磁盘复杂度高exec 执行 ffmpeg 二进制很少几十行只做进程调用直接写命令行逻辑简单需要读写文件生成子进程mobile‑ffmpeg 底层本质就是这套方案内置 ffmpeg 二进制JNI 封装 execJava 传字符串命令。如果你需要我可以给完整可复制的 C 代码包含 LD_LIBRARY_PATH 设置、stdout/stderr 重定向拿到 ffmpeg 日志输出。
RELATED

相关推荐

构建GitHub热点追踪体系:从自动化监控到技术趋势洞察

构建GitHub热点追踪体系:从自动化监控到技术趋势洞察

如果你在技术圈待得够久,会发现一个有趣的现象:很多人把 GitHub 用成了“一次性工具”。需要某个库时,去搜一下,点开 README.md ,复制安装命令,然后……就没有然后了。项目主页的 Star 数、 Issue 里…

📅 2026/10/7 22:10:04
LiipFunctionalTestBundle是什么?Symfony功能测试助手的完整入门指南

LiipFunctionalTestBundle是什么?Symfony功能测试助手的完整入门指南

LiipFunctionalTestBundle是什么?Symfony功能测试助手的完整入门指南 【免费下载链接】LiipFunctionalTestBundle Some helper classes for writing functional tests in Symfony 项目地址: https://gitcode.com/gh_mirrors/li/LiipFunctionalTestBundle 如果…

📅 2026/10/17 12:59:55
SSR 认证最佳实践:Convex + Better Auth 在 Next.js 与 TanStack Start 中的服务端渲染攻略

SSR 认证最佳实践:Convex + Better Auth 在 Next.js 与 TanStack Start 中的服务端渲染攻略

SSR 认证最佳实践:Convex Better Auth 在 Next.js 与 TanStack Start 中的服务端渲染攻略 【免费下载链接】better-auth Convex Better Auth 🔥 项目地址: https://gitcode.com/gh_mirrors/con/better-auth 当用户请求到达服务端时,…

📅 2026/10/7 2:23:26
MORE NEWS

更多资讯

📰

Jump Server v2.1.0 实战部署与审计落地指南

简介:本资源是JumpServer开源堡垒机v2.1.0版本的官方兼容部署包,面向运维工程师、DevOps实践者及Linux系统管理员,用于快速构建企业级权限管控与审计平台。压缩包共3个文件(1个一键部署脚本quick_start.sh、1个源码归档tar.gz、1个…

📰

7天AI扫盲:从Token、RAG到Agent的认知地图

国庆7天,朋友圈大概分成两类人:一类在景区排队,一类抱着手机刷AI资讯。这两年的技术圈有个很明显的变化——AI不再是PPT里的概念名词,而是真的长进了开发链路。后端在学Agent,前端在玩AI绘画,测试在搞AI测试…

📰

知识图谱度中心性计算与应用实践

1. 知识图谱与度中心性基础解析知识图谱作为结构化语义网络,本质上是由实体(节点)和关系(边)组成的图数据结构。在这个网络中,度中心性(Degree Centrality)是最直观的节点重要性度量…

📰

Excel插件工具箱实战:批量操作与效率提升指南

Excel重度用户大概都有过这种体验:一张表里几百行数据,想批量删空行、想按颜色求和、想给每个工作表单独加水印、想把合并单元格拆开再填充——每一项单拎出来都不难,但真到动手的时候,要么写公式写到眼花,要么录宏录到…

📰

Linaro 2011.12交叉工具链:ARM嵌入式老设备ABI兼容实战指南

简介:本资源是面向嵌入式与Linux系统开发者的交叉编译工具链完整包,专为ARM等多架构平台定制,解决跨平台编译、32/64位混合环境构建及Linaro优化适配等核心问题。压缩包包含GCC 4.6.2编译器套件、GLIBC 2.13运行时库、Linaro增强补丁及multil…

📰

企业智能体落地实战:RAG检索、知识图谱与Function Calling工程化突破

1. 演示惊艳与上线崩溃之间的真实鸿沟做过企业级智能体项目的人,大概率都经历过这种落差:演示环境里,智能体对答如流,工具调用丝滑,知识问答准确率看着能到九成以上;一旦接入真实业务流量,回答开…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬