ffmpeg2.2在ubuntu下使用NDK编译——并在android工程下测试使用_weixin_33772645的博客-程序员宝宝

技术标签: ffmpeg  移动开发  嵌入式  

作者:wainiwann
出处: http://www.cnblogs.com/wainiwann/
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
 

摘要:本文主要介绍将FFmpeg音视频编解码库移植到Android平台上的编译和基本测试过程。

 

环境准备:

Ubuntu12.04 TLS

android-ndk-r9d-linux-x86_64.tar.bz2

ffmpeg2.2

---------------------------------------------------------

第一步:下载

1.配置ubuntu12.04 TLS 系统环境。

2.下载ndk版本为 r9d。

3.下载ffmpeg2.2版本。

 

第二步:在ubuntu下编译环境设置

1. 安装好ubuntu12.04 TLS 64位linux系统之后,可以选择安装一下内容:

在在参考一些其他有关linux下NDK环境搭建资料上看到64位ubuntu 安装之后需要再下载 bison

64位ubuntu下还需要下载 gcc-multilibg++-multilib:

终端命令:" sudo apt-get install bison gcc-multilib g++-multilib "

2.下载ndk之后解压后目录:/home/admin/develop/android-ndk-r9d

配置NDK环境变量:

(2.) 配置NDK的环境变量:

终端内执行:“ gedit ~/.bashrc

在打开的文件末尾添加如下内容:

NDK=/home/admin/develop/android-ndk-r9d

export NDK

(3.)在当前bash环境下读取并执行 ~/.bashrc 中的命令:

终端执行:" source  ~/.bashrc "

(4.)查看是否生效:

终端执行: " echo $NDK "

结果:/home/test/develop/android-ndk-r9d

(5.)测试NDK编译JNI工程:

到android-ndk-r9d 的sample目录的hello-jni 目录里

终端执行:“ $NDK/ndk-build

如果环境配置成功会生成so库的。

3.解压ffmpeg-2.2源码

将ffmpeg-2.2.tar.gz解压后拷贝到任意目录,本例是拷贝到.../android-ndk-r9d/sample/ffmpeg2.2 目录内。

拷贝之后添加" build_android.sh "文件:

#!/bin/bash
SYSROOT=$NDK/platforms/android-9/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64

function build_one
{
./configure \
    --prefix=$PREFIX \
    --enable-shared \
    --disable-static \
    --disable-doc \
    --disable-ffserver \
    --enable-cross-compile \
    --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
    --target-os=linux \
    --arch=arm \
    --sysroot=$SYSROOT \
    --extra-cflags="-Os -fpic $ADDI_CFLAGS" \
    --extra-ldflags="$ADDI_LDFLAGS" \
    $ADDITIONAL_CONFIGURE_FLAG
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
build_one

有的资料上面 build_android.sh 的前几行是这样写的:

#!/bin/bash
NDK=/home/admin/develop/android-ndk-r9d
SYSROOT=$NDK/platforms/android-9/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64

.....
.....

因为之前已经在linux下设置NDK的环境路径,所以就不需要在build_android.sh里指定NDK的路径了。

在编译ffmpeg的时候推荐先设置NDK的环境路径到系统环境中,因为如果不设置的话,使用" NDK=/home/admin/... " 个人感觉是非常恶心的,尤其是在windows下使用cygwin编译的时候经常出现NDK路径找不到的问题,所以windows下编译最好也配置好NDK环境路径。

修改configure文件:

很多ffmpeg编译资料上面说要修改configure文件 ,说的原因是 如果不修改的话,在android上 System.loadLibrary("xxx"); 的时候个别so库无法加载的问题。

打开 ffmpeg源码内 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)'

第三步:在ubuntu 64位下进行编译ffmpeg源码以得到android平台 arm下能使用的那几个so库

 

1.给build_android.sh 和 configure 增加可执行权限:

终端执行:

$chmod+x ./build_android.sh

$chmod+x ./configure

2.给build_android.sh 和 configure 转换格式:

终端执行:(需要先安装 dos2unix)

$dos2unix ./build_android.sh

$dos2unix ./configure

3.最后编译:

终端执行:

$ ./build_android.sh

$ make

$ make install

----------------------

编译成功会在ffmpeg源码目录下生成一个“android”目录里面有编译好的 so库和 需要的头文件等等。

其中so库应该是一下几个:

libavutil-52.so
libavcodec-55.so
libswresample-0.so
libavformat-55.so
libswscale-2.so
libpostproc-52.so
libavfilter-4.so
libavdevice-55.so

第四步:android下使用这几个库:

----------------------------------------------------

1.使用NDK里sample目录下的hello-jni 工程进行使用这几个库:

