ffmpeg是一套开源的,完整的流媒体解决方案。基于它可以很轻松构建一些强大的应用程序。对于流媒体这个行业,ffmpeg就像圣经一样的存在。为了表达敬意,在这里把ffmpeg官网的一段简介搬过来,ffmpeg是:

A complete, cross-platform solution to record, convert and stream audio and video. 
https://ffmpeg.org/ ]

我们这里要讲的是基于FFMPEG开发的一款易用的音频解码库,目前支持aac、g711u/a、g726三种格式,后续可以按需求支持更多的格式。该库的代码将在EasyDarwin平台上开源。

首先,安卓平台使用ffmpeg,需要交叉编译出安卓平台上的ffmpeg库,这个编译过程网上已经有许多前辈们贡献出来了,并且不少都得到了ffmpeg的引荐(https://trac.ffmpeg.org/wiki/CompilationGuide/Android),我便是从这里找到了编译方法。需要注意的是,有些编译是基于老版本的ffmpeg,不建议大家使用。我用的是第一个链接,Github上WritingMinds的项目:https://github.com/WritingMinds/ffmpeg-android,这个链接会直接从Github上获取ffmpeg最新的源码。

我们这里其实与WritingMinds的项目有所不同,我们需要的是音频解码,项目里的x264, libass, fontconfig等库我们都不需要(很遗憾的是用git clone的时候,会把这些子项目也获取下来。我觉得也可以不用git clone,手动下载作者的项目+ffmpeg就行。但是我没试^_^)。于是我们先要对原项目做一些修改:

- init_update_libs.sh:

将以“wget”打头的几行,注释掉,在每一行开头加上#即可注释。这样就不会下载这些第三方库了。文件内容最终更改为:

#!/bin/bash

echo "============================================"
echo "Updating submodules"
git submodule update --init
echo "============================================"
echo "Updating libpng, expat and fribidi"
rm -rf libpng-*
rm -rf expat-*
rm -rf fribidi-*
rm -rf lame-* #wget -O- ftp://ftp.simplesystems.org/pub/libpng/png/src/libpng16/libpng-1.6.21.tar.xz | tar xJ
#wget -O- http://downloads.sourceforge.net/project/expat/expat/2.1.0/expat-2.1.0.tar.gz | tar xz
#wget -O- http://fribidi.org/download/fribidi-0.19.7.tar.bz2 | tar xj
#wget -O- http://sourceforge.net/projects/lame/files/lame/3.99/lame-3.99.5.tar.gz | tar xz
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

- ffmpeg_build.sh:

内容更改为:

#!/bin/bash

. abi_settings.sh $1 $2 $3

pushd ffmpeg

case $1 in
armeabi-v7a | armeabi-v7a-neon)
CPU='cortex-a8'
;;
x86)
CPU='i686'
;;
esac make clean ./configure \
--target-os="$TARGET_OS" \
--cross-prefix="$CROSS_PREFIX" \
--arch="$NDK_ABI" \
--cpu="$CPU" \
--enable-runtime-cpudetect \
--sysroot="$NDK_SYSROOT" \
--disable-debug \
--disable-ffserver \
--disable-ffplay \
--disable-ffprobe \
--enable-gpl \
--disable-everything \
--enable-decoder=aac \
--enable-decoder=adpcm_g726 \
--disable-doc \
--disable-shared \
--enable-static \
--pkg-config="${2}/ffmpeg-pkg-config" \
--prefix="${2}/build/${1}" \
--extra-cflags="-I${TOOLCHAIN_PREFIX}/include $CFLAGS" \
--extra-ldflags="-L${TOOLCHAIN_PREFIX}/lib $LDFLAGS" \
--extra-cxxflags="$CXX_FLAGS" || exit 1 make -j${NUMBER_OF_CORES} && make install || exit 1 popd
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

其中–disable-everything表示不使能一切不需要的组件,–enable-decder=aac和enable-decoder=adpcm_g726分别表示使能aac和g726解码库。关于使能和不使能的相关选项,可参考:http://stackoverflow.com/questions/24849129/compile-ffmpeg-without-most-codecs,将不需要的组件禁用了,可使我们编译过程加快,同时编译出来的库文件体积更小。经测试,加上–disable-everything后,libavcodec.a仅仅800多k,而不带这个选项,会达到14M。

- settings.sh:

可修改SUPPORTED_ARCHITECTURES,来指定支持的CPU架构。比如我为了方便,仅支持了armeabi-v7a的架构。 
可修改ANDROID_API_VERSION来指定NDK的版本,这个在这里就不用改了。 
可修改NDK_TOOLCHAIN_ABI_VERSION来更改toolchain的版本。现在最新的ndk-r10e已经是4.9了,因此更改为4.9。 
该文件最终更改为:

#!/bin/bash

SUPPORTED_ARCHITECTURES=(armeabi-v7a)
ANDROID_NDK_ROOT_PATH=${ANDROID_NDK}
if [[ -z "$ANDROID_NDK_ROOT_PATH" ]]; then
echo "You need to set ANDROID_NDK environment variable, please check instructions"
exit
fi
ANDROID_API_VERSION=9
NDK_TOOLCHAIN_ABI_VERSION=4.9 NUMBER_OF_CORES=$(nproc)
HOST_UNAME=$(uname -m)
TARGET_OS=linux CFLAGS='-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fno-strict-overflow -fstack-protector-all'
LDFLAGS='-Wl,-z,relro -Wl,-z,now -pie' FFMPEG_PKG_CONFIG="$(pwd)/ffmpeg-pkg-config"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

