我目前正在为Java Sound SPI实现编解码器。我已经到了一个阶段,我将不得不改变AudioInputStream的某些行为(因此必须覆盖它)。但是,“样本框架”的措辞对我没有任何意义。我的编解码器中的样本量和帧数是非常不同的数字和含义。那么在本课程的背景下,它的含义是什么?
例如,frameLength记录为“此流的长度,在示例帧中”。流的长度不等于流中的帧数。
framePos记录为“此流中的当前位置,采样帧(从零开始)。”这是否意味着它保存了当前流所在的帧或流所在的样本?
等
答案 0 :(得分:1)
'样本帧'表示在所有通道上包含单个样本的帧。因此对于8位单声道,这是1字节,对于16位立体声,它是4字节(2个通道,每个样本2个字节)。 AudioInputStream
从传递给构造函数的AudioFormat
中获取此大小。
frameLength
和framePos
始终以此大小为单位。
AudioInputStream
总是尝试读取完整数量的示例帧,以便应用程序代码不必处理获取帧的一部分。
答案 1 :(得分:0)
对于像PCM这样的编码,帧由给定时间点的所有通道的样本集组成,因此帧的大小(以字节为单位)总是等于样本的大小(以字节为单位)通道数量的倍数。但是,对于一些其他类型的编码,帧可以包含一系列压缩数据,用于整个系列的样本,以及其他非样本数据。对于这样的编码,采样率和采样大小是指解码为PCM后的数据,因此它们与帧速率和帧大小完全不同。
因此,如果您的编解码器压缩音频,例如mp3, frame 更像是一个压缩的数据块,它的大小与你在未压缩的PCM编码中遇到的样本大小相关性较小(更多关于mp3帧的信息可以找到{{3} })。
所以frameLength
文档中的AudioInputStream
实际上只是意味着此流中的总帧数。
或者在压缩音频的上下文中更清楚:压缩块的数量。
使用stream = AudioSystem.getAudioInputStream(file)
读取压缩音频时,会返回压缩流以及正确的AudioFormat
实例。然后,用户需要使用decompressedStream = AudioSystem.getAudioInputStream(PCM_SIGNED, stream)
等内容解压缩流。
不幸的是,这经常被误解。