Ffmpeg 无处不在,自然android系统少不了它,折腾了不少时间完成 ndk编译ffmpeg,生成so库中引用了外部库librtmp,libx264。条条大路通罗马,

也许还有别的更好的方法去完成它,我没有仔细研究。我使用的方法完全可以达到我的预期目的。

一.选择编译环境

可以选择windows下cygwin,也可以选择linux系统,我建议选择后者。花了很多时间在cygwin下编译,configure时总是提示链接需要的so文件找不到。无奈

之下转到linux环境下编译。我用的版本是ubuntu16.04。编译android版本的ffmpeg注意注意的地方有三个:一是configure时带入的参数,二是放置将要用

到的第三方库(so),最后一个是修改configure文件。下面听我一一道来。

一. 创建一个shell脚本文件build_ffmpeg.sh用来引入configure参数,这个文件的格式是unix,如果文件是dos格式,可以用uedit转换格式。

创建的shell脚本内容如下:

  

#!/bin/sh
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
NDK=/home/wgg/wgg/android-ndk-r11c
SYSROOT=$NDK/platforms/android-/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
./configure \
--prefix=$PREFIX \
--target-os=linux \
--enable-cross-compile \
--enable-runtime-cpudetect \
--disable-asm \
--arch=arm \
--enable-nonfree \
--enable-shared \
--enable-version3 \
--enable-gpl \
--disable-programs \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-doc \
--enable-avresample \
--disable-everything \
--enable-decoder=pcm_alaw \
--enable-decoder=pcm_mulaw \
--enable-decoder=mpeg4 \
--enable-decoder=h264 \
--enable-encoder=aac \
--enable-librtmp \
--enable-libx264 \
--enable-parser=aac \
--enable-parser=h264 \
--enable-parser=mpeg4video \
--enable-parser=mpegvideo \
--enable-parser=mpegaudio \
--enable-encoder=libx264 \
--enable-muxer=mpegts \
--enable-muxer=flv \
--enable-muxer=h264 \
--enable-muxer=flv \
--enable-muxer=mp4 \
--enable-muxer=data \
--enable-muxer=avi \
--enable-muxer=mpeg2video \
--enable-muxer=pcm_alaw \
--enable-muxer=pcm_mulaw \
--enable-demuxer=flv \
--enable-demuxer=mpegts \
--enable-demuxer=rtsp \
--enable-protocol=httpproxy \
--enable-protocol=crypto \
--enable-protocol=ftp\
--enable-protocol=unix\
--enable-protocol=pipe \
--enable-protocol=data \
--enable-protocol=file \
--enable-protocol=tcp \
--enable-protocol=http \
--enable-protocol=udp \
--enable-protocol=udplite \
--enable-protocol=rtp \
--enable-protocol=librtmp \
--enable-protocol=librtmpe \
--enable-protocol=librtmps \
--enable-protocol=librtmpt \
--enable-protocol=librtmpte \
--enable-protocol=async \
--enable-protocol=md5 \
--enable-protocol=cache \
--enable-protocol=mmst \
--enable-protocol=mmsh \
--sysroot=$SYSROOT \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--enable-hwaccels \
--enable-zlib \
--disable-devices \
--disable-avdevice \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-cflags="-I/home/wgg/wgg/ffmpeg/extern/include" \
--extra-ldflags="-L/home/wgg/wgg/ffmpeg/extern/lib"

NDK指定NDK包路径,SYSROOT是路径前缀,编译是编译器会去系统路径下(例如/usr/lib,/lib),定义了SYSROOT以后编译原系统路径前加上$SYSROOT,表达式

中android-21要根据实际android重新设定。configure 选项可以根据需要自行删减。--extra-cflags="-I/home/wgg/wgg/ffmpeg/extern/include" 指示外部库的头文件绝对路径,--extra-ldflags="-L/home/wgg/wgg/ffmpeg/extern/lib" 指示外部so库路径。

二. 放置外部库及头文件

将librtmp.so  libx264 libcrypto.so libssl.so 后两个库是第一个库的依赖库放在/home/wgg/wgg/ffmpeg/extern/lib下面。将x264.h, x264_config.h以及rtmp文件夹放在/home/wgg/wgg/ffmpeg/extern/include目录下,rtmp文件夹中文件如下。

三.修改配置文件

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)'
enabled librtmp  && require_pkg_config librtmp librtmp/rtmp.h RTMP_Socket

 修改成

enabled librtmp && require librtmp librtmp/rtmp.h RTMP_Socket -lrtmp

  将

enabled libx264           && { use_pkg_config x264 "stdint.h x264.h" x264_encoder_encode ||
{ require libx264 x264.h x264_encoder_encode -lx264 &&
warn "using libx264 without pkg-config"; } } &&
{ check_cpp_condition x264.h "X264_BUILD >= 118" ||
die "ERROR: libx264 must be installed and version must be >= 0.118."; } &&
{ check_cpp_condition x264.h "X264_MPEG2" &&
enable libx262; }

  

替换为

enabled libx264  && require libx264 x264.h x264_encoder_encode -lx264

  修改build_ffmpeg.sh权限 chmod +x build_ffmpeg.sh

OK,所有的准备工作都做好了。首先./build_ffmpeg.sh,接着make 最后 make install.