修改文笔,可以开始编译了,执行./android_build.sh。如果顺利的话,会生产build/armeabi-v7a目录,其中包含

  • bin 可执行文件目录,我们这里用不到
  • include 头文件路径,我们需要包含这里的.h来封装解码接口
  • lib 静态库路径,我们需要链接这些静态库,来生产可调用的动态库
  • share 该目录不知道有啥用,我们这里用不到

OK,ffmpeg Android编译成功!我们需要的文件已经生成了,下一节我们会讲述如何封装解码器接口。

EasyDarwin开源音频解码项目EasyAudioDecoder:基于ffmpeg的安卓音频(AAC、G726)解码库(第一部分,ffmpeg-android的编译)的更多相关文章

  1. EasyDarwin开源音频解码项目EasyAudioDecoder:EasyPlayer Android音频解码库(第二部分,封装解码器接口)

    上一节我们讲了如何基于ffmpeg-Android工程编译安卓上的支持音频的ffmpeg静态库:http://blog.csdn.net/xiejiashu/article/details/52524 ...

  2. 我的开源权限管理项目BeCore (基于.net core开发)

    首先 谢谢大家还记得我.. 新年快乐 祝大家工作顺利 事事顺心 人见人爱 车见车载 冬不寒 下雨有伞 全身哪都不疼 就是有人疼 ~~ Github地址:https://github.com/baby8 ...

  3. EasyDarwin开源团队招募开发组成员

    EasyDarwin开源流媒体服务器项目招募开发组成员,共同更新和维护EasyDarwin流媒体服务器,决策EasyDarwin后续开发方向: 加入要求: 1.对开源流媒体项目有浓厚兴趣: 2.有一定 ...

  4. EasyDarwin开源流媒体server将select改为epoll的方法

    本文来自EasyDarwin团队Fantasy(fantasy(at)easydarwin.org) 一. EasyDarwin网络模型介绍 EventContext负责监听全部网络读写事件.Even ...

  5. EasyCamera Android安卓移动视频监控单兵设备接入EasyDarwin开源流媒体云平台

    前言 随着Android系统的不断更新和发展,现在越来越多的硬件产品选择用安卓系统作为运行环境,电视机,机顶盒.门禁.行车记录仪.车载系统.单兵设备等等,Android系统底层还是Linux,但对上层 ...

  6. EasyDarwin开源流媒体服务器将select改为epoll的方法

    本文来自EasyDarwin团队Fantasy(fantasy(at)easydarwin.org) 一. EasyDarwin网络模型介绍 EventContext负责监听所有网络读写事件,Even ...

  7. 开源编解码项目FFmpeg迎来20周年生日 凭一己之力养活全球无数播放器!

    近日,开源编解码库项目FFmpeg迎来20周年生日. 2000.12.20-2020.12.20 可能很多人对于FFmpeg不是特别了解,那么以下几个名字是否大家或多或少都用过呢? 暴风影音.PotP ...

  8. EasyDarwin开源流媒体项目

    本文转自EasyDarwin CSDN官方博客:http://blog.csdn.net/easydarwin EasyDarwin是由国内开源流媒体团队维护和迭代的一整套开源流媒体视频平台框架,从2 ...

  9. 基于EasyDarwin开源流媒体服务器框架实现EasyNVR H5无插件直播流媒体服务器方案

    背景分析 在之前的一篇博客<web无插件播放RTSP摄像机方案,拒绝插件,拥抱H5!>中,描述了实现一套H5无插件直播方案的各个组件的参考建议,又在博客<EasyNVR H5流媒体服 ...

随机推荐

  1. ng-include

    ng-include可以作为标签或者属性来使用,作用是引入公用文件. <div ng-include="'header.html'"></div> 注意里面 ...

  2. 转 C++构造函数、析构函数、虚函数之间的关系

    C++构造函数.析构函数.虚函数之间的关系 1. 如果我们定义了一个构造函数,编译器就不会再为我们生成默认构造函数了.2. 编译器生成的析构函数是非虚的,除非是一个子类,其父类有个虚析构,此时的函数虚 ...

  3. 转 Python爬虫入门四之Urllib库的高级用法

    静觅 » Python爬虫入门四之Urllib库的高级用法 1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我 ...

  4. Android 4.4 不休眠+不锁屏+默认中文+去除导航栏

    1.不休眠 frameworks/base/packages/SettingsProvider/res/values/defaults.xml 里面60000改成-1,就是不进入休眠. 这个文件还保存 ...

  5. 无密码登录Linux

    配置主机A无密码登录主机B 主机A:192.168.1.110 主机B:192.168.1.111 先确保所有主机的防火墙处于关闭状态. 在主机A上执行如下: 1. $cd ~/.ssh 2. $ss ...

  6. DOM节点太多导致页面卡顿的优化方法

    http://developer.51cto.com/art/201504/473422.htm

  7. Codeforces Gym101606 C.Cued In (2017 United Kingdom and Ireland Programming Contest (UKIEPC 2017))

    C Cued In 这个题是打球的.都忘了写的什么了... 代码: 1 #include<iostream> 2 #include<cstring> 3 #include< ...

  8. "从客户端中检测到有潜在危险的 Request.Form 值"的解决方案汇总

    #事故现场 在一个asp.net 的项目中,前端通过ajax将富文本中的文字内容post到服务端的一个ashx中,在ashx中尝试读取参数值时, 结果报错:“从客户端中检测到有潜在危险的 Reques ...

  9. RabbitMQ 消费端限流、TTL、死信队列

    目录 消费端限流 1. 为什么要对消费端限流 2.限流的 api 讲解 3.如何对消费端进行限流 TTL 1.消息的 TTL 2.队列的 TTL 死信队列 实现死信队列步骤 总结 消费端限流 1. 为 ...

  10. sqlserverinternals.com

    http://sqlblog.com/blogs/kalen_delaney/default.aspx https://sqlserverinternals.com/