淮安建设网站,有没有做网站的电话,h5小游戏制作教程,网站运营费用系列文章目录
基于 FFmpeg 的跨平台视频播放器简明教程#xff08;一#xff09;#xff1a;FFMPEG Conan 环境集成基于 FFmpeg 的跨平台视频播放器简明教程#xff08;二#xff09;#xff1a;基础知识和解封装#xff08;demux#xff09;基于 FFmpeg 的跨平台视频…系列文章目录
基于 FFmpeg 的跨平台视频播放器简明教程一FFMPEG Conan 环境集成基于 FFmpeg 的跨平台视频播放器简明教程二基础知识和解封装demux基于 FFmpeg 的跨平台视频播放器简明教程三视频解码基于 FFmpeg 的跨平台视频播放器简明教程四像素格式与格式转换基于 FFmpeg 的跨平台视频播放器简明教程五使用 SDL 播放视频基于 FFmpeg 的跨平台视频播放器简明教程六使用 SDL 播放音频和视频基于 FFmpeg 的跨平台视频播放器简明教程七使用多线程解码视频和音频基于 FFmpeg 的跨平台视频播放器简明教程八音画同步基于 FFmpeg 的跨平台视频播放器简明教程九Seek 策略
前言
在前九章的学习中我们已经成功地实现了一个基础的播放器它拥有视频播放、音画同步、快进/快退等基本功能。当然这个简易的示例还有许多可以优化的地方比如添加更美观的用户界面或者增加字幕功能等。然而这并不是本教程的主要关注点。本系列文章更关注于跨平台播放器框架的构建特别是在移动端。因此从本章开始我们将把重点转向 Android 端播放器的开发。
前置知识包括一些 Android 的基本开发以及 JNI 开发等。这些前置知识默认你有所了解本文不会涉及。关于 JNI 可以参考笔者之前写的 JNI 简明教程之手把手教你入门
本文代码在 android/tutorial01。
FFmpeg Android 编译
FFmpeg 的跨端编译也是老生常谈的话题了本文不去讨论那些细节问题只想提供一种最便捷的编译方法。在 CompilationGuide/Android 中给出了一些指导意见例如直接使用已经编译好的 so或者使用别人写好的脚本。对比了这几个方法ffmpeg-android-maker 比较合适优势包括
网上那些已经编译好的 ffmpeg soffmepg 版本可能太老了。ffmpeg-android-maker 则是从源码直接编译ffmpeg-android-maker 能够自动拉取 ffmpeg 源码只需要设置少量的变量就能开始编译ffmpeg-android-maker 功能、文档写的比较清楚用起来没有卡点。
那么基于 ffmpeg-android-maker 要如何编译 android ffmpeg 呢非常简单步骤如下。
下载 ffmpeg-android-marker 仓库
git clone gitgithub.com:Javernaut/ffmpeg-android-maker.git
cd ffmpeg-android-maker设置环境变量
export ANDROID_SDK_HOME/Users/user/Library/Android/sdk
export ANDROID_NDK_HOME/Users/user/Library/Android/sdk/ndk/25.2.9519653运行脚本
./ffmpeg-android-maker.sh编译成功后你可以在当前文件夹的 build 目录下找到各个架构的 ffmpeg 库
build
└── ffmpeg├── arm64-v8a│ ├── bin│ ├── include│ ├── lib│ └── share├── armeabi-v7a│ ├── bin│ ├── include│ ├── lib│ └── share├── x86│ ├── bin│ ├── include│ ├── lib│ └── share└── x86_64├── bin├── include├── lib└── share其中 include 和 lib 是我们需要的。
FFmpeg so 导入 Android 项目
将 so 文件放置在正确的位置
第一步当然是将编译好的 ffmpeg so 文件和头文件拷贝到我们的项目中。在编译产物中我们只需要 include 和 lib 文件夹即可将它们拷贝至 3rdparty/ffmpeg/android 目录下。当然你也可以选择其他地方这只是我个人的选择。
android
├── arm64-v8a
│ ├── include
│ └── lib
├── armeabi-v7a
│ ├── include
│ └── lib
├── x86
│ ├── include
│ └── lib
└── x86_64├── include└── lib写 CMake 将 FFmpeg so 引入项目
ffmpeg 有多个 so 文件在编译项目的过程中如果一个一个地去写 link 命令有点麻烦。通常的做法是创建一个新的 library例如叫 ffmpeg_libs让 ffmpeg_libs 去 link 这些 so 文件然后其他模块 link ffmpeg_libs 就能够链式地将所有依赖都带上了。
这部分属于 CMake 的知识范畴不细说了可以参考笔者之前写的 现代 CMake 简明教程一- CMake 基础。具体 CMake 源码在 CMakeLists.txt 大家自己看。
写 Kotlin 和 JNI 调用 FFmpeg API
Android app 想要调用 C/C 的接口就必须通过 JNI 接口来实现。首先在应用层定义一个 native method 叫 stringFromFFMPEG
external fun stringFromFFMPEG(): String接着定义 JNI 层接口新建 src/cpp/native-lib.cpp 文件并完成 JNI 层代码
#include jni.h
#include string
extern C
{
#include libavutil/avutil.h
}extern C JNIEXPORT jstring JNICALL
Java_com_test_tutorial01_MainActivity_stringFromFFMPEG(JNIEnv* env,jobject /* this */) {std::string hello Hello from ffmpeg: std::string(av_version_info());return env-NewStringUTF(hello.c_str());
}最后我们将 UI 上的 TextView 中的字符串内容修改为这个函数的返回值即可
binding.sampleText.text stringFromFFMPEG()最终呈现的效果如下图
总结
本文介绍了一种非常便捷的编译 android ffmpeg 的方法ffmpeg-android-maker。说明如何将 ffmpeg so 库导入至 android 项目中并提供了实例代码代码地址这里
参考
JNI 简明教程之手把手教你入门CompilationGuide/Android现代 CMake 简明教程一- CMake 基础