SDL(Simple Directmedia Layer)是一套开源的跨平台多媒体开发库,集成了音视频的许多底层的API,介绍Windows平台下的例子已经很多了,例如:雷老师的 最简单的视音频播放示例7:SDL2播放RGB/YUV,既然SDL是跨平台的,自己有参考了雷老师的这篇文章 最简单的基于FFmpeg的移动端例子附件:SDL Android HelloWorld,下面将介绍下Android平台上播放视频的简单的例子
SDL结构框图
SDL4Android中接口都是使用c语言写的,接口调用使用的是java,android调用c的接口需要用到jni(java native interface)技术,需要先将c接口编译成共享库.so
文件,目前可以使用两种工具进行编译:ndk和cmake(android-studio2.2以后的版本才支持cmake编译),下面的框图显示的是使用ndk工具编译SDL的接口:
SDL的文件源码主要分为两部分,一部分是java代码,主要包含有Android上层使用的SDLActivity上层接口调用函数;另一部分就是SDL-jni,包含所有SDL底层的源码、自定义的接口源码以及将这些源码编译成共享库所需的Android.mk文件。
如图中所示,SDL_android.c
和SDL_android_mian.c
是官方demo中编译官方接口的c源文件,其中SDL_android.c
编译21个接口放在libSDL2.so
共享库中;在此次使用SDL播放视频的Demo中,SDL_android_mian.c
配合我们自定义的Custom.c
(可以定义多个或者一个文件)只编译一个nativeInit()
接口放在libmain.so
共享库中
下载SDL源码
SDL的介绍就不多说了,详细可以访问SDL官方网站,推荐一个中文学习网站SDL中文教程,但是里面的API版本是1.2的,可以了解一下,还有就是外文的教程网站Lazy Foo,利用SDL播放视频,推荐访问CSDN雷老师的博客。
截至2017年2月,SDL版本已经更新到2.05,点击官方下载地址
github上也可以下载github下载地址
在android工程中我需要用到的源码,android-project、include、src三个文件夹
android-project中主要是官方的demo:jni文件夹中需要配置.mk
编译文件,src文件夹中包含官方的android上层java代码;
include和src中就是SDL的底层C代码,编译之后方可被上层java调用。
合并ffmpeg和SDL源码
因为我们解码用到的是ffmepg,所以此次还要集成ffmpeg的源码,不了解ffmpeg的移植的话,可以查看我前面写的文章:第一次完成FFmepg的移植,编译ffmpeg4Android
为了减少代码的层级,我把SDL的源码和FFmepg的源码混合了在一起了
调用c函数的流程
SDL打开视频播放的过程实际上是创建一个SDLActivity
的过程,SDLActivity
会创建一个SDLSurface
和一个layout布局,然后将SDLSurface
添加到布局上面,视频画面就是在SDLSurface
上显示出来,正如上图中,SDLSurface
要调用nativeInit函数,必须先通过JNI实现图像解码显示功能
我们对nativeInit
函数稍作修改,在SDLActivity
中把视频的URI传给nativeInt
函数,
SDLActivity.java
声明中,
SDL_android_main.c
中,
编写C源文件实现
先看下FFmpeg的解码和SDL的显示流程:
编写Android.mk文件
先新建一个自定义的c源文件convexd_native_render.c
,我们的视频的解码和显示都会在这里面实现。
此工程中的Android.mk
文件在移植ffmepg的Android.mk
文件的基础上增加了编译libSDL2main.so
和libSDL2.so
的配置,如下:
可以根据自己的路径配置mk文件
配置build.gradle
|
|
实现播放
在手机根目录下新建一个convexd
的文件夹,把播放视频放进去,打开我们打包的demo,选择视频就可以实现视频的播放功能。