Java &引用;“样本框架”;在AudioInputStream的上下文中

Java &引用;“样本框架”;在AudioInputStream的上下文中,java,audio,javasound,Java,Audio,Javasound,我目前正在为Java声音SPI实现一个编解码器。我已经到了一个阶段,我将不得不改变的一些行为(因此必须覆盖它)。然而,“样本框架”的措辞对我来说没有任何意义。在我的编解码器中,样本数量和帧数量在数量和意义上都非常不同。那么在这个类的上下文中,它的含义是什么 例如,frameLength记录为“此流的长度,在示例帧中”。流的长度不等于流中的帧数 framePos被记录为“此流中的当前位置,在样本帧中(基于零)”,这是否意味着它保存流当前所在的帧或流所在的样本 等。“采样帧”指在所有通道上包含单个采

我目前正在为Java声音SPI实现一个编解码器。我已经到了一个阶段,我将不得不改变的一些行为(因此必须覆盖它)。然而,“样本框架”的措辞对我来说没有任何意义。在我的编解码器中,样本数量和帧数量在数量和意义上都非常不同。那么在这个类的上下文中,它的含义是什么

例如,frameLength记录为“此流的长度,在示例帧中”。流的长度不等于流中的帧数

framePos被记录为“此流中的当前位置,在样本帧中(基于零)”,这是否意味着它保存流当前所在的帧或流所在的样本


等。

“采样帧”指在所有通道上包含单个采样的帧。对于8位单声道,这是1个字节,对于16位立体声,这是4个字节(2个通道,每个样本2个字节)
AudioInputStream
从传递给构造函数的
AudioFormat
中获取此大小

frameLength
framePos
始终以该大小为单位

AudioInputStream
始终尝试读取完整数量的示例帧,这样应用程序代码就不必处理获取部分帧的问题

来自:

对于PCM之类的编码,帧由给定时间点上所有通道的样本集组成,因此帧的大小(以字节为单位)始终等于样本的大小(以字节为单位)乘以通道数。然而,对于一些其他类型的编码,一个帧可以包含一整系列样本的压缩数据包,以及额外的非样本数据。对于这种编码,采样率和采样大小是指解码到PCM后的数据,因此它们与帧速率和帧大小完全不同

因此,如果您的编解码器像mp3一样压缩音频,则帧更像是压缩的数据块,其大小与未压缩PCM编码中遇到的样本大小关系不大(可以找到有关mp3帧的更多信息)

因此,
AudioInputStream
文档中的
frameLength
实际上只是指该流中的总帧数

或者更清楚地说,在压缩音频的上下文中:压缩块的数量

当使用
stream=AudioSystem.getAudioInputStream(文件)
读取压缩音频时,将返回一个压缩流以及一个适当的
AudioFormat
实例。然后,用户需要使用类似于
decompressedStream=AudioSystem.getAudioInputStream(PCM_SIGNED,stream)
的内容解压缩流

不幸的是,这常常被误解