=====================================================

最简单的基于FFmpeg的移动端样例系列文章列表:

最简单的基于FFmpeg的移动端样例:Android HelloWorld

最简单的基于FFmpeg的移动端样例:Android 视频解码器

最简单的基于FFmpeg的移动端样例:Android 视频解码器-单个库版

最简单的基于FFmpeg的移动端样例:Android 推流器

最简单的基于FFmpeg的移动端样例:Android 视频转码器

最简单的基于FFmpeg的移动端样例附件:Android 自带播放器

最简单的基于FFmpeg的移动端样例附件:SDL Android HelloWorld

最简单的基于FFmpeg的移动端样例:IOS HelloWorld

最简单的基于FFmpeg的移动端样例:IOS 视频解码器

最简单的基于FFmpeg的移动端样例:IOS 推流器

最简单的基于FFmpeg的移动端样例:IOS 视频转码器

最简单的基于FFmpeg的移动端样例附件:IOS自带播放器

最简单的基于FFmpeg的移动端样例:Windows Phone HelloWorld

=====================================================

本文记录一个安卓平台下SDL的样例。

该样例读取并显示了一张BMP图片。通过该样例能够了解SDL在安卓平台下的使用。本文中使用的SDL版本号为2.0。

Android程序SDL2类库使用说明

简单记录一下Android程序使用SDL2类库的方法。这部分的信息能够參考SDL2源码文件夹中的README-android.txt文件。

SDL2使用的步骤能够分为下面步骤:

(1)配置Androidproject

a) 新建Androidproject

能够直接使用SDL2源码文件夹中的android-projectproject,也能够自己新建project。假设自己新建project,则须要拷贝android-projectproject中src文件夹下的SDLActivity.java文件。该文件里的SDLActivity定义比較长。眼下还没有研究过。

b) 拷贝SDL2源码
将SDL2源码文件夹中下列内容拷贝至Androidproject的jni文件夹下:

src文件夹
include文件夹
Android.mk

(2)编译C语言代码

a) 编写C语言代码

在Androidproject的jni文件夹下新建C语言文件并编写调用SDL2的代码。在这里须要注意C语言代码的主函数名称和命令行程序是一样的。依旧是“main(int argc, char *argv[])”。

b) 改动Android.mk文件

在Android.mk文件后面追加一段代码,用来编译一个libSDL2main.so的库。该库能够调用自己的C语言程序。在这里须要注意。“libSDL2main”这个名称是能够任意起的。可是要和SDLActivity中LoadLibrary()函数中的库名称相相应(默认名称应该是libmain.so)。代码内容例如以下所看到的。

  1. #libSDL2main=======================================
  2. # Lei Xiaohua
  3. include $(CLEAR_VARS)
  4. LOCAL_MODULE := SDL2main
  5. SDL_PATH := ./
  6. LOCAL_C_INCLUDES := $(LOCAL_PATH)/$(SDL_PATH)/include
  7. # Add your application source files here...
  8. LOCAL_SRC_FILES := $(SDL_PATH)/src/main/android/SDL_android_main.c \
  9. $(SDL_PATH)/simplest_showbmp.c
  10. LOCAL_SHARED_LIBRARIES := SDL2
  11. LOCAL_LDLIBS := -lGLESv1_CM -lGLESv2 -llog
  12. include $(BUILD_SHARED_LIBRARY)

PS:上述代码改动自SDL2源码文件夹中android-projectproject的jni\src文件夹下的Android.mk文件。

c) 编写Application.mk文件(可选)
Application.mk中的APP_ABI设定了编译后库文件支持的指令集。默认使用“armeabi”,这里使用默认值就能够了。

d) 执行ndk-build
编写完C语言代码和Android.mk之后就能够执行ndk-build命令进行编译了。

ndk-build命令执行成功后,会在根文件夹下的“libs/armeabi”文件夹中生成2个库文件:

libSDL2.so
libSDL2main.so

接下来就能够在Android手机或者虚拟机上对整个Androidproject进行測试了。

源码

项目的文件夹结构如图所看到的。Java源码位于src文件夹。而C代码位于jni文件夹。

Android程序Java端代码位于src\org\libsdl\app\SDLActivity.java。

该Activity取自于SDL2源码文件夹中的android-projectproject。在这里不再记录。

jni文件夹中的src和include文件夹各自是SDL2的源码文件夹中的src文件夹和include文件夹。

