将 ffmpeg OMX 编解码器添加到 Genymotion Android 4.4.2 模拟器
Adding ffmpeg OMX codec to Genymotion Android 4.4.2 emulator
基本问题:
有没有办法将新的音频编解码器添加到 Genymotion Android 模拟器,而不是下载整个 Android 源代码,学习如何构建它,并创建我自己的 Android?
上下文:
我编写了一个 java Android 应用程序作为音频渲染器,同时也是 DLNA/OpenHome 服务器和客户端。想想 "BubbleUpnp" 没有视频。我的主要开发平台是Win8.1。该程序以 Windows 上的 ActiveState "pure-perl" DLNA 媒体服务器开始,然后我将其移植到 Ubuntu,几年前我在 Android 下工作。这非常时髦......所有 UI 都通过 HTTP server/jquery/jquery-ui 呈现,从 Ubuntu shell 运行ning 在 Android 下提供(这本身就是一个技巧),在同一 (Android) 设备上为 Chrome 运行 提供 HTML 页面。除了 "funky" 它还有一个主要缺点,它需要一个有效的 IP 地址才能工作......因为我无法弄清楚如何让 ubuntu 为 127.0.0.01 本地主机提供本地环回设备我在我的船(这是我的家)上使用该应用程序作为 "car stereo",它通常没有连接到互联网。
我很难开始 Android 应用程序开发,因为 Eclipse 中的 Android 仿真器的速度非常糟糕,而且 ADB 驱动程序在 Win8 中运行的时间最长。
然后有一天,大约一年前,我 运行 进入 Genymotion(感谢作者),突然间我有了一个可用的 Android 开发环境,所以我添加了一个Java DLNA 服务器的实现,然后它也成长为一个渲染器,使用 Android 的 MediaPlayer class,并且添加了充当 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 文件曲调,我不想 "convert" 它们,我深思熟虑的理念是我的程序不会修改内容、标签或任何东西在我积累的或将来会收到的原始媒体文件中,而不是将它们视为 "artifacts" 值得保留 "as is"。没有任何转换可以使文件 "better" 比原来更好,我希望为我的所有音乐保留所有原始来源。
所以,我在想,哎呀,我可以在 7 个不同的平台上构建 FFMPEG,我在网上看到所有这些对 "OMX FFMPEG Codec Support for Android" 的引用,所以我在想,"All I need to do is create the OMX Component and somehow get it into Genymotion" .
学习了OMX,OpenMaxIL,看过Michael Chen的posts,看过堆栈溢出题
如何将ffmpeg编解码器组件制作成OMX组件
和
Android: 如何将解码器集成到多媒体框架
和 Cedric Fung 的页面 https://vec.io/posts/use-android-hardware-decoder-with-omxcodec-in-ndk, and Michael Chen's repository at https://github.com/omxcodec,以及网络上提到 libstagefright、OMX、Genymotion 和 FFMPEG 任意组合的几乎所有其他页面。
(此页面不允许我放置超过 2 个链接,因为我没有“10”的声誉,否则我会列出一些我看到的来源)..
我的 Linux 开发环境是 Ubuntu12.04 vbox 运行ning 在我的 win 机器上。我已经下载 运行 Android-x86 iso 作为 vbox,它包含 ffmpeg 编解码器,但不幸的是,它既不支持 wifi 接口,也不支持 vbox "guest additions",所以它有一个非常时髦的鼠标。这两个问题我试了3天左右,但最后感觉对我的pupros没用,而且genymotion的方式我很喜欢"feels",特别是moust支持,所以我想将 genymotion 作为我的 "windows android" 虚拟设备,我可以在其下 运行 我的程序,弃用并停止使用我的旧 perl 源,
除了 genymotion 不支持 WMA 文件...
几个旁注:
(a) 没有好的方法可以在 Java 中编写 运行 本机在 Windows 中并作为 Android 应用程序的单一来源应用程序。
(b) 我不想将我的 Windows 机器重新启动到 "real" Android 设备来播放我的音乐文件。这台机器必须留在 Windows,因为我也用它做其他事情。
(c) 我正在写这篇文章,因为我的机器正处于将整个 ASOP 源代码库下载到我的 Ubuntu vbox 中的分区的第 36 小时,而我正坐在旅馆房间里- 在我 return 到我在偏远的巴拿马 Bocas Del Toro 的船上之前,巴拿马巴拿马城的互联网连接非常好,那里的互联网连接更差。
(d) 通过从 Java 调用我的 FFMPEG 可执行文件(将其转换为 WAV/PCM 或 AAC),我确实让 WMA 解码在我的应用程序中工作,但是,由于 Android 的 MediaPlayer,效果不佳,特别是对于远程托管的 WMA 文件...通过在 MediaPlayer 下获取 'real' WMA 编解码器,这个问题就会消失....
所以,我正试图解决这整个混乱局面。有很多诱人的线索和建议,但我发现的,或者至少我开始相信的是,如果我想向 Android (Genymotion) 添加一个简单的 WMA 音频解码编解码器,我不仅要下载,基本上,整个 ASOP Android 源代码树,学习一套新的工具(repo 等),而且我必须(能够)从头开始重建整个Android 系统,特别是。 libstagefright.so 以与 GenyMotion 中现有的完全兼容的方式,同时在 Michael Chen 的页面上添加 ffmpeg 编解码器。
我只是想问,真的有那么难吗?
无论如何,这让我发疯。有没有办法只构建一个新组件,或者最坏的情况是一个新的 OMX 核心,并将其添加到 Genymotion,而不构建所有 Android,最好只基于 OMX h 文件?或者我真的必须更换现有的 libstagefright.so,这意味着,基本上,重建所有 Android ...
p.s。我认为最好弄清楚它,构建它,然后 post 可安装的新 FFMPEG 编解码器在某个地方供其他人使用,这样他们的耳朵就不会长疣并进行蒸汽射击从他们的眼球中脱颖而出,当他们变老时试图弄清楚....
嗨 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。我已经使用过它,它真的很棒。您可以在网上找到其他第三方库。
希望对你有所帮助。
基本问题:
有没有办法将新的音频编解码器添加到 Genymotion Android 模拟器,而不是下载整个 Android 源代码,学习如何构建它,并创建我自己的 Android?
上下文:
我编写了一个 java Android 应用程序作为音频渲染器,同时也是 DLNA/OpenHome 服务器和客户端。想想 "BubbleUpnp" 没有视频。我的主要开发平台是Win8.1。该程序以 Windows 上的 ActiveState "pure-perl" DLNA 媒体服务器开始,然后我将其移植到 Ubuntu,几年前我在 Android 下工作。这非常时髦......所有 UI 都通过 HTTP server/jquery/jquery-ui 呈现,从 Ubuntu shell 运行ning 在 Android 下提供(这本身就是一个技巧),在同一 (Android) 设备上为 Chrome 运行 提供 HTML 页面。除了 "funky" 它还有一个主要缺点,它需要一个有效的 IP 地址才能工作......因为我无法弄清楚如何让 ubuntu 为 127.0.0.01 本地主机提供本地环回设备我在我的船(这是我的家)上使用该应用程序作为 "car stereo",它通常没有连接到互联网。
我很难开始 Android 应用程序开发,因为 Eclipse 中的 Android 仿真器的速度非常糟糕,而且 ADB 驱动程序在 Win8 中运行的时间最长。
然后有一天,大约一年前,我 运行 进入 Genymotion(感谢作者),突然间我有了一个可用的 Android 开发环境,所以我添加了一个Java DLNA 服务器的实现,然后它也成长为一个渲染器,使用 Android 的 MediaPlayer class,并且添加了充当 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 文件曲调,我不想 "convert" 它们,我深思熟虑的理念是我的程序不会修改内容、标签或任何东西在我积累的或将来会收到的原始媒体文件中,而不是将它们视为 "artifacts" 值得保留 "as is"。没有任何转换可以使文件 "better" 比原来更好,我希望为我的所有音乐保留所有原始来源。
所以,我在想,哎呀,我可以在 7 个不同的平台上构建 FFMPEG,我在网上看到所有这些对 "OMX FFMPEG Codec Support for Android" 的引用,所以我在想,"All I need to do is create the OMX Component and somehow get it into Genymotion" .
学习了OMX,OpenMaxIL,看过Michael Chen的posts,看过堆栈溢出题
如何将ffmpeg编解码器组件制作成OMX组件
和
Android: 如何将解码器集成到多媒体框架
和 Cedric Fung 的页面 https://vec.io/posts/use-android-hardware-decoder-with-omxcodec-in-ndk, and Michael Chen's repository at https://github.com/omxcodec,以及网络上提到 libstagefright、OMX、Genymotion 和 FFMPEG 任意组合的几乎所有其他页面。
(此页面不允许我放置超过 2 个链接,因为我没有“10”的声誉,否则我会列出一些我看到的来源)..
我的 Linux 开发环境是 Ubuntu12.04 vbox 运行ning 在我的 win 机器上。我已经下载 运行 Android-x86 iso 作为 vbox,它包含 ffmpeg 编解码器,但不幸的是,它既不支持 wifi 接口,也不支持 vbox "guest additions",所以它有一个非常时髦的鼠标。这两个问题我试了3天左右,但最后感觉对我的pupros没用,而且genymotion的方式我很喜欢"feels",特别是moust支持,所以我想将 genymotion 作为我的 "windows android" 虚拟设备,我可以在其下 运行 我的程序,弃用并停止使用我的旧 perl 源,
除了 genymotion 不支持 WMA 文件...
几个旁注:
(a) 没有好的方法可以在 Java 中编写 运行 本机在 Windows 中并作为 Android 应用程序的单一来源应用程序。
(b) 我不想将我的 Windows 机器重新启动到 "real" Android 设备来播放我的音乐文件。这台机器必须留在 Windows,因为我也用它做其他事情。
(c) 我正在写这篇文章,因为我的机器正处于将整个 ASOP 源代码库下载到我的 Ubuntu vbox 中的分区的第 36 小时,而我正坐在旅馆房间里- 在我 return 到我在偏远的巴拿马 Bocas Del Toro 的船上之前,巴拿马巴拿马城的互联网连接非常好,那里的互联网连接更差。
(d) 通过从 Java 调用我的 FFMPEG 可执行文件(将其转换为 WAV/PCM 或 AAC),我确实让 WMA 解码在我的应用程序中工作,但是,由于 Android 的 MediaPlayer,效果不佳,特别是对于远程托管的 WMA 文件...通过在 MediaPlayer 下获取 'real' WMA 编解码器,这个问题就会消失....
所以,我正试图解决这整个混乱局面。有很多诱人的线索和建议,但我发现的,或者至少我开始相信的是,如果我想向 Android (Genymotion) 添加一个简单的 WMA 音频解码编解码器,我不仅要下载,基本上,整个 ASOP Android 源代码树,学习一套新的工具(repo 等),而且我必须(能够)从头开始重建整个Android 系统,特别是。 libstagefright.so 以与 GenyMotion 中现有的完全兼容的方式,同时在 Michael Chen 的页面上添加 ffmpeg 编解码器。
我只是想问,真的有那么难吗?
无论如何,这让我发疯。有没有办法只构建一个新组件,或者最坏的情况是一个新的 OMX 核心,并将其添加到 Genymotion,而不构建所有 Android,最好只基于 OMX h 文件?或者我真的必须更换现有的 libstagefright.so,这意味着,基本上,重建所有 Android ...
p.s。我认为最好弄清楚它,构建它,然后 post 可安装的新 FFMPEG 编解码器在某个地方供其他人使用,这样他们的耳朵就不会长疣并进行蒸汽射击从他们的眼球中脱颖而出,当他们变老时试图弄清楚....
嗨 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。我已经使用过它,它真的很棒。您可以在网上找到其他第三方库。
希望对你有所帮助。