将ffmpeg OMX编解码器添加到Genymotion Android 4.4.2模拟器

时间:2016-04-21 03:44:35

标签: android ffmpeg genymotion codec

基本问题:

有没有办法在Genymotion Android模拟器中添加新的音频编解码器,只需下载整个Android源码,学习如何构建它,以及创建自己的Android版本?

上下文:

我编写了一个java Android应用程序,它充当音频渲染器,同时也是DLNA / OpenHome服务器和客户端。想想" BubbleUpnp"没有视频。我的主要开发平台是Win8.1。该程序以ActiveState" pure-perl" Windows上的DLNA MediaServer,然后我移植到Ubuntu,几年前我在Android下工作。它非常时髦......所有UI都通过HTTP服务器/ jquery / jquery-ui呈现,由在Android下运行的Ubuntu shell(本身就是一个技巧)提供,为同一个(Android)运行的Chrome提供HTML页面设备。除了"时髦"它有一个主要的缺点,它需要一个有效的IP地址才能工作......因为我无法弄清楚如何让ubuntu为127.0.0.01 localhost设置本地环回设备我使用该应用程序作为"汽车立体声"在我的船上(这是我的家),往往没有连接到互联网。

我很难开始使用Android应用程序开发,因为Eclipse中的Android模拟器的速度非常可怕,并且ADB驱动程序在Win8中的运行时间最长。

然后有一天,大约一年前,我遇到了Genymotion(对作者的称赞),突然间我有一个可行的Android开发环境,所以我添加了一个DLNA服务器的Java实现,然后增长使用Android的MediaPlayer类进入渲染器,并添加充当DLNA控制点的功能,最近还添加了OpenHome服务器和渲染器。

另外,我在各种平台上创建了一个基于ffMpeg的名为fpCalc的程序构建环境,包括Win,Linux和Android x86,arm和arm7设备(bitbucket.org/phorton1/)并进行了一系列广泛的测试,以确定fpcalc指纹的有效性和寿命,发现fpCalc指纹根据它构建的ffmpeg版本而改变,这是一个单独的主题,但在此过程中,至少关于如何构建ffmpeg以及Android共享库,JNI接口等等。

所以现在该程序的Android-Java版本已经超越了旧的perl版本,我正在讨论是否要继续尝试构建perl版本(和/或添加wxPerl UI)。

对我来说,出现的一个问题是Genymotion模拟器不支持WMA解码...因为Android因许可问题等原因而放弃了对WMA的支持,这是一种时光倒流的方式......但我的音乐库在WMA文件中有大量的曲调,我不想"转换"他们,我经过深思熟虑的理念是,我的程序不会修改我已积累或将来会收到的原始媒体文件中的内容,标签或任何内容,而是将其视为"工件&# 34;值得保留"原样"。没有转换可以创建文件"更好"比起它,我希望保留所有音乐的所有原始资源。

所以,我正在思考,哎呀,我可以在7个不同的平台上构建FFMPEG,我看到所有这些引用" OMX FFMPEG Codec Support for Android"在网上,所以我在思考,"我需要做的就是创建OMX组件并以某种方式将其纳入Genymotion"。

我已经研究过OMX,OpenMaxIL,看过Michael Chen的帖子,看到了堆栈溢出问题

如何将ffmpeg编解码器组件作为OMX组件

Android:如何将解码器集成到多媒体框架

和Cedric Fung的页面https://vec.io/posts/use-android-hardware-decoder-with-omxcodec-in-ndk,以及https://github.com/omxcodec的Michael Chen的存储库,以及网络上提到libstagefright,OMX的任何组合的几乎所有其他页面,Genymotion和FFMPEG。

