最簡單的基於FFmpeg的移動端範例附件:SDL Android HelloWorld

來源:互聯網
上載者:User

標籤:圖片   AC   ide   儲存   應該   statistic   down   init   href   

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

最簡單的基於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)。代碼內容例如以下所看到的。

#libSDL2main=======================================# Lei Xiaohuainclude $(CLEAR_VARS)LOCAL_MODULE := SDL2mainSDL_PATH := ./LOCAL_C_INCLUDES := $(LOCAL_PATH)/$(SDL_PATH)/include# Add your application source files here...LOCAL_SRC_FILES := $(SDL_PATH)/src/main/android/SDL_android_main.c $(SDL_PATH)/simplest_showbmp.cLOCAL_SHARED_LIBRARIES := SDL2LOCAL_LDLIBS := -lGLESv1_CM -lGLESv2 -lloginclude $(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檔案,並顯示出來。

/** * 移植SDL到安卓平台的HelloWorld程式 * Simplest SDL Android Helloworld * * 雷霄驊 Lei Xiaohua * [email protected] * 中國傳媒大學/數字電視技術 * Communication University of China / Digital TV Technology * http://blog.csdn.net/leixiaohua1020 * * * 本程式是移植SDL到安卓平台的最簡單程式。它能夠讀取並顯示一張BMP圖片。

* * This software is the simplest program transplant SDL2 to Android platform. * It shows a BMP file on the screen. */#ifdef __ANDROID__#include <jni.h>#include <android/log.h>#define LOGI(...) __android_log_print(ANDROID_LOG_INFO , "(^_^)", __VA_ARGS__)#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR , "(^_^)", __VA_ARGS__)#else#define LOGE(format, ...) printf("(>_<) " format "\n", ##__VA_ARGS__)#define LOGI(format, ...) printf("(^_^) " format "\n", ##__VA_ARGS__)#endif#include "SDL.h"#include "SDL_log.h"#include "SDL_main.h"int main(int argc, char *argv[]) {struct SDL_Window *window = NULL;struct SDL_Renderer *render = NULL;struct SDL_Surface *bmp = NULL;struct SDL_Texture *texture = NULL; char *filepath = "/storage/emulated/0/test.bmp"; if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER) == -1) { LOGE("SDL_Init failed %s", SDL_GetError()); } window = SDL_CreateWindow("SDL HelloWorld!", 100, 100, 640, 480, SDL_WINDOW_SHOWN); if (window == NULL) { LOGE("SDL_CreateWindow failed %s", SDL_GetError()); } render = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); if (render == NULL) { LOGE("SDL_CreateRenderer failed %s", SDL_GetError()); } bmp = SDL_LoadBMP(filepath); if (bmp == NULL) { LOGE("SDL_LoadBMP failed: %s", SDL_GetError()); } texture = SDL_CreateTextureFromSurface(render, bmp); SDL_FreeSurface(bmp); SDL_RenderClear(render); SDL_RenderCopy(render, texture, NULL, NULL); SDL_RenderPresent(render); SDL_Delay(10000); SDL_DestroyTexture(texture); SDL_DestroyRenderer(render); SDL_DestroyWindow(window); //Quit SDL SDL_Quit(); return 0;}


Android.mk檔案位於jni/Android.mk,例如以下所看到的。
LOCAL_PATH := $(call my-dir)############################# SDL shared library############################include $(CLEAR_VARS)LOCAL_MODULE := SDL2LOCAL_C_INCLUDES := $(LOCAL_PATH)/includeLOCAL_EXPORT_C_INCLUDES := $(LOCAL_C_INCLUDES)LOCAL_SRC_FILES := $(subst $(LOCAL_PATH)/,, $(wildcard $(LOCAL_PATH)/src/*.c) $(wildcard $(LOCAL_PATH)/src/audio/*.c) $(wildcard $(LOCAL_PATH)/src/audio/android/*.c) $(wildcard $(LOCAL_PATH)/src/audio/dummy/*.c) $(LOCAL_PATH)/src/atomic/SDL_atomic.c $(LOCAL_PATH)/src/atomic/SDL_spinlock.c.arm $(wildcard $(LOCAL_PATH)/src/core/android/*.c) $(wildcard $(LOCAL_PATH)/src/cpuinfo/*.c) $(wildcard $(LOCAL_PATH)/src/dynapi/*.c) $(wildcard $(LOCAL_PATH)/src/events/*.c) $(wildcard $(LOCAL_PATH)/src/file/*.c) $(wildcard $(LOCAL_PATH)/src/haptic/*.c) $(wildcard $(LOCAL_PATH)/src/haptic/dummy/*.c) $(wildcard $(LOCAL_PATH)/src/joystick/*.c) $(wildcard $(LOCAL_PATH)/src/joystick/android/*.c) $(wildcard $(LOCAL_PATH)/src/loadso/dlopen/*.c) $(wildcard $(LOCAL_PATH)/src/power/*.c) $(wildcard $(LOCAL_PATH)/src/power/android/*.c) $(wildcard $(LOCAL_PATH)/src/filesystem/dummy/*.c) $(wildcard $(LOCAL_PATH)/src/render/*.c) $(wildcard $(LOCAL_PATH)/src/render/*/*.c) $(wildcard $(LOCAL_PATH)/src/stdlib/*.c) $(wildcard $(LOCAL_PATH)/src/thread/*.c) $(wildcard $(LOCAL_PATH)/src/thread/pthread/*.c) $(wildcard $(LOCAL_PATH)/src/timer/*.c) $(wildcard $(LOCAL_PATH)/src/timer/unix/*.c) $(wildcard $(LOCAL_PATH)/src/video/*.c) $(wildcard $(LOCAL_PATH)/src/video/android/*.c)     $(wildcard $(LOCAL_PATH)/src/test/*.c))LOCAL_CFLAGS += -DGL_GLEXT_PROTOTYPESLOCAL_LDLIBS := -ldl -lGLESv1_CM -lGLESv2 -llog -landroidinclude $(BUILD_SHARED_LIBRARY)############################# SDL static library############################LOCAL_MODULE := SDL2_staticLOCAL_MODULE_FILENAME := libSDL2LOCAL_SRC_FILES += $(LOCAL_PATH)/src/main/android/SDL_android_main.cLOCAL_LDLIBS := LOCAL_EXPORT_LDLIBS := -Wl,--undefined=Java_org_libsdl_app_SDLActivity_nativeInit -ldl -lGLESv1_CM -lGLESv2 -llog -landroidinclude $(BUILD_STATIC_LIBRARY)#libSDL2main=======================================# Lei Xiaohuainclude $(CLEAR_VARS)LOCAL_MODULE := SDL2mainSDL_PATH := ./LOCAL_C_INCLUDES := $(LOCAL_PATH)/$(SDL_PATH)/include# Add your application source files here...LOCAL_SRC_FILES := $(SDL_PATH)/src/main/android/SDL_android_main.c $(SDL_PATH)/simplest_showbmp.cLOCAL_SHARED_LIBRARIES := SDL2LOCAL_LDLIBS := -lGLESv1_CM -lGLESv2 -lloginclude $(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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.