FFmpeg在Android平臺的應用

一、開發環境

Ubuntu14.04

FFmpeg-2.5.3

android-ndk-r10d-linux-x86_64


二、編譯FFmpeg

1.  解壓ffmpeg-2.5.3.tar.bz2之後,修改ffmpeg-2.5.3/configure文件

將如下四行:

SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'

LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'

SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'

SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR)$(SLIBNAME)'

替換爲:

SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'

LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'

SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'

SLIB_INSTALL_LINKS='$(SLIBNAME)'
【注】如果不修改配置,直接編譯,編譯出來的so文件類似libavcodec.so.55.39.101,版本號位於so之後,Android上似乎無法加載。

2. 編寫build_android.sh自動配置腳本文件

#!/bin/bash

NDK=/opt/android-ndk-r10d
SYSROOT=$NDK/platforms/android-19/arch-arm
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64

./configure \
        --target-os=linux \
        --arch=arm \
        --disable-ffmpeg \
        --disable-ffplay \
        --disable-ffprobe \
        --disable-ffserver \
        --disable-postproc \
        --enable-shared \
        --disable-static \
        --enable-cross-compile \
        --prefix=$(pwd)/prefix \
        --sysroot=$SYSROOT \
        --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi-

並增加build_android.sh可執行權限。


3. 開始配置,編譯和安裝

$./build_android.sh
$make
$make install
prefix/ 爲編譯生成的庫文件


三、創建Jni調用的Android工程

1. 創建一個新的Android工程Jni

2. 在該工程根目錄下創建jni文件夾

3. 在jni目錄下創建prebuilt目錄,並將上面編譯好的.so文件和頭文件拷貝到該目錄

4. 創建包含native方法的類,新建FFmpegNative.java類文件。主要包括加載so庫文件和一個native測試方法。

package com.charein.jni;

public class FFmpegNative {
	static {
		System.loadLibrary("avdevice-56");
		System.loadLibrary("avfilter-5");
		System.loadLibrary("avutil-54");
		System.loadLibrary("swresample-1");
		System.loadLibrary("avformat-56");
		System.loadLibrary("swscale-3");
		System.loadLibrary("avcodec-56");
		System.loadLibrary("ffmpeg_codec");		
	}
	public native int avcodec_find_decoder(int codecID);
}

5. 自動生成頭文件

進入bin/classes目錄,執行下面命令會自動生成頭文件

javah --classpath ./ com_charein_jni_FFmpegNative

6. 在jni目錄下新建與頭文件同名的C/C++源文件,com_charein_jni_FFmpegNative.c內容如下:

#include <stdlib.h>
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include "com_charein_jni_FFmpegNative.h"

JNIEXPORT jint JNICALL Java_com_charein_jni_FFmpegNative_avcodec_1find_1decoder
  (JNIEnv *env, jobject obj, jint codecID)
{
	AVCodec *codec = NULL;

	av_register_all();

	codec = avcodec_find_decoder(codecID);

	if (codec != NULL)
		return 0;
	else
		return -1;

}

7. 編寫Android.mk,內容如下:

LOCAL_PATH	:= $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE	:=avcodec-prebuilt
LOCAL_SRC_FILES	:=prebuilt/libavcodec-56.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE	:=avdevice-prebuilt
LOCAL_SRC_FILES	:=prebuilt/libavdevice-56.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE	:=avfilter-prebuilt
LOCAL_SRC_FILES	:=prebuilt/libavfilter-5.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE	:=avformat-prebuilt
LOCAL_SRC_FILES	:=prebuilt/libavformat-56.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE	:=avutil-prebuilt
LOCAL_SRC_FILES	:=prebuilt/libavutil-54.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE	:=avswresample-prebuilt
LOCAL_SRC_FILES	:=prebuilt/libswresample-1.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE	:=swscale-prebuilt
LOCAL_SRC_FILES	:=prebuilt/libswscale-3.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE	:=ffmpeg_codec
LOCAL_SRC_FILES	:=com_charein_jni_FFmpegNative.c

LOCAL_LDLIBS	:=-llog -lz -landroid -ljnigraphics # -L$(LOCAL_PATH)/prebuilt 

LOCAL_SHARED_LIBRARIES	:= avcodec-prebuilt avdevice-prebuilt avfilter-prebuilt \
avformat-prebuilt avutil-prebuilt avswresample-prebuilt swscale-prebuilt

include $(BUILD_SHARED_LIBRARY)

8. 在eclipse添加builder

工程右鍵 Properties -> Builders 新建一個編譯器,使用ndk-build.cmd


參考文章:http://blog.csdn.net/gobitan/article/details/22750719

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章