`
RandyWei
  • 浏览: 66992 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android 音视频编解码系列(1)--ubuntu下ndk编译ffmpeg0.8.1

 
阅读更多

  ffmpeg最新版本有些问题,比如jni/liblibavcodec/ac3enc_combined.c在最新的版本中已经没有了,但是又多了一个ac3enc_template.c的文件。虽然更新版本对于开发人员可以使用到更多的功能,但是如果这样乱改的话真的好无语,非常讨厌这种更新版本的不一致性,唉,只是抱怨一下

我使用的还是稍微老一点的版本ffmpeg 0.8.1的,至少老的版本能搜到更多的资料,也比较稳定。

ffmpeg版本:ffmpeg 0.8.1(最新版本是0.10,但是有很多问题)

NDK版本:ndk r6(ndk r7编译的话会出现各种错误)

机器:32位

系统:ubuntu

注意:ndk r6+ffmpeg0.8.1+Android.mk+config.sh是经过测试过的,可以生成。如果你用的其他版本的会出现各种问题

前提:需要你配置好NDK的环境,还是说说吧

一、下载并配置NDK环境变量(ubuntu下,windows下请使用cygwin)

1、到http://developer.android.com/sdk/ndk/index.html下载NDK

这里,ndk r6版本的下载地址是:http://dl.google.com/android/ndk/android-ndk-r6-linux-x86.tar.bz2

2、解压包到/home/loulijun/android/目录下

3、$vim ~/.bashrc    在里面添加如下信息

export NDK=/home/loulijun/android/android-ndk-r6
107 export PATH=${PATH}:$NDK

4、$source ~/.bashrc 使其生效

注意:最新r7版本出现了一个关于awk问题,这个awk是64位的,所以如果你是32位机会遇到,具体解决办法见我的上篇博客:

http://www.cnblogs.com/loulijun/archive/2012/02/26/2368787.html

 

二、下载ffmpeg源码包

如果你想下载ffmpeg0.8.1版本(老版本),请点击这里:http://www.ffmpeg.org/releases/ffmpeg-0.8.1.tar.gz

如果你想下载最新版本,可以到http://ffmpeg.org/download.html下载

使用$git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg

但是下载后的虽然是最新且纯净的代码,可能Android.mk文件与之不完全匹配,如果非要用最新版本的话最好修改一下Android.mk吧(工作量有点大)


三、配置ffmpeg环境

可以系统目录下创建一个用于存放ffmpeg的目录,假如我们全部操作都在

~/mywork/ndk/ffmpeg/目录下,将下载好的ffmpeg源码放在ffmpeg目录下,并改目录名字为jni(名字必须位jni,否则会出现如下的错误)。

另外,下面即将要说到的config.sh脚本和Android.mk文件也要放在这个目录下

四、添加config.sh脚本到jni目录中

在jin目录下创建名为config.sh脚本文件,在里面添加如下的内容

这一步很重要,下面的这个脚本主要是用于生成config.h文件和config.mak文件,否则无法build

下面内容就是config.sh文件了。可点击这里下载:

注意:需要修改cross-prefix、extra-cflags、extra-ldflags的路径

./configure \
    --disable-static \
    --enable-shared \
    --enable-gpl \
    --enable-version3 \
    --enable-nonfree \
    --disable-doc \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-ffserver \
    --disable-avdevice \
    --disable-avfilter \
    --disable-postproc \
    --enable-small \
    --cross-prefix=/home/loulijun/android/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-\
    --enable-cross-compile \
    --target-os=linux \
    --extra-cflags='-I/home/loulijun/android/android-ndk-r6/platforms/android-9/arch-arm/usr/include' \
    --extra-ldflags='-L/home/loulijun/android/android-ndk-r6/platforms/android-9/arch-arm/usr/lib -nostdlib' \
    --arch=arm \
    --disable-symver \
    --disable-debug \
    --disable-stripping \
     
sed -i 's/HAVE_LRINT 0/HAVE_LRINT 1/g' config.h
sed -i 's/HAVE_LRINTF 0/HAVE_LRINTF 1/g' config.h
sed -i 's/HAVE_ROUND 0/HAVE_ROUND 1/g' config.h
sed -i 's/HAVE_ROUNDF 0/HAVE_ROUNDF 1/g' config.h
sed -i 's/HAVE_TRUNC 0/HAVE_TRUNC 1/g' config.h
sed -i 's/HAVE_TRUNCF 0/HAVE_TRUNCF 1/g' config.h

 

五、执行config.sh脚本

首先需要给config.sh权限使其能够执行

$sudo chmod a+x config.sh

执行config.sh脚本

$./config.sh

如果出现如下的样子就说明脚本执行成功了

下面的WARNING可以不用管,不会对使用有影响

六、添加Android.mk文件到jni目录中

我们还需要在jni目录下添加一个Android.mk文件,使其交叉编译,内容如下。

也可以到https://gist.github.com/1126971下载,一样的

 

注意:

1、需要给Android.mk和config.h文件权限

$sudo chmod a+x Android.mk

$sudo chmod a+x config.h

2、网上有些Android.mk文件已经不能适应最新版本了,因为ffmpeg最新版本有些问题,比如jni/liblibavcodec/ac3enc_combined.c在最新的版本中已经没有了,但是又多了一个ac3enc_template.c的文件。虽然更新版本对于开发人员可以使用到更多的功能,但是如果这样乱改的话真的好无语,非常讨厌这种更新版本的不一致性,唉,只是抱怨一下

Android.mk文件内容

现在开始编译ffmpeg,编译这步是最最麻烦的,因为会遇到各种各样不同的问题,不同版本的源码包也是遇到不同的问题,总之听纠结的。

编译很简单,进入jni目录下,执行ndk-build命令即可(如果ndk-build命令未找到,说明你NDK环境没有配好),如果编译失败可以用ndk-build clean清理。

$cd jni

$ndk-build    然后开始编译

编译成功后的结果如下,生成了libffmpeg.so动态库

分享到:
评论

相关推荐

    ubuntu下ndk编译ffmpeg0.8.1

    ubuntu下ndk编译ffmpeg0.8.1,详细介绍了如何将ffmpeg移植到linux下,生成的so动态链接库文件可以直接在android里使用。

    android-ndk(android-ndk-r25b-windows.zip)

    这个压缩包“android-ndk-r25b-windows.zip”包含了NDK的第25个版本,专为Windows操作系统设计。NDK的主要功能是让开发者能够在Android应用中使用原生代码,例如C、C++,以实现高性能计算或利用硬件加速等功能。 **...

    android-ndk(android-ndk-r23b-windows.zip)

    Android-ndk-r23b包含了一系列的编译器、链接器和其他工具,用于将C/C++源代码编译成可以在Android设备上运行的机器码。这个版本可能包含以下组件: 1. **交叉编译工具链**:这些工具链允许你在Windows环境下构建...

    android-ndk(android-ndk-r25b-linux.zip)

    这个“android-ndk-r25b-linux.zip”文件是NDK的一个特定版本,即r25b,专为Linux操作系统设计。在Android应用开发中,NDK扮演着至关重要的角色,它允许开发者使用原生代码(如C和C++)来编写部分应用,以提高性能、...

    编译ffmpeg(ffmpeg6.0+android-ndk-r25c)生成的动态链接库.so文件

    FFmpeg 包含了多种音视频编解码器、过滤器和协议,使得开发者能够轻松地处理各种多媒体数据。它的核心组件包括 libavcodec(编码解码库)、libavformat(容器格式处理库)、libavfilter(视频滤镜库)和 libavutil...

    Android-NDK-clang 编译 FFmpeg 安卓设备能使用的FFmpeg库

    Ubuntu20系统,Android NDK-r21e 编译 FFmpeg4.2.4; 编译出libavcodec.so libavdevice.so、libavfilter.so、libavformat.so、libavutil.so、libswresample.so、libswscale.so;

    ubuntu 下 编译 ffmpeg for Android armv7-a armv8-a

    综上所述,"ubuntu下 编译 ffmpeg for Android armv7-a armv8-a"涉及到的知识点包括Ubuntu环境、FFmpeg项目、Android架构、交叉编译、NDK、配置脚本以及硬件加速等。通过这样的编译过程,我们可以创建针对Android...

    android-ndk(android-ndk-r26b-windows.zip)

    这个压缩包“android-ndk-r26b-windows.zip”包含了NDK的第26个版本,专为Windows操作系统设计。通过这个工具,开发者可以利用原生代码编写高性能、低级别的应用模块,比如图形处理、物理模拟或音频处理等。 在...

    ubuntu下android ndk编译环境搭建详细描述

    1. 配置CMake或NDK-Build:根据项目需求选择合适的构建系统,CMake是Android Studio默认支持的,而NDK-Build适用于老项目。 2. 跨平台兼容性:NDK支持多个CPU架构,如armeabi-v7a、arm64-v8a、x86和x86_64,需要为...

    android-ndk-r8b编译最新ffmpeg方法详解

    这篇教程主要介绍了如何使用`android-ndk-r8b`编译最新版本的FFmpeg,并将其应用于Android应用程序。以下是对整个过程的详细解释: 1. **FFmpeg的安装**: 首先,你需要在Ubuntu 10.04 LTS环境中安装Git,以便克隆...

    用Android_NDK编译FFmpeg,RTSP手机视频

    FFmpeg是一款强大的跨平台音视频处理工具集,能够为开发者提供一系列用于录制、转换以及流化音视频内容的功能。本文将详细介绍如何通过Android NDK(Native Development Kit)编译FFmpeg,并在Android平台上实现RTSP...

    android-ndk(android-ndk-r26b-darwin.zip)

    Android NDK,全称为Native Development Kit,是Google提供的一款用于Android平台的C和C++原生代码开发...在macOS环境下,"android-ndk-r26b-darwin.zip"为开发者提供了在原生环境中构建和调试Android原生代码的平台。

    android-ndk-r20b-windows-x86_64.zip

    本文将深入探讨Android NDK R20B版本,特别是其在64位Windows环境下的应用,以及如何与cygwin、FFmpeg等工具协同工作,实现视频编辑功能的动态库编译。 Android NDK是Google提供的一个开源工具集,它允许开发者在不...

    android-ndk(android-ndk-r26b-linux.zip)

    3. **交叉编译**:NDK包含了一系列的交叉编译工具链,使得开发者可以在Linux主机上编译出针对不同Android架构(如armeabi-v7a, arm64-v8a, x86, x86_64等)的原生库。 4. **性能优化**:对于计算密集型或资源敏感的...

    在ndk9环境下编译ffmpeg

    本教程将详细介绍如何在NDK9环境下编译FFmpeg,以生成适用于Android平台的动态库和静态库。 首先,你需要准备以下环境: 1. 安装Android NDK r9,这是Android原生开发工具包,提供了在本地编写C/C++代码并运行在...

    curl-7.83.1源代码编译的android库,android-ndk-r20b编译64位

    ./configure --prefix=/usr/local/android --host aarch64-linux-android --with-pic --disable-shared make -j4;make install 在wsl下面用ndk20编译的, aarch64-linux-android29-clang++ aarch64-linux-android-...

    android-ndk(android-ndk-r23b-linux.zip)

    这个“android-ndk-r23b-linux.zip”文件是NDK的一个特定版本,即r23b,专为Linux操作系统设计。在Android应用开发中,NDK扮演着至关重要的角色,它允许开发者使用原生代码(如C和C++)来编写部分应用,以提升性能或...

    2.2.4-Shell脚本编写与执行编译ffmpeg库.zip

    - 在Android环境中,可能需要使用`ndk-build`命令来编译FFmpeg,该命令会自动调用`make`并应用Android特定的构建规则。 5. **FFmpeg的集成**: - 编译完成后,将生成的静态库(`.a`文件)或动态库(`.so`文件)...

    ndk自带hello-jni工程测试ndk编译ffmpeg2.2的所有so库

    针对之前有的小伙伴说使用hello-jni测试 NDK-r9编译好的最新的FFmpeg2.2的所有so库和头文件 的时候。在使用cygwin编译jni的时候会报错:”undefined reference to 'avcodec_version'“ 的问题,所以现在把本人在...

Global site tag (gtag.js) - Google Analytics