-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
用 CMake 为 ijkplayer 增加 android native debug 支持 #5
Comments
ijkplayer 简介ijkplayer 是由 B 站开源的一款移动端播放器。基于 ffmpeg 中 ffplay 开发,并添加 android MediaCodec、iOS VideotTolbox 视频硬解码支持以及 opengles、NativeWindow(android) 渲染,在当前的移动直播热潮中,被大量使用。 只要不是修改 ffmpeg 的源代码,其它内容包括 ijkplayer 的 c 代码修改, java 层修改,都可以在 android studio 中一键运行、调试。 关于 ijkplayer 内部核心代码的分析,多个线程的工作内容,解码部分,音视频同步控制等部分的更深入的介绍,可以参考金山云视频的分析文章 https://www.jianshu.com/p/daf0a61cc1e0 , 我最开始也是从这一篇文章入手逐渐读懂 ijkplayer 源代码的。 题外话:ijkplayer 在 github 上的提交记录自 k0.8.8 版本之后就再也没有了,好多人评论说项目已经放弃维护了,但是细心寻找会发现在另一个项目 Bilibili/ffmpeg 中,还不断有提交记录。说明项目还是在不断开发,只是重心放在实现新的 ffmpeg protocol 上,没有及时维护 ijkplayer 项目上的 issues。 下面具体说说一些具体的修改内容。 |
android 工程结构调整ijkplayer 的项目本身具有多个 android module。
项目中为不同的 cpu 架构都单独设置了 module,这几个 module 最大的区别就是在 Application.mk 中 这种 module 确实方便采用 ndk-build 工具的项目管理,但是我在使用过程中还是觉得有些不太方便之处:
对于问题1,我找到的解决方案是:
在工程根 build.gradle 中增加这样的配置,并执行 对于问题2,我当然是用 cmake 解决了,新建一个 module, 取名 fijkplayer-full。换个名字方便和原项目进行区分,同时 f 也表示
修改后,fijkplayer-full 就成了 "六神合体" 了。 对于不同cpu 架构区分不同的 minSdkVersion 可以通过 productFlavors 实现,这一块我还没有具体考虑充分,目前是统一设置了大家用得最多的 minSdkVersion 16。 此部分修改的完整内容点我查看, github.com/befovy/ijkplayer |
CMakeLists.txt编写 CMakeLists.txt 完全是个翻译工作,将 Android.mk 中的规则翻译过来就行。完成后通过 CMake 方式最终生成的 aar 和原始方式生成的aar 文件大小几乎没什么差别,见下图。 转到 CMake 工具链的过程还遇到下面几个问题。 libffmpeg.so 找不到 libffmpeg.so 是事先通过 shell 命令编译成的,在 ffmpeg build 文件夹中,并且几乎不会改变,除非是要修改 ffmpeg。
引入预编译好的 ijkffmpeg,在编译 ijkplayer 的过程可以顺利完成链接。但是打包运行找不到 libijkffmpeg.so。分析最终的 apk 以及 fijkplayer-full.aar ,发现其中都没有 libijkffmpeg.so 文件,所以是打包 aar 的时候没有将这个文件打包进去。查看工程目录结构,发现编译好的 libijkplayer.so 和 libijksdl.so 都在文件夹
没有找到一条命令能够解决的,所以麻烦了一点多写了点,用两个cmake 命令解决。 cpufeatures 编译出错 原项目中用到了 ndk 中的 cpufeatures,我在 CMake 文件中也引入并编译了 cpufeatures,但在编译 x86 以及 x86_64 架构的时候却出现了编译错误,具体是一处未识别的汇编指令。 static __inline__ void x86_cpuid(int func, int values[4])
{
int a, b, c, d;
/* We need to preserve ebx since we're compiling PIC code */
/* this means we can't use "=b" for the second output register */
__asm__ __volatile__ ( \
"push %%ebx"
"cpuid\n" \
"mov %%ebx, %1\n"
"pop %%ebx\n"
: "=a" (a), "=r" (b), "=c" (c), "=d" (d) \
: "a" (func) \
);
values[0] = a;
values[1] = b;
values[2] = c;
values[3] = d;
} 意外的是我最终发现 ijkplayer 项目中没有用到 cpufeatures 的地方,可能是 gpl 协议的 android-ndk-profiler 部分用了吧,但项目中默认使用了一个假的 android-ndk-profiler,此部分没有去深究,性能分析使用 simpleperf 就足够了。 此部分 CMakeLists.txt 的完整内容请看 |
结束语😄 附一张 NDK 断点调试的大图 👏 刚开始写博客,可能有些啰嗦,多多包涵。或是没有说明白的地方,请大方的前往原始地址进行评论。 最近对 Flutter 产生了兴趣,并打算用 ijkplayer 开发一个 Flutter 的播放器 Plugin, 祝我早日完成。 |
我下载了你的源码 重新编译后,能跑起来但是还是不能debug,请问是什么情况? |
给 ijkplayer 增加了 cmake 构建方式,支持在 android studio 中进行 c 代码断点调试。
直接上手请前往 https://github.com/befovy/ijkplayer#build-android-via-cmake
如果想了解一下整个过程请继续阅读本文。
The text was updated successfully, but these errors were encountered: