在系列一中讲述了如何编译FFmpeg的源码,现在就在Android项目中引入我们编译出来的库,并实现播放一个在线视频的功能

新建Android工程

新建一个支持ndk的Android工程,在AS中新建工程就不再详述了,详细的新建ndk工程,可以参考AndroidStudio中使用JNI/NDK示例 需要注意的一点就是在新建导航中注意勾选Support C++这个选项,这样新建的Android工程就会有CMakeLists等进行NDK编译时必要的东东了。

修改gradle配置

新建的Android工程需要对项目中的app/build.gradle做一些修改,其中主要修改的地方如下:

android {……defaultConfig {……externalNativeBuild {// -Wno-deprecated-declarations 添加这个保证编译出的很多文件不再报错cmake {cppFlags "-frtti -fexceptions -Wno-deprecated-declarations"cFlags "-DSTDC_HEADERS"}}ndk { // 声明编译的架构类型,指定为armeabi-v7a即可abiFilters "armeabi-v7a"}}externalNativeBuild {cmake { // 配置我们自己的CMakeLists文件path file('CMakeLists.txt')}}sourceSets {main {// 指定存放native代码的目录,这里指定为jni和cpp皆可jni.srcDirs = ['src/main/jni', 'src/main/cpp/'] // 指定jni库的存放目录为libsjniLibs.srcDirs = ['libs'] }}
}
复制代码

上面配置需要特别说明的一点是,在cmake配置中的cppFlags务必添加-Wno-deprecated-declarations,这样确保我们能使用一些过期的接口。另外在后面导入FFmpeg编译生成的代码到AS中会有很多标红,添加了这个配置属性后,各种讨厌的标红就去无踪了?。

导入FFmpeg代码和库文件

导入之前,先在我们工程中的app/下新建libs文件夹,然后继续在libs下新建armeabi-v7a和include两个文件夹

此外再在src/main/中新建jni文件 接着进入我们之前编译好的FFmpeg文件目录中

  1. 将include下的文件全部拷贝到刚才新建的libs/include中
  2. 将lib下的几个so文件全部拷贝到刚才新建的libs/armeabi-v7a中

编写native代码使用FFmpeg

我们编写一个NDK的桥接类NDKBridge,并在其中定义我们自己的native库:
NDKBridge.java

public class NDKBridge {static {// 自定义的native库System.loadLibrary("ndk_test_jni");}……
}
复制代码

定义一个简单的播放器类FFVideoPlayer,并在其中声明一个名为render的native方法:
FFVideoPlayer.java

public class FFVideoPlayer extends SurfaceView {……public void play(final String url) {new Thread(new Runnable() {@Overridepublic void run() {render(url, FFVideoPlayer.this.getHolder().getSurface());}}).start();}//  播放器渲染的方法,需要在native层中实现public native void render(String url, Surface surface);
}
复制代码

此时我们还没有配置CMakeLists文件,也没有新建任何native代码,所以上面声明的native方法是会标红报错的

配置CMakeLists

配置CMakeLists文件,指定我们的native代码入口,并指定编译成的native库,以及引用的哪些native代码。下面列出一些需要注意的点,详细内容可以到项目工程中查看

# 添加库——自己编写的库
# 库名称:ndk_test_jni
# 库类型:SHARED,表示动态库,后缀为.so(如果是STATIC,则表示静态库,后缀为.a)
# 库源码文件:src/main/jni/ndk_test_jni.cpp
add_library(ndk_test_jniSHAREDsrc/main/jni/ndk_test_jni.cpp)……
# 引入头文件,否则无法在ndk_test_jni.cpp中导入FFmpeg编译出的源文件
include_directories(libs/include)
复制代码

暂时先别执行syc操作,因为都没有ndk_test_jni.cpp文件,肯定会失败!

编写native代码

根据CMakeLists中的配置,我们需要在工程的src/main/jni中新建一个ndk_test_jni.cpp文件,然后再执行syc操作。
到上面声明native方法的地方,此时应该还是标红报错。用鼠标点击右边标红的地方,使错误处于选中状态,然后点击ALT+Enter快捷键,此时AS会弹出创建需要的native方法,点击确认后就会自动在我们的ndk_test_jni.cpp中新建一个空的Java_cain_tencent_com_androidexercisedemo_ffmpeg_FFVideoPlayer_render方法,这就是我们在java层声明的native方法的实现。然后就可以愉快地到ndk_test_jni.cpp中去尽情发挥,实现各个native方法了。
具体的代码这里就不贴出来了,具体的可以到项目查看,当中注释也写得很明朗了。这里需要注意的一点就是我们需要将各个native方法包裹在extern "C" {}中

extern "C" {
#include <cstdio>
#include "lame/lame.h"
//封装格式处理
#include <libavformat/avformat.h>
#include <android/native_window_jni.h>
#include <libavfilter/avfilter.h>
#include <libavcodec/avcodec.h>
//封装格式处理
#include <libavformat/avformat.h>
//像素处理
#include <libswscale/swscale.h>
#include <unistd.h>
/*** 解码视频播,渲染播放*/
extern "C"
JNIEXPORT void JNICALL
Java_cain_tencent_com_androidexercisedemo_ffmpeg_FFVideoPlayer_render(JNIEnv *env, jobject instance,jstring url_,jobject surface) {……
}
}
复制代码

否则在编译时会报各种unresolved错误
这里需要播放在线视频,因此也需要记得申请联网权限

附录

项目地址

参考

AndroidStudio中使用JNI/NDK示例
在Mac上编译移植FFmpeg-4.0.3到Android平台

转载于:https://juejin.im/post/5caef710e51d456e831f68dc

FFmpeg系列(二)-Android项目引入FFmpeg库播放视频相关推荐

  1. 【Android FFMPEG 开发】Android 中使用 FFMPEG 对 MP3 文件进行混音操作

    文章目录 一.前置操作 ( 移植 FFMPEG ) 二.FFMPEG 混音命令 三.Android FFMPEG 混音源代码完整示例 四.博客源码 一.前置操作 ( 移植 FFMPEG ) 参考 [A ...

  2. 【Android FFMPEG 开发】Android 中使用 FFMPEG 将 PCM 音频采样转为 MP3 格式

    文章目录 一.前置操作 ( 移植 FFMPEG ) 二.FFMPEG 将 PCM 采样转为 MP3 格式的命令 三.Android FFMPEG 混音源代码完整示例 四.博客源码 一.前置操作 ( 移 ...

  3. Swift项目引入第三方库的方法

     分类: iOS(55)  目录(?)[+] Swift项目引入第三方库的方法 转自 http://blog.shiqichan.com/How-To-Import-3rd-Lib-Into-Swif ...

  4. Android 使用腾讯sdk播放视频

    Android 使用腾讯sdk播放视频 1.下载官方sdk 点击下载 拿到需要使用到的文件 将文件放在指定的位置 如何在build.gradle文件输入下面的代码导入jar包 implementati ...

  5. Android Studio项目引入外部库注意事项(PullToRefresh)

    Android Studio开发App项目时引入第三方库是个比较麻烦的事情.之前导入Volley就折腾了好久,导入下拉刷新控件PullToRefresh时又碰到了各种问题.在此记录一下,以便查阅. 一 ...

  6. 【Android FFMPEG 开发】Android 中执行 FFMPEG 指令 ( 集成 FFmpegAndroid 框架 )

    文章目录 一.推荐开源项目 二.Android 中执行 FFMPEG 指令 1.导入依赖 2.Java 代码编写 3.使用时的代码示例 三.博客资源 一.推荐开源项目 最近需要在 Android 中进 ...

  7. 【Android FFMPEG 开发】Android 中执行 FFMPEG 指令 ( 集成 mobile-ffmpeg 框架 | 完整代码示例 )

    文章目录 一.配置远程 Maven 仓库 二.配置依赖 三.Kotlin 中执行 FFmpeg 命令 四.FFmpeg 命令执行结果查看 五.源码下载 一.配置远程 Maven 仓库 在 Androi ...

  8. [Android系列—] 2. Android 项目目录结构与用户界面的创建

    前言 在 [Android系列-] 1. Android 开发环境搭建与Hello World 这一篇中介绍了如何快速搭建Android开发环境, 并成功了建立一个没有任何代码更改的 Android ...

  9. android 引入 .so,android studio引入so库方法(示例代码)

    在Android Studio中引入so库,只需在app/jniLibs下放入so文件,然后在Module的build.gradle中加入: sourceSets { main { jniLibs.s ...

最新文章

  1. 【读书笔记】知易行难,多实践
  2. python爬虫实现网页采集器
  3. DotNetBar office2007效果
  4. C++:41---覆盖和隐藏
  5. java ssl 无证书_java – 如何修复SSL – 没有可用的证书
  6. Css+Div设置电脑端显示,手机端不显示代码
  7. Java语言Socket接口用法详解
  8. 红橙Darren视频笔记 反射注解泛型简介
  9. 大数据学习资源(上)
  10. .NET破解之谷歌地图下载助手-睿智版
  11. 运营书籍:从零开始做
  12. Python Pitfall: 时间戳长度- 10位和13位时间戳
  13. Trinity转录组无参组装
  14. 盘点OLED显示技术的几大优势
  15. web前端学习1-45集
  16. PHP的bz2压缩扩展工具
  17. MySQL 1366错误
  18. 情人节表白代码 静态网页表白
  19. Processing编程学习指南2.4 速写本
  20. 个人博客(一)之表结构设计

热门文章

  1. Java8-2-Lambda表达式实战-一句话实现Map中按照Value排序
  2. (转)Fabric 1.0 读写集
  3. java 通过eclipse编辑器用mysql尝试 连接数据库
  4. 洛谷 P1004 方格取数 WD
  5. mvc图片上传到服务器
  6. ASP.NET Web API 提升性能的方法实践
  7. hibernate的查询方式
  8. Visual C++ 2011-5-18
  9. boost的编译和使用(window下)
  10. stl之queue队列容器