2012-10-26 62 views
4

我正在构建一款适用于android的应用程序,它可以在队列播放器中以浮点形式播放pcm数据。据我所知,这是不可能的。 description说:Android上的OpenSL ES替代方案

SL_DATAFORMAT_PCM不允许应用程序将数据表示形式指定为有符号整数,无符号整数或浮点数。 Android实现假定8位数据是无符号整数,16位是有符号整数。另外,现场samplesPerSec是一个用词不当,因为实际单位是毫赫兹。预计这些问题将在下一次OpenSL ES版本中得到解决,该版本将引入一种新的扩展PCM数据格式,该格式允许应用程序明确指定表示并纠正字段名称。由于这将是一种新的数据格式,并且当前的PCM数据格式仍然可用(虽然不推荐使用),但它不应要求立即对代码进行更改。

是否有机会获得通过opensl ES这项工作(1.0.1)或有针对Android NDK到opensl ES替代?

回答

2

你可以把你浮点波形成到符号16位和饲料这OpenSL。

既然你需要访问波形数据,以将其提供给OpenSL,它应该是直截了当地做在运行时转换 - 没有太多的开销。

OpenSL是要求存储器地址,以保持有效,直到它不再需要它。所以你可以使用一个中间缓冲区来转换它并重新使用它。

这就是我做到的。事实上,我只使用一个流,并在软件中进行所有源混合。

+0

是的,那就是我当时所做的。但我认为在opensl中可能有一个选项,那对我来说就是这样。 – andre

1

您可以为了进行这种转换使用的ffmpeg。它具有特定的库以及用于此目的的一组API,全部在libresample/avresample.h中定义。我找不到任何有关如何操作的信息或任何教程,但通过查看头文件本身就足够了。这是非常简单的:

http://ffmpeg.org/doxygen/trunk/avresample_8h.html

希望这可以帮助你!

0

SND_PCM_FLOAT是Android L以上的支持。

但是,它仍然可能是有意义的自己做转换。目前不能保证任何特定的设备本身都会支持浮点输出。即使在硬件支持浮动的设备上,内核或Android HAL也可能未被设置为利用它。所以会有一些软件转换。如果您要用软件进行转换,您最好自己动手,以便您可以选择自己的范围校正和抖动算法。