4

我正在为需要的 android 构建一个应用程序,将队列播放器中的 pcm 数据作为浮点数播放。据我所知,这是不可能的。描述

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

有没有机会通过 openssl es (1.0.1) 完成这项工作,或者对于 android ndk 是否有替代 opensl es 的方法?

4

3 回答 3

2

您可以将浮点波形转换为有符号的 16 位,并将其提供给 OpenSL。

由于您需要访问波形数据才能将其提供给 OpenSL,因此在运行时进行转换应该很简单——没有太多开销。

OpenSL 要求内存位置保持有效,直到它不再需要它。因此,您可以使用中间缓冲区进行转换并重新使用它。

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

于 2013-02-20T12:59:04.727 回答
1

您可以使用 ffmpeg 来执行此类转换。它具有特定的库以及用于此目的的一组 API,所有这些都在 libresample/avresample.h 中定义。我找不到太多信息或任何关于如何做到这一点的教程,但是通过查看头文件本身就足够了。这很简单:

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

希望这对你有帮助!

于 2013-04-07T22:36:06.903 回答
0

Android L 及更高版本支持 SND_PCM_FLOAT。

但是,自己进行转换可能仍然有意义。目前,不能保证任何特定设备都会原生支持浮点输出。即使在硬件支持浮动的设备上,内核或 Android HAL 也可能无法设置为利用它。所以会在某个时候进行软件转换。如果您要为软件转换付费,您不妨自己动手,这样您就可以选择自己的范围校正和抖动算法。

于 2016-06-14T13:15:09.603 回答