(a.)在hello-jni 源码的JNI目录下新建ffmpeglib目录,把那几个库全部拷贝到 /hello-jni/jni/ffmpeglib/ 目录下。

(b.)然后把编译好的ffmpeg的头文件全部拷贝到 /hello-jni/jni/ 目录下。

(c.)在 hello-jni.c 文件内进行使用ffmpeg:

#include <string.h>
#include <jni.h>

#include <libavcodec/avcodec.h>


jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
                                                  jobject thiz )
{
    char str[25];
    sprintf(str, "%d", avcodec_version());

    return (*env)->NewStringUTF(env, str);
}

(d.)在 HelloJni.java 文件加载so库进行调用JNI内的测试函数:

static 
    {
        
        System.loadLibrary("avutil-52");
        System.loadLibrary("avcodec-55");
        System.loadLibrary("swresample-0");
        System.loadLibrary("avformat-55");
        System.loadLibrary("swscale-2");
        System.loadLibrary("postproc-52");
        System.loadLibrary("avfilter-4");
        System.loadLibrary("avdevice-55");
        System.loadLibrary("hello-jni");
        
    
    }
    
    public native String  stringFromJNI();

 

(e.)修改 hello-jni 源码中jni目录下的 Android.mk 文件:

LOCAL_PATH := $(call my-dir)

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

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

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

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

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

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

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

include $(CLEAR_VARS)
LOCAL_MODULE :=  postproc-52-ffmpeglib
LOCAL_SRC_FILES := ffmpeglib/libpostproc-52.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni   
LOCAL_SRC_FILES := hello-jni.c

LOCAL_LDLIBS := -llog -ljnigraphics -lz -landroid
LOCAL_SHARED_LIBRARIES := avcodec-55-prebuilt avdevice-55-prebuilt avfilter-4-prebuilt avformat-55-prebuilt avutil-52-prebuilt swscale-2-prebuilt postproc-52-prebuilt avswresample-0-prebuilt

include $(BUILD_SHARED_LIBRARY)

(f.)windows下使用cygwin编译hello-jni工程:

" $NDK/ndk-build "

生成 libhello-jni.so 完成。

 ----------------------------------------

附上ubuntu下编译好的所有so库和头文件:

http://download.csdn.net/detail/wain163/7494547

 

 

!!!==========================================

针对之前有的小伙伴说使用hello-jni测试 NDK-r9编译好的最新的FFmpeg2.2的所有so库和头文件 的时候。

在使用cygwin编译jni的时候会报错:”undefined reference to 'avcodec_version'“ 的问题,所以现在把本人在hello-jni的程序弄上来,供大家参考。

hello-jni工程地址:

http://download.csdn.net/detail/wain163/8859195

备注:

此demo需要在 HelloJni.java 中加上:

 

 static {
        
        System.loadLibrary("avutil-52");
        System.loadLibrary("avcodec-55");
        System.loadLibrary("swresample-0");
        System.loadLibrary("avformat-55");
        System.loadLibrary("swscale-2");
        System.loadLibrary("postproc-52");
        System.loadLibrary("avfilter-4");
        System.loadLibrary("avdevice-55");
        System.loadLibrary("hello-jni");

    }

 

并且需要cygwin 对jni进行编译 出so才能运行。

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

 

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

参考资料:

http://blog.csdn.net/gobitan/article/details/22750719

 

 

作者:wainiwann
出处: http://www.cnblogs.com/wainiwann/
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33772645/article/details/86421581

智能推荐

一把辛酸泪:Mac上SublimeText3安装Emmet时PyV8死活安装不上的问题解决_yanzi1225627的博客-程序员宝宝

遇到个蛋疼的问题,公司电脑基于前文Privoxy带来的便利,在安装Emmet时,自动将PyV8安装好了,但是家里就是不行。无奈只有手动安装PyV8,这是官网https://github.com/emmetio/pyv8-binaries,折腾了一圈发现不行。以为是python版本太低2.7所致,所以参考链接http://www.codedream.top/?p=75更新了mac自带python2.

ORACLE向表中添加数据_oracle怎么往表里插数据_张盐酸的博客-程序员宝宝

ORACLE向表中添加数据1.直接插入数据insert into table_namevalues(‘col_text’,‘col_text1’);顺序一致,给表中的所有列添加一条数据时:(col_name…)可省略,如:insert into [table_name] values(‘col_text’,‘col_text1’);2.添加其他表中的数据insert into table_nameselect [col_namea],[col_nameb] from [tbl_name1];

计算机应用能力考试用书有哪些,全国专业技术人员计算机应用能力考试用书_weixin_39714849的博客-程序员宝宝

