0

在我的 android 应用程序(音频处理)中,我使用 long 类型变量来计算它被暂停的位置,但该应用程序给了我对于大型音频文件的奇怪结果。经过一番努力,我发现位置计算超出了 android 的限制。尽管 java 中的 long 类型的最小值为 -9,223,372,036,854,775,808,最大值为 9,223,372,036,854,775,807,但我想知道为什么我的计算超出了限制。

在浏览了一些帖子后,我发现 android 支持有限的值范围,这与 java 不同。但我的问题是如何在 android 中执行此计算?是否有任何其他 android 特定的数据类型?

这是我在我的应用程序中执行的计算: position=((bufferSize*currentPosition)/duration);

4

2 回答 2

4

正如我在评论中所指出的,您从中获取信息的帖子完全不正确。long始终为 64 位。NIO 可能有一些限制,但那是另一回事。

但是,您的问题可以很容易地解释,而无需任何技巧。这是您的代码:

position = (bufferSize * currentPosition) / duration;

你还没有说和的类型是什么bufferSizecurrentPosition但我假设它们是long. 如果你有一个非常大的缓冲区和一个“迟到”currentPosition的值,那么乘法的结果可能会溢出成负数。当您将该负数除以 时duration,您仍然会得到一个负数(但幅度较小)。

如果bufferSizecurrentPositionint变量而不是long,则溢出将发生得更快。实际上,如果是这种情况,那么您很可能只需通过强制以 64 位完成算术来解决您的问题:

position = ((long)bufferSize * currentPosition) / duration;

您应该根据您的缓冲区大小计算出这将达到什么范围currentPosition- 老实说,我希望它适用于任何合理大小的文件长度和缓冲区大小组合。

如果这没有帮助,请发布更多信息 - 包括变量类型和您正在观察的值(对于所有变量,包括结果)。

于 2012-05-01T05:59:35.410 回答
0

就像@Jon Skeet 一样,我想很长一段时间就足够了。但在 long 不够大的情况下,您可以考虑将您的 bufferSize 除以一千或一百万。您会失去一些精度,但结果仍会接近您正在寻找的结果:您将以千字节或兆字节为单位来近似缓冲区“充满度”,而不是以字节为单位的值。

于 2012-05-01T05:57:03.383 回答