注意:我这里用的ffmepg版本是3.0.2,librtmp,libx264基本不用改动,直接引用so不用再去编译了。获取外部引用库请加入QQ群

流媒体/Ffmpeg/音视频 127903734。

anroid ndk编译ffmpeg 引用librtmp libx264的更多相关文章

  1. Linux下NDK编译FFMPEG包含neon参数

    FFMPEG编译成Android库已经有很多案例了,编译优化neon的也很多,以下是我通过实践成功的案例,这里主要讲编译的配置文件,其他设置可结合Linux下使用NDK编译FFMPEG(libstag ...

  2. 64位 CentOS NDK 编译 FFMPEG

    64位 CentOS NDK 编译 FFMPEG 一.           参考文章: http://www.cnblogs.com/baopu/p/4733029.html http://www.c ...

  3. 用Android NDK编译FFmpeg

    附(2018-01-06):     有一个将x264及lame等库集成进去了且基于android的ffmpeg的编译方法,地址参见:       https://github.com/writing ...

  4. [原]如何用Android NDK编译FFmpeg

    我们知道在Ubuntu下直接编译FFmpeg是很简单的,主要是先执行./configure,接着执行make命令来编译,完了紧接着执行make install执行安装.那么如何使用Android的ND ...

  5. 一个小玩具:NDK编译FFmpeg的例子

    FFmpeg NDK编译 和最简单的APK 准备 硬件: 一台电脑,实验在Lenovo T430上 一个Android设备,实验在 三星S3/A7 编译环境: Ubuntu 14.04 (ant\ja ...

  6. Linux下使用NDK编译FFMPEG(libstagefright)

    这个月要负责一个项目,使用FFMPEG渲染视频,主要是Android端的,由于性能要求,要使用硬解码,但网上大多数教程都是没有libstagefright的,所以个人觉得,生成的so库文件也是没有开启 ...

  7. NDK编译FFMpeg[Linux]

    最近在研究视频直播相关的技术,了解到了FFmpeg,就在网上查看如何将FFmpeg移植到Android中,查了几天,看的东西不少,就是没有一个可以完全移植成功的,最后通过产看各种资料,结合网上的资料, ...

  8. FFmpeg编译:Linux下使用NDK编译FFmpeg

    环境: Ubuntu 1.下载并解压FFmpeg3.4.zip(略) 2.将编译脚本放入到FFmpeg解压后的目录. 3.执行编译脚本: ./linux_build_android.sh linux_ ...

  9. Android NDK 编译FFmpeg(不需要复杂的环境变量设置)

    环境: CentOS6.2——64位 借鉴:https://vec.io/posts/how-to-build-ffmpeg-with-android-ndk 在根目录下创建work文件夹:cd  / ...

随机推荐

  1. 推荐5 款WordPress主题后台选项开发框架

    在开发WordPress 主题的时候,借用成熟的WordPress 主题后台选项开发框架可以为我们省下不少功夫.相信你接触过不少国人做的所谓“原创”主题,一看后台都是千篇一律的界面(连CSS 都懒得改 ...

  2. javascript弹窗基础篇

    confirm()意既确认框 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...

  3. eclipse下的Tomcat安装与web项目 搭建

    Tomcat 安装 环境: win10-64位  apache-tomcat-7.0.57-windows-x64 首先要配置Windows 的环境变量 JAVA_HOME(就是Java的环境变量) ...

  4. java虚拟机理解探索1

    以下内容源于个人对<深入java虚拟机>的理解总结 基本概念: java虚拟机可以指一种抽象规范,也可以指一种具体实现,亦可以指一个java虚拟机实例. 虚拟机生命周期: 一个java虚拟 ...

  5. 命名空间 和 class_exist() 问题

    #namespace_test_1.php <?php namespace namespace_test_1; class test { const NAMESPACE = 'namespace ...

  6. 杂项一之js,<select>标签

    一.在aspx页面中实现 修改与删除页面的跳转 前台js部分: 在上部的js部分中写,根据传过来的id,来经行页面的跳转,并把id传过去 js部分就是实现了一个页面跳转的功能 (还有确认框confir ...

  7. FastDFS4 + Ubuntu12安装及部署

    1. 安装libevent 如果需要使用http进行下载,需要安装这个组件. 2. 安装fastdfs 3. 配置fastdfs 4. 安装nginx 问题4.1:安装nginx启动后访问原先资源UR ...

  8. php正则表达式总结第1弹

    介绍几个我用到的php正则表达式 1. 一篇文章的链接,我需要去掉以 /hotels/打头的链接,可用下面正则 $content = preg_replace('/<a(.*?)href=&qu ...

  9. MySQL语法语句大全

    一.SQL速成   结构查询语言(SQL)是用于查询关系数据库的标准语言,它包括若干关键字和一致的语法,便于数据库元件(如表.索引.字段等)的建立和操纵.   以下是一些重要的SQL快速参考,有关SQ ...

  10. 伴随ListView、RecyclerView、ScrollView滚动滑入滑出小图标--第三方开源--FloatingActionButton

    FloatingActionButton在github上的项目主页是:https://github.com/makovkastar/FloatingActionButton 它的依赖包NineOldA ...