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

3

基本问题:

除了下载整个Android源代码,学习如何构建它并创建自己的Android版本之外,是否有一种方法可以向Genymotion Android模拟器添加新的音频编解码器?


背景:

我写了一个Java Android应用程序,作为一个音频渲染器,同时也是一个DLNA / OpenHome服务器和客户端。类似于“BubbleUpnp”,但没有视频功能。我的主要开发平台是Win8.1。该程序最初是在Windows上作为ActiveState“纯Perl”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服务器和渲染器也加入其中。
另外,我创建了一个名为fpCalc的程序构建环境,基于ffMpeg,在各种平台上进行了测试,包括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文件,并且我不想“转换”它们。我精心考虑过的哲学是,我的程序不会修改我积累或将来收到的原始媒体文件中的内容、标签或任何其他东西,而是将它们视为值得保留“原样”的“工件”。没有转换会使文件比原来更好,我希望保留所有未来所有音乐的全部原始来源。
所以,我在想,我可以在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,以及Michael Chen在https://github.com/omxcodec上的存储库,几乎所有提到libstagefright、OMX、Genymotion和FFMPEG组合的网页都包括在内。

(由于我没有“10”声望,这个页面不允许我放置超过2个链接,否则我会列出一些我看到的来源)..

我的Linux开发环境是在Windows机器上运行的Ubuntu12.04虚拟机。我已经下载并运行了Android-x86镜像作为虚拟机,其中包含ffmpeg编解码器,但不幸的是,它既不支持wifi接口,也不支持vbox“guest additions”,所以它的鼠标非常奇怪。我尝试了大约3天来解决这两个问题,但最终感觉无法满足我的需求,而且我真的很喜欢genymotion的“感觉”,特别是鼠标支持,所以我想将genymotion作为我的“windows android”虚拟设备,在其下运行我的程序,弃用并停止使用我的旧perl源代码。
除了genymotion不支持WMA文件之外...

几个小笔记:

(a) 没有好的方法可以在Java中编写单一源应用程序,既可以在Windows本地运行,又可以作为Android应用程序。

(b) 我不想将我的Windows机器重新启动为“真正的”Android设备,只是为了播放我的音乐文件。该机器必须保持在Windows中,因为我还要用它做其他事情。

(c) 当我坐在巴拿马城的酒店房间里,使用不太好的互联网连接,在我的Ubuntu vbox分区中下载整个ASOP源代码库已经36个小时了。之后我会回到我位于偏远的巴拿马博卡斯德尔托罗的船上,那里的互联网连接甚至更差。

(d) 通过从Java调用我的FFMPEG可执行文件(将其转换为WAV / PCM或AAC),我确实使我的应用程序能够解码WMA,但由于Android MediaPlayer的限制,它效果不佳,特别是对于远程托管的WMA文件... MediaPlayer坚持在开始播放之前需要整个文件存在,这可能需要几秒钟甚至更长时间,我希望通过在MediaPlayer下面获取一个“真正”的WMA编解码器,这个问题就会消失....


所以,我正在试图解决这个混乱的问题。有许多诱人的线索和建议,但是我所发现的,或者至少我开始相信的是,如果我想向Android(Genymotion)添加一个简单的WMA音频解码编解码器,不仅必须下载基本上整个ASOP Android源代码树,并学习一组新工具(repo等),而且必须(能够)从头开始重建整个Android系统,特别是libstagefright.so,使其与GenyMotion中现有的完全兼容,同时添加ffmpeg编解码器,比如Michael Chen的页面。
我只是想问,难道真的那么困难吗?
无论如何,这让我感到疯狂。有没有办法只构建一个新组件,或者最坏的情况下,只基于OMX h文件将其添加到Genymotion中,而不必构建整个Android系统?还是说我真的必须替换现有的libstagefright.so,这基本上意味着重新构建整个Android系统...
附言:我认为弄清楚这个问题并构建它,然后在某个地方发布可安装的新FFMPEG编解码器供其他人使用会很好,这样他们就不必像我一样长了耳朵上的疣子,眼珠里冒着蒸汽,同时变老尝试弄清楚它...
1个回答

0

嗨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。我的第一个建议是使用VLC,他们提供了适用于此的独立的libVLC版本。我已经使用过它,非常棒。还有其他第三方库可以在网上找到。

希望对你有所帮助。


1
感谢您抽出时间来,我只是假设 Genymotion 在未来的版本中不包括 WMA 解码器。 根据您的建议,我已经下载并测试了我的应用程序与 GM 4.4.4 设备一起,查看了 media_codecs.xml,并且我的程序现在在带有 WMA 文件的 GM 上正常工作。 您的答案为我节省了无数个小时的怀疑性工作。 再次感谢您辛勤的工作和伟大的产品,我相信这使许多开发人员能够进行 Android 应用程序开发。 - photon
嗨,Photon,再次感谢。我真的很高兴你喜欢它。我认为你现在可以将你的问题标记为已解决了。干杯! - eyal-lezmy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接