(这个页面不会让我放两个以上的链接,因为我没有&#34; 10&#34;声誉,或者我会列出一些我见过的来源。)< / p>

我的Linux开发环境是在我的win机器上运行的Ubuntu12.04 vbox。我已经下载并运行Android-x86 iso作为vbox,而IT包含ffmpeg编解码器,但不幸的是,它既不支持wifi接口,也不支持vbox&#34; guest添加&#34;,所以它有一个非常时髦的老鼠。我尝试了大约3天来解决这两个问题,但最后不觉得它对我的瞳孔有用,而且我非常喜欢genymotion&#34;感觉&#34;的方式,特别是moust支持,所以我&# 39; d喜欢把genymotion作为我的&#34; windows android&#34;我可以运行程序的虚拟设备,弃用并停止使用旧的perl源,

除了genymotion不支持WMA文件...

几个旁注:

(a)没有好的方法可以在Java中编写单个源代码应用程序,在Windows中本机运行,也可以作为Android应用程序运行。

(b)我不想将我的Windows机器重启到真正的&#34; Android设备只是为了播放我的音乐文件。机器必须留在Windows中,因为我也用它来做其他事情。

(c)我正在写这篇文章,因为我的机器是在将整个ASOP源代码库下载到我的Ubuntu vbox中的分区的第36个小时,而我坐在一个不太好的互联网连接的酒店房间里在巴拿马巴拿马城之前,我回到我的船在遥远的博卡斯德尔托罗巴拿马,在那里互联网连接更糟。

(d)通过从Java调用我的FFMPEG可执行文件(将其转换为WAV / PCM或AAC),我确实通过WMA解码在我的应用程序中工作,但是,由于Android的MediaPlayer的限制,它确实不能很好地工作,特别是对于远程托管的WMA文件... MediaPlayer坚持在开始播放之前让整个文件存在,这可能需要几秒或更长时间,我希望通过获得真正的&#39 ; MediaPlayer下面的WMA编解码器,这个问题就会消失......

所以,我试图弄清楚这一切。有很多诱人的线索和建议,但我发现的,或者至少我开始相信的是,如果我想在Android(Genymotion)中添加一个简单的WMA音频解码编解码器,我不仅可以必须先下载整个ASOP Android源代码树,并学习一套新的工具(repo等),但我必须(能够)从头开始重建整个Android系统,尤其是。 libstagefright.so以完全兼容GenyMotion中现有的方式,同时添加ffmpeg编解码器ala Michael Chen的页面。

而我只是问,是不是真的那么难?

无论如何,这让我发疯了。有没有办法只是构建一个新的组件,或者最坏的是一个新的OMX核心,并将其添加到Genymotion,而不是构建所有的Android,最好只基于OMX h文件?或者我真的必须替换现有的libstagefright.so,这意味着,基本上,重建所有的Android ......

P.S。我觉得把它弄清楚,构建它,然后在可供其他人使用的地方发布可安装的新FFMPEG编解码器会很好,这样他们就不会在耳朵上长出疣并且蒸汽射出他们的眼球,虽然他们老了试图搞清楚......

1 个答案:

答案 0 :(得分:0)

Hi Photon,感谢荣誉,非常感谢:D

首先,我不知道你何时下载了你的设备,但是很长一段时间我们都没有提供4.4.2而是4.4.4。

如果您启动4.4.4设备并打开/etc/media_codecs.xml文件,您可以看到列出我们嵌入的ffmpeg解码器的这些行:

    <!-- ffmpeg audio codecs -->                                           
    <MediaCodec name="OMX.ffmpeg.aac.decoder"    type="audio/mp4a-latm" /> 
    <MediaCodec name="OMX.ffmpeg.wma.decoder"    type="audio/x-ms-wma" />  
    <MediaCodec name="OMX.ffmpeg.ra.decoder"     type="audio/vnd.rn-realaudio" />
    <MediaCodec name="OMX.ffmpeg.flac.decoder"   type="audio/flac" />            
    <MediaCodec name="OMX.ffmpeg.mp2.decoder"    type="audio/mpeg-L2" />         
    <MediaCodec name="OMX.ffmpeg.ac3.decoder"    type="audio/ac3" />             
    <MediaCodec name="OMX.ffmpeg.ape.decoder"    type="audio/x-ape" />           
    <MediaCodec name="OMX.ffmpeg.dts.decoder"    type="audio/vnd.dts" />         
    <MediaCodec name="OMX.ffmpeg.pcm.decoder"    type="audio/x-pcm" />           
    <MediaCodec name="OMX.ffmpeg.atrial.decoder" type="audio/ffmpeg" />          

WMA是其中的一部分。你应该尝试下载一个新的4.4.4设备,你的问题就会解决。

此外,我们的音频支持已经延长,如果Kitkat设备没有完成这项工作,可能会有更新版本(检查5.0,5.1或6.0)。

那么如果你终于做不到了。我不建议你自己添加一个新的编解码器,即使通过黑客攻击系统文件并部分编译AOSP也是可能的。这将是复杂的,可能根本不可能。

一个好的解决方案是使用替代媒体播放器,包括您需要的所有编解码器。然后,您将直接将此媒体播放器及其库嵌入您的原生应用程序中,并使用它而不是Android MediaPlayer。我的第一个建议是使用提出standalone libVLC版本的VLC。我已经用过了它真的很棒。您可以在网上找到其他第三方库。

我希望它对你有所帮助。