C语言端源码位于jni/simplest_showbmp.c。例如以下所看到的。该源码读取了存储卡中的一张test.bmp文件,并显示出来。

  1. /**
  2. * 移植SDL到安卓平台的HelloWorld程序
  3. * Simplest SDL Android Helloworld
  4. *
  5. * 雷霄骅 Lei Xiaohua
  6. * leixiaohua1020@126.com
  7. * 中国传媒大学/数字电视技术
  8. * Communication University of China / Digital TV Technology
  9. * http://blog.csdn.net/leixiaohua1020
  10. *
  11. *
  12. * 本程序是移植SDL到安卓平台的最简单程序。它能够读取并显示一张BMP图片。
  13.  
  14. *
  15. * This software is the simplest program transplant SDL2 to Android platform.
  16. * It shows a BMP file on the screen.
  17. */
  18.  
  19. #ifdef __ANDROID__
  20.  
  21. #include <jni.h>
  22. #include <android/log.h>
  23. #define LOGI(...) __android_log_print(ANDROID_LOG_INFO , "(^_^)", __VA_ARGS__)
  24. #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR , "(^_^)", __VA_ARGS__)
  25. #else
  26. #define LOGE(format, ...) printf("(>_<) " format "\n", ##__VA_ARGS__)
  27. #define LOGI(format, ...) printf("(^_^) " format "\n", ##__VA_ARGS__)
  28. #endif
  29.  
  30. #include "SDL.h"
  31. #include "SDL_log.h"
  32. #include "SDL_main.h"
  33.  
  34. int main(int argc, char *argv[]) {
  35. struct SDL_Window *window = NULL;
  36. struct SDL_Renderer *render = NULL;
  37. struct SDL_Surface *bmp = NULL;
  38. struct SDL_Texture *texture = NULL;
  39.  
  40. char *filepath = "/storage/emulated/0/test.bmp";
  41.  
  42. if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER) == -1) {
  43. LOGE("SDL_Init failed %s", SDL_GetError());
  44. }
  45.  
  46. window = SDL_CreateWindow("SDL HelloWorld!", 100, 100, 640, 480,
  47. SDL_WINDOW_SHOWN);
  48. if (window == NULL) {
  49. LOGE("SDL_CreateWindow failed %s", SDL_GetError());
  50. }
  51.  
  52. render = SDL_CreateRenderer(window, -1,
  53. SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
  54. if (render == NULL) {
  55. LOGE("SDL_CreateRenderer failed %s", SDL_GetError());
  56. }
  57.  
  58. bmp = SDL_LoadBMP(filepath);
  59. if (bmp == NULL) {
  60. LOGE("SDL_LoadBMP failed: %s", SDL_GetError());
  61. }
  62.  
  63. texture = SDL_CreateTextureFromSurface(render, bmp);
  64. SDL_FreeSurface(bmp);
  65.  
  66. SDL_RenderClear(render);
  67. SDL_RenderCopy(render, texture, NULL, NULL);
  68. SDL_RenderPresent(render);
  69.  
  70. SDL_Delay(10000);
  71.  
  72. SDL_DestroyTexture(texture);
  73. SDL_DestroyRenderer(render);
  74. SDL_DestroyWindow(window);
  75.  
  76. //Quit SDL
  77. SDL_Quit();
  78. return 0;
  79. }

