织梦CMS - 轻松建站从此开始!

罗索

当前位置: 主页>嵌入式开发>Android>

使用Android NDK8 移植FFmpeg 0.11.1

落鹤生 发布于 2013-01-25 16:45 点击:次 
接下来的工作就是编译armv7-a处理器优化的解码库。新版本的FFmpeg支持调用libstagefright来实现Android上的硬解码H264也是非常吸引人的地方。
TAG:

之前在公司一个项目中一直使用 http://www.cnblogs.com/mcodec/articles/1780598.html 提供的H264 Android解码库
但是经常崩溃,最终定位到mc_dir_part函数中的

  1. qpix_op[luma_xy](dest_y, src_y, s->linesize); //FIXME try variable height perhaps? 

尝试了一晚上也没修复好这个问题,于是打算自己移植FFmpeg
mcodec 兄所做的工作是将H264解码的代码从ffmpeg中提取出来做了深度优化,而本人对FFmpeg 还不甚了解,无法做到提取,而且新版本相互依赖太重,于是将整个FFmpeg 移植过来使用。
在配置时关闭了所有特性,只开启了所需的H264解码库,arm汇编特性,其余全部关闭。
以下是我的配置代码

  1. #!/bin/bash  
  2.  NDKRROOT=/home/aliang/Application/android-ndk 
  3.  PREBUILT=$NDKRROOT/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86 
  4.  PLATFORM=$NDKRROOT/platforms/android-14/arch-arm 
  5.  export PATH=$PATH:$PREBUILT/bin 
  6. FFCONFIG_COMMON=' 
  7.   --enable-version3 
  8.   --disable-gpl 
  9.   --disable-nonfree 
  10.   --disable-everything 
  11.   --enable-decoder=h264 
  12.   --enable-armv5te 
  13.   --disable-ffmpeg 
  14.   --disable-ffplay 
  15.   --disable-ffprobe 
  16.   --disable-ffserver 
  17.   --disable-avfilter 
  18.   --disable-network 
  19.   --disable-avformat  
  20.   --disable-avdevice  
  21.   --disable-swresample  
  22.   --disable-swscale 
  23.   ' 
  24.  ./configure --prefix=$PWD/_install_arm $FFCONFIG_COMMON \ 
  25.      --arch=arm \ 
  26.      --target-os=linux \ 
  27.      --enable-small \ 
  28.      --disable-debug 
  29.      --disable-logging 
  30.      --enable-cross-compile \ 
  31.      --sysroot=$PLATFORM/user \ 
  32.      --sysinclude=$PLATFORM/usr/include \ 
  33.      --cross-prefix=arm-linux-androideabi- \ 
  34.      --extra-ldflags=" -L$PLATFORM/usr/lib -nostdlib  -lc -lm -ldl" \ 
  35.      --extra-cflags="-I$PLATFORM/usr/include -O3" 

JNI部分使用了mcodec兄的代码,编译后so库大小控制在680k 在未开启NEON和VPF的情况下
测试机QSD8250处理器在解码320*240 512Kbps Baseline 视频流的CPU占用为40%左右

接下来的工作就是编译armv7-a处理器优化的解码库。新版本的FFmpeg支持调用libstagefright来实现Android上的硬解码H264也是非常吸引人的地方。

感谢FFMPEG 感谢mcodec 兄。

======================== 9月21日的分割线 ========================

今天分别编译了VPF和NEON两个版本

–enable-armvpf

–enable-neon

开启VPF后在我的测试平台上提升并不明显,下降到38%左右

而开启NEON的版本则非常明显,与上面相同的码率分辨率下,保持在27%的CPU占用

因此 针对armv7-a及以上版本的cpu架构开启NEON优化是非常有必要的。

当然 也更加期待引入libstagefright来实现硬解码

======================== 12月1日的分割线 ========================

经过大量测试,性能瓶颈目前存在于色彩空间转换和缩放

使用libswscale进行这两步操作在arm处理器上没有更好的利用到arm指令集

于是将PINK NOISE的 YUV2RGB ARM汇编版  ( http://wss.co.uk/pinknoise/yuv2rgb) 移植到libswscale中,性能再次大幅提升。依然是上面的码率分辨率,下降到18%~20%。待这部分整理出后给出我的移植代码

(阿亮)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201301/16489.html]
本文出处:贝壳博客 作者:阿亮 原文
顶一下
(3)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容