《全国专业技术人员计算机应用能力考试用书 Internet应用》是结合专业技术人员计算机应用能力考试的要求,全面阐述了Internet的基础知识、接入方式以及局域网、IE浏览器、电子邮件收发管理软件、FTP客户端软件、即时通讯工具、安全设置、杀毒软件、软件防火墙等使用方法,并进行了有针对性的讲解,便于广大专业技术人员学习掌握。¥13.86定价:¥45.75(3.03折)为适应信息技术的发展需要,更...

手把手教你如何扩展GridView之自带分页_weixin_30632883的博客-程序员宝宝

最新重构源码下载:打造0代码全自动GridView-天具神力 您在使用GridView的时候是不是每次都要处理分页事件OnPageIndexChanging,面对成千上万的页面,您是否在页面中都有这样的代码: this.PageIndex = e.NewPageIndex;,看着原来写的臃肿的页面代码,您高兴的起来么?现在考验程序员水平的标准不再是写过多少行代码了,同...

sql 创建聚集索引和非聚集索引_创建非聚集索引的sql语句怎么写_zhou_xuexi的博客-程序员宝宝

--创建聚集索引create CLUSTERED INDEX 索引名称 ON 表名(字段名)--创建非聚集索引create NONCLUSTERED INDEX 索引名称 ON 表名(字段名)--删除指定约束alter table 表名drop constraint 主键约束名称--将指定字段设置成主键非聚集索引alter table 表名 add constraint

angular innerHtml用法以及内容增加样式_angular innerhtml的用法_chrdww的博客-程序员宝宝

1. 作用:在页面中显示html文本(1) htmlStr = "&lt;div&gt;&amp;lt;a&amp;ensp;href=\"https://www.baidu.com/\"&amp;gt;&amp;lt;/a&amp;gt;&lt;/div&gt;"&lt;div [innerHtml]="htmlStr"&gt;&lt;/div&gt; 显示:&lt;...

随便推点

(Directx11学习)开天辟地第一式_direct x11 c语言_BIGBurning的博客-程序员宝宝

我们首先创建一个窗口,该窗口带有消息处理:最基本的win32中创建窗口程序://--------------------------------------------------------------------------------------//author:tongli//-------------------------------------------------

BroadcastReceiver、EventBus的优缺点_eventbus的缺点_crazy_yyyyy的博客-程序员宝宝

今天在知乎上,看到一个关于android中本地广播和eventbus选择的问题,感觉说的挺好的,我在这里记录一下;本地广播是相对消耗时间、空间最多的一种方式,但是大家都知道,广播是四大组件之一,许多系统级的事件都是通过广播来通知的,比如说网络的变化、电量的变化,短信发送和接收的状态,所以,如果与android系统进行相关的通知,还是要选择本地广播;在BroadcastReceiver的 onR

启用不安全的HTTP方法解决方案_不安全的http资源_huachuan520的博客-程序员宝宝

问题描述:可能会在Web服务器上上载、修改或删除Web页面、脚本和文件。'启用了不安全的HTTP方法:OPTIONS /system HTTP/1.1Allow: HEAD, PUT, DELETE, TRACE, OPTIONS, PATCH上述方法的用途: Options、Head、Trace:主要由应用程序来发现和跟踪服务器支持和网络行为; Get:检索文档; ...

thymeleaf简介、配置、基本操作_画凉词微的博客-程序员宝宝

1.thymeleaf简介:Thymeleaf是一个流行的模板引擎,该模板引擎采用Java语言开发,模板引擎是一个技术名词,是跨领域跨平台的概念,在Java语言体系下有模板引擎,在C#、PHP语言体系下也有模板引擎。除了thymeleaf之外还有Velocity、FreeMarker等模板引擎,功能类似。Thymeleaf的主要目标在于提供一种可被浏览器正确显示的、格式良好的模板创建方式,因此也可以用作静态建模。你可以使用它创建经过验证的XML与HTML模板。使用thymeleaf创建的html模板可以

能熟练使用计算机并进行必要维护,省计应课程准(参考).doc_芬格尔�m~~~的博客-程序员宝宝

平面基础课程标准一、课程性质与任务本课程是中等职业学校计算机应用专业的一门专业基础课程。其主要任务是培养学生的动手能力和提高学生的审美水平,使学生掌握Photoshop的基本操作和色彩理论,掌握各种工具的使用,熟练使用滤镜、通道、路径和蒙版等工具进行图像处理,培养计算机图像处理方面的高素质劳动者和中初级应用型专门人才。二、课程教学目标知识目标:1.了解Photoshop基本理论和基本常识,认识Ph...

h-ui 增删改查_chenweishaoxing的博客-程序员宝宝

https://www.cnblogs.com/xuerong/p/8688293.html

推荐文章

热门文章

相关标签