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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值