`
byebyegov5qq
  • 浏览: 1244884 次
文章分类
社区版块
存档分类
最新评论

Android多媒体开发(3)————使用Android NKD编译havlenapetr-FFMpeg-7c27aa2

 
阅读更多

/********************************************************************************************
* author:conowen@大钟
* E-mail:conowen@hotmail.com
* http://blog.csdn.net/conowen
* 注:本文为原创,仅作为学习交流使用,转载请标明作者及出处。

********************************************************************************************/


1、

使用NDK去编译官方的FFmpeg原版的话,还得自己实现JNI层与java层工程量比较大。所以移植FFmpeg到Android平台时,可以移植一些已经实现JNI与JAVA层的开源项目,毕竟软件行业从来都是站在巨人肩膀上发展的。


2、移植havlenapetr/FFMpeg


havlenapetr的开源项目是比较出名的一个FFmpeg工程,很多Android多媒体项目都是在此基础上面修改的。


下载地址:https://github.com/havlenapetr/FFMpeg

可以直接ZIP包:https://github.com/havlenapetr/FFMpeg/zipball/debug

或者通过git方式下载,新建一个目录,然后在linux的终端下执行,当然了,你要事情安装git的相关工具

3、利用NDK编译生成so库


下载后直接在havlenapetr-FFMpeg-7c27aa2的顶级目录下执行

是可以编译通过的,不会提示任何error。

关于如何利用NDK编译,可以参考我之前的博文:http://blog.csdn.net/conowen/article/details/7518870


4、导入java工程,实现播放

然后把在eclipse里面,把havlenapetr-FFMpeg-7c27aa2这个项目import进来,就可以播放视频了。


4.1、需要注意的是:这个版本的havlenapetr FFmpeg工程只能在Android 2.2上面运行,因为havlenapetr采用的是音视频直接在JNI层输入。可以注意到havlenapetr-FFMpeg-7c27aa2目录下有prebuilt这样一个目录,此目录下有Android 2.2版本的libjniaudio.so和libjnivideo.so两个库文件。


4.2、Android版本不同导致不能播放:

havlenapetr的FFmpeg项目音视频输出如下

音频:采用Android底层的audiotrack输出。

视频:在FFmpeg解码之后,得到YUV信号,然后转换成RGB信号,最终通过Android底层的surface输出。


提示:可以移植SDL开源库实现音视频输出,因为SDL的视频输出机制是通过OPenGL呈现画面,这样就可以兼容所有的Android平台。


但是问题就来了,Android每个版本的framework都是不大一样的,所以要在底层使用Android的audiotrack和surface来输入音视频信号,就要在相应版本的Android源代码中,重新编译生成libjniaudio.so和libjnivideo.so两个库文件了。


5、编译havlenapetr FFmpeg工程Android 2.3版本的libjniaudio.so和libjnivideo.so

首先要明白一点,Android的官方源代码编译之后,是不会生成libjniaudio.so和libjnivideo.so的。所以要自己添加audiotrack.cpp、surface.cpp和Android.mk文件到Android源代码里面编译生成。(每次编译libjniaudio.so和libjnivideo.so都要重新编译这个Android源代码,时间比较长。)


5.1下载audio与video文件夹

可以在https://github.com/havlenapetr/android_frameworks_base下载audiotrack.cpp、surface.cpp和Android.mk,注意要选择正确的branch(分支)

froyo---->Android 2.2

gingerbread---->Android 2.3

ICS---->Android 4.0


5.2、编译Android系统源代码

下载之后,然后找到里面的native文件夹,把里面的audio和video文件夹拖进Android源代码的frameworks/base/native目录下。

需要注意的一点是:

gingerbread下载之后,里面是没有audio和video文件夹的,但是可以用froyo版本的audio和video文件夹。(也就是下载gingerbread感觉也没啥用Orz~~~)

但是我们可以使用froyo的audio和video文件夹,编译Android源代码是可以成功通过的,ndk-build也可以通过,但是在Android的java工程里面使用就会有以下错误信息。

加载库时,找不到mSruface类
修改方法是:
将surface.cpp中mSurface改为 mNativeSurface ,然后重新编译即可。当然了,你也可以用ICS的surface.cpp文件,这个版本是没有问题的。


另外编译havlenapetr FFmpeg工程Android 4.0版本的libjniaudio.so和libjnivideo.so与上面步骤差不多。


/************************************************************************/

附上我所使用的audio与video(来源havlenapetr的项目)

video/jni/surface.cpp(注意目录结构)


video/jni/Android.mk(注意目录结构)


/audio/jni/audiotrack.cpp(注意目录结构)


/audio/jni/Android.mk(注意目录结构)







分享到:
评论
1 楼 light-chen 2012-05-30  


你好,很感謝你分享這麼有用的心得文,我這2天將havlenapetr/FFMPEG 的source抓下來,用 ndk r6去直接編譯他,
邊玩正常會在libs/armeabi/ 下也出現 libffmpeg_jni.so ,libjniaudio.so,libjnivideo.so

之後也將 android 2.2 導入進去成一可執行的專案檔,但執行的過程中,選擇要撥放的影片後,在DDMS下的log會出現

05-30 04:32:20.783: D/dalvikvm(31073): Trying to load lib /data/data/cz.havlena.ffmpeg.ui/lib/libjniaudio.so 0x40d23dd8
05-30 04:32:20.783: D/FFMpeg(31073): Couldn't load lib: jniaudio - Cannot load library: find_library[1204]: 140 'libjniaudio.so' failed to load previously
05-30 04:32:20.783: D/dalvikvm(31073): Trying to load lib /data/data/cz.havlena.ffmpeg.ui/lib/libjnivideo.so 0x40d23dd8
05-30 04:32:20.783: D/FFMpeg(31073): Couldn't load lib: jnivideo - Cannot load library: find_library[1204]: 140 'libjnivideo.so' failed to load previously
05-30 04:32:20.783: D/dalvikvm(31073): Trying to load lib /data/data/cz.havlena.ffmpeg.ui/lib/libffmpeg_jni.so 0x40d23dd8
05-30 04:32:20.783: D/FFMpeg(31073): Couldn't load lib: ffmpeg_jni - Cannot load library: find_library[1204]: 140 'libffmpeg_jni.so' failed to load previously
05-30 04:32:20.783: D/FFMpegPlayerActivity(31073): Error when inicializing ffmpeg: Couldn't load native libs


我想主要就是一開始連load lib都進不來
Couldn't load lib libjniaudio.so,libjnivideo.so,libffmpeg_jni.so

不知道是甚麼問題,不是原本這專案編譯完後,在android 2.2下是可以正常執行嗎?

非常感謝你




相关推荐

    android nkd demo 2示例

    在android上学习使用jni技术,也就是ndk。在应用层java调用c代码,并在c中回调java代码的示例,值得学习参考,具体请查看:http://blog.csdn.net/jan_s/article/details/43833443

    android-ndk-r10e各种操作系统的下载

    Android NDK(Native Development Kit)是Google提供的一个工具包,它允许开发者使用C或C++来开发Android应用的部分功能,从而实现更高效的性能优化。R10e版本的Android NDK进一步提升了对原生开发的支持,并引入了...

    NKD环境搭建需要的jar

    在Android开发领域,NDK(Native Development Kit)是一种重要的工具集,它允许开发者使用C、C++等原生代码编写应用程序,以实现高性能计算或利用硬件特性。在标题"NKD环境搭建需要的jar"中,提到的核心是与NDK环境...

    android ndk

    Android NDK(Native Development Kit)是Google为Android平台提供的一款用于开发原生代码的工具集。它允许开发者使用C++和其他本地语言编写高性能、低级别的应用程序模块,这些模块可以与Java代码相互调用,极大地...

    NDK 命令编译生成Android动态so或可运行程序Demo

    NDK 命令编译生成Android动态so或可运行程序Demo,欢迎下载,本demo需要配置好NKD 环境变量,并修改Demo中NDK 指向的头文件路径后,执行cmd命令即可生成

    NDK编译工具链脚本

    backup the script , Licensed under the Apache License

    seeface 基于androidstudio2.2.2 的android 实现

    而且一些训练库没有集成进系统,这样只要下载本应用源代码,编译完就可以使用,由于资源库比较大100多MB,在编译的时候也比较慢,最后apk也有100多MB,总之这是一站式打包功能来在android上来验证seeface。...

    debuggable-ndk-example:有关如何使用nkd-build命令使用稳定gradle 2.2.2链接本机模块的简单示例

    在Android开发中,有时我们需要利用Native Development Kit (NDK)来编写C或C++代码,以便利用硬件的高性能计算能力或者使用已有的C/C++库。`debuggable-ndk-example`项目是一个针对如何在使用稳定版Gradle 2.2.2时,...

    ndk示例代码

    Android NDK(Native Development Kit)是Google为Android平台提供的一套工具集,它允许开发者使用C和C++等原生代码来开发Android应用的一部分。在Android应用开发中,NDK主要用于处理性能敏感的部分,如图形处理、...

    NDK JNI的学习

    NDK(Native Development Kit)是Android开发中的一个重要工具集,它允许开发者在Android应用中使用C/C++代码,从而利用底层的性能优化和硬件访问能力。JNI(Java Native Interface)是Java平台的一部分,提供了一个...

    android-pbc:一个小型Android库,其中包含PBC库和JPBC库的Android版本

    jpbc-pbc是本身,使用nkd-build 。 gmp是; 由中国人民银行用于其计算。 jnidispatch来自 ,是.so文件包含在文件中。 这些构建中的每一个都包含在ARM和ARMv7平台中。用法假设您使用gradle,请执行以下步骤: git ...

    androidNKD输出log

    在Android开发中,Native Development Kit (NDK) 是一个允许开发者使用C和C++编写原生代码的工具集。NDK 提供了与Java层交互的能力,同时也支持在原生代码中进行调试和日志输出,这对于性能优化、底层硬件交互以及...

    各种版本的NDK

    包含四个版本的ndk,ndk10c-mac,ndk10c-windwos,ndk11-windows,ndk12b

    PDF_Viewer:基于 mupdf gradle

    #Android MUPDF 库项目(GRADLE)# ... 所有 ndk 构建机制都是由 gradle 完成的。 ...* nkd-build command 编译后的 .so 文件放在 src/main/obj/local 基于 Gradle 的 PDF 垂直滚动视图演示项目# 这是

    基于Java的NKD迎新考试系统设计源码

    该系统是一款基于Java核心技术的NKD迎新考试系统设计源码,集成了986个文件,其中Java源文件172个,JavaScript文件210个,XML文件162个,PNG图片103个,JSP文件79个,CSS文件39个,以及Less、SCSS、Properties、...

    条形码生成

    在iOS开发中,条形码生成是一个常见的需求,特别是在零售、物流、库存管理等领域。NKD(可能是指“NativeKit”或某个开发者的名字)提供的解决方案是针对Xcode 7及iOS 9设计的,这意味着它应该兼容这两个版本的特性...

    miniPrinter:支持Android的蓝牙打印机

    迷你打印机 支持Android的蓝牙打印机 ...编辑文件“ ./wnprinter/local.properties” 更改“ sdk.dir =(您的Android-SDK路径)” 更改“ ndk.dir =(您的Android-NKD路径)” 3.导入wnprinter 4.构建

    house-styles-nkd:切线Snowball房屋风格存储库的准系统版本,可用于快速原型制作

    TS House风格NKD 切线Snowball房屋风格存储库的准系统版本,可用于快速原型制作该存储库基于 此存储库中有一个gulpfile.js ,可加快房屋风格的开发速度。 您需要做的只是: 安装Node( )和Gulp( ) 运行npm ...

    0.74Pb( Mg1/3 Nb2/3 ) O3-0.26PbTiO3薄膜的光学性能研究 (2011年)

    采用磁控溅射法,选用LaNiO3( LNO)作为缓冲层和电极层,在硅基片上成功地制备出了0.74Pb( Mg1/3Nb2/3) O3-0.26PbTiO3( PMN-0.26PT)铁电薄膜.X射线衍射(XRD)分析表明薄膜具有沿(110)方向择优取向的钙钛矿结构.利用NKD...

    ndk-8d.tar.gz

    nkd sdk ant and jdk is the neccesery tools in develop the android

Global site tag (gtag.js) - Google Analytics