Android.mk文件位于jni/Android.mk,例如以下所看到的。

  1. LOCAL_PATH := $(call my-dir)
  2.  
  3. ###########################
  4. #
  5. # SDL shared library
  6. #
  7. ###########################
  8.  
  9. include $(CLEAR_VARS)
  10.  
  11. LOCAL_MODULE := SDL2
  12.  
  13. LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
  14.  
  15. LOCAL_EXPORT_C_INCLUDES := $(LOCAL_C_INCLUDES)
  16.  
  17. LOCAL_SRC_FILES := \
  18. $(subst $(LOCAL_PATH)/,, \
  19. $(wildcard $(LOCAL_PATH)/src/*.c) \
  20. $(wildcard $(LOCAL_PATH)/src/audio/*.c) \
  21. $(wildcard $(LOCAL_PATH)/src/audio/android/*.c) \
  22. $(wildcard $(LOCAL_PATH)/src/audio/dummy/*.c) \
  23. $(LOCAL_PATH)/src/atomic/SDL_atomic.c \
  24. $(LOCAL_PATH)/src/atomic/SDL_spinlock.c.arm \
  25. $(wildcard $(LOCAL_PATH)/src/core/android/*.c) \
  26. $(wildcard $(LOCAL_PATH)/src/cpuinfo/*.c) \
  27. $(wildcard $(LOCAL_PATH)/src/dynapi/*.c) \
  28. $(wildcard $(LOCAL_PATH)/src/events/*.c) \
  29. $(wildcard $(LOCAL_PATH)/src/file/*.c) \
  30. $(wildcard $(LOCAL_PATH)/src/haptic/*.c) \
  31. $(wildcard $(LOCAL_PATH)/src/haptic/dummy/*.c) \
  32. $(wildcard $(LOCAL_PATH)/src/joystick/*.c) \
  33. $(wildcard $(LOCAL_PATH)/src/joystick/android/*.c) \
  34. $(wildcard $(LOCAL_PATH)/src/loadso/dlopen/*.c) \
  35. $(wildcard $(LOCAL_PATH)/src/power/*.c) \
  36. $(wildcard $(LOCAL_PATH)/src/power/android/*.c) \
  37. $(wildcard $(LOCAL_PATH)/src/filesystem/dummy/*.c) \
  38. $(wildcard $(LOCAL_PATH)/src/render/*.c) \
  39. $(wildcard $(LOCAL_PATH)/src/render/*/*.c) \
  40. $(wildcard $(LOCAL_PATH)/src/stdlib/*.c) \
  41. $(wildcard $(LOCAL_PATH)/src/thread/*.c) \
  42. $(wildcard $(LOCAL_PATH)/src/thread/pthread/*.c) \
  43. $(wildcard $(LOCAL_PATH)/src/timer/*.c) \
  44. $(wildcard $(LOCAL_PATH)/src/timer/unix/*.c) \
  45. $(wildcard $(LOCAL_PATH)/src/video/*.c) \
  46. $(wildcard $(LOCAL_PATH)/src/video/android/*.c) \
  47. $(wildcard $(LOCAL_PATH)/src/test/*.c))
  48.  
  49. LOCAL_CFLAGS += -DGL_GLEXT_PROTOTYPES
  50. LOCAL_LDLIBS := -ldl -lGLESv1_CM -lGLESv2 -llog -landroid
  51.  
  52. include $(BUILD_SHARED_LIBRARY)
  53.  
  54. ###########################
  55. #
  56. # SDL static library
  57. #
  58. ###########################
  59.  
  60. LOCAL_MODULE := SDL2_static
  61.  
  62. LOCAL_MODULE_FILENAME := libSDL2
  63.  
  64. LOCAL_SRC_FILES += $(LOCAL_PATH)/src/main/android/SDL_android_main.c
  65.  
  66. LOCAL_LDLIBS :=
  67. LOCAL_EXPORT_LDLIBS := -Wl,--undefined=Java_org_libsdl_app_SDLActivity_nativeInit -ldl -lGLESv1_CM -lGLESv2 -llog -landroid
  68.  
  69. include $(BUILD_STATIC_LIBRARY)
  70.  
  71. #libSDL2main=======================================
  72. # Lei Xiaohua
  73. include $(CLEAR_VARS)
  74. LOCAL_MODULE := SDL2main
  75. SDL_PATH := ./
  76. LOCAL_C_INCLUDES := $(LOCAL_PATH)/$(SDL_PATH)/include
  77. # Add your application source files here...
  78. LOCAL_SRC_FILES := $(SDL_PATH)/src/main/android/SDL_android_main.c \
  79. $(SDL_PATH)/simplest_showbmp.c
  80. LOCAL_SHARED_LIBRARIES := SDL2
  81. LOCAL_LDLIBS := -lGLESv1_CM -lGLESv2 -llog
  82. include $(BUILD_SHARED_LIBRARY)

执行结果

App在手机上执行后的结果例如以下图所看到的。能够看出App读取了test.bmp文件而且显示出来。

注意须要把BMP文件拷贝至存储卡相应的文件夹中。程序默认情况下会读取根文件夹下的“test.bmp”文件。

下载

simplest ffmpeg mobile

项目主页

Github:https://github.com/leixiaohua1020/simplest_ffmpeg_mobile

开源中国:https://git.oschina.net/leixiaohua1020/simplest_ffmpeg_mobile

SourceForge:https://sourceforge.net/projects/simplestffmpegmobile/

CSDNproject下载地址:http://download.csdn.net/detail/leixiaohua1020/8924391

本解决方式包括了使用FFmpeg在移动端处理多媒体的各种样例:

[Android]
simplest_android_player: 基于安卓接口的视频播放器
simplest_ffmpeg_android_helloworld: 安卓平台下基于FFmpeg的HelloWorld程序
simplest_ffmpeg_android_decoder: 安卓平台下最简单的基于FFmpeg的视频解码器
simplest_ffmpeg_android_decoder_onelib: 安卓平台下最简单的基于FFmpeg的视频解码器-单库版
simplest_ffmpeg_android_streamer: 安卓平台下最简单的基于FFmpeg的推流器
simplest_ffmpeg_android_transcoder: 安卓平台下移植的FFmpeg命令行工具
simplest_sdl_android_helloworld: 移植SDL到安卓平台的最简单程序
[IOS]
simplest_ios_player: 基于IOS接口的视频播放器
simplest_ffmpeg_ios_helloworld: IOS平台下基于FFmpeg的HelloWorld程序
simplest_ffmpeg_ios_decoder: IOS平台下最简单的基于FFmpeg的视频解码器
simplest_ffmpeg_ios_streamer: IOS平台下最简单的基于FFmpeg的推流器
simplest_ffmpeg_ios_transcoder: IOS平台下移植的ffmpeg.c命令行工具
simplest_sdl_ios_helloworld: 移植SDL到IOS平台的最简单程序

最简单的基于FFmpeg的移动端样例附件:SDL Android HelloWorld的更多相关文章

  1. 最简单的基于FFmpeg的移动端样例附件:Android 自带播放器

    ===================================================== 最简单的基于FFmpeg的移动端样例系列文章列表: 最简单的基于FFmpeg的移动端样例:A ...

  2. 最简单的基于FFmpeg的移动端样例:Windows Phone HelloWorld

    ===================================================== 最简单的基于FFmpeg的移动端样例系列文章列表: 最简单的基于FFmpeg的移动端样例:A ...

  3. 最简单的基于FFmpeg的移动端样例:Android 视频解码器-单个库版

    ===================================================== 最简单的基于FFmpeg的移动端样例系列文章列表: 最简单的基于FFmpeg的移动端样例:A ...

  4. 最简单的基于FFmpeg的移动端样例:IOS 视频解码器

    ===================================================== 最简单的基于FFmpeg的移动端样例系列文章列表: 最简单的基于FFmpeg的移动端样例:A ...

  5. 最简单的基于FFmpeg的移动端样例:IOS 视频转码器

    ===================================================== 最简单的基于FFmpeg的移动端样例系列文章列表: 最简单的基于FFmpeg的移动端样例:A ...

  6. 最简单的基于FFmpeg的移动端样例:Android HelloWorld

    ===================================================== 最简单的基于FFmpeg的移动端样例系列文章列表: 最简单的基于FFmpeg的移动端样例:A ...

  7. 最简单的基于FFmpeg的移动端样例:IOS 推流器

    ===================================================== 最简单的基于FFmpeg的移动端样例系列文章列表: 最简单的基于FFmpeg的移动端样例:A ...

  8. 最简单的基于FFmpeg的移动端样例:Android 视频转码器

    ===================================================== 最简单的基于FFmpeg的移动端样例系列文章列表: 最简单的基于FFmpeg的移动端样例:A ...

  9. 最简单的基于FFmpeg的移动端样例:IOS HelloWorld

    ===================================================== 最简单的基于FFmpeg的移动端样例系列文章列表: 最简单的基于FFmpeg的移动端样例:A ...

随机推荐

  1. WIN下C开发环境搭建

    安装编译器 MinGW提供了一套简单方便的Winodows下的基于GCC程序开发环境 官网下载安装 http://www.mingw.org/ 打开后选择basic setup的package Ins ...

  2. redhat linux 从/home目录扩展空间至/根目录

    查看分区大小 [root@easdb01 ~]# df -hFilesystem Size Used Avail Use% Mounted on/dev/mapper/vg_easdb01-lv_ro ...

  3. LCT(Link-Cut Tree)

    Link-cut tree(LCT)[可以理解为树链剖分+splay] 给出如下定义: access(x):访问x节点 perferred child:若以x为根的子树中最后被访问的节点在以x的儿子y ...

  4. [USACO08DEC] 秘密消息Secret Message (Trie树)

    题目链接 Solution Trie 树水题. 直接将前面所有字符串压入Trie 中. 在查询统计路上所有有单词的地方和最后一个地方以下的单词数即可. Code #include<bits/st ...

  5. Java Socket IO(BIO、NIO)

    总结下Java socket IO.首先是各种IO的定义,这个定义似乎也是众说纷纭.我按照stackoverflow上面的解释: IO有两种分法:按照阻塞或者按照同步.按照阻塞,有阻塞IO和非阻塞IO ...

  6. spring-boot项目MapperScan注解包含多个包

    单个包 @MapperScan("com.mysiteforme.admin.dao") 多个包 @MapperScan({"com.mysiteforme.admin. ...

  7. Junit框架使用--JUnit常用断言及注解

    从别人博客中抄过来一点东西 原文地址:http://blog.csdn.net/wangpeng047/article/details/9628449 断言是编写测试用例的核心实现方式,即期望值是多少 ...

  8. bzoj 2819 Nim dfn序+树状数组维护区间异或值

    题目大意 著名游戏设计师vfleaking,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可以不取.谁不能取谁输.这个游戏是有必胜策略 ...

  9. Linux System Programming 学习笔记(十) 信号

    1. 信号是软中断,提供处理异步事件的机制 异步事件可以是来源于系统外部(例如用户输入Ctrl-C)也可以来源于系统内(例如除0)   内核使用以下三种方法之一来处理信号: (1) 忽略该信号.SIG ...

  10. mybatis动态sql片段与分页,排序,传参的使用与一对多映射与resultMap使用

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-/ ...