Android PCM到Ulaw编码wav文件

Chr*_*rch 6 java encoding android pcm

我正在尝试将原始pcm数据编码为uLaw,以节省传输语音数据所需的带宽.

我在这个页面上遇到了一个名为UlawEncoderInputStream的类,但是没有文档!:(

构造函数接受输入流和max pcm值(无论是什么).

  /**
     * Create an InputStream which takes 16 bit pcm data and produces ulaw data.
     * @param in InputStream containing 16 bit pcm data.
     * @param max pcm value corresponding to maximum ulaw value.
     */
    public UlawEncoderInputStream(InputStream in, int max) {
Run Code Online (Sandbox Code Playgroud)

查看代码后,我怀疑我应该使用提供的函数计算这个"max"值:maxAbsPcm.问题是,我真的不明白我的意思是要传递给它!我正在将原始pcm记录到SD卡上的文件中,因此我没有一个连续的内存驻留数据块传递给它.

  /**
     * Compute the maximum of the absolute value of the pcm samples.
     * The return value can be used to set ulaw encoder scaling.
     * @param pcmBuf array containing 16 bit pcm data.
     * @param offset offset of start of 16 bit pcm data.
     * @param length number of pcm samples (not number of input bytes)
     * @return maximum abs of pcm data values
     */
    public static int maxAbsPcm(byte[] pcmBuf, int offset, int length) {
Run Code Online (Sandbox Code Playgroud)

我使用此代码的另一个问题是我不确定要为uLaw数据的标头写出什么值.在使用uLaw进行编码后,如何确定字节数据的减少量?

我已经听过我在VLC媒体播放器中创建的(潜在的)uLaw编码文件之一(我唯一会尝试读取该文件的播放器),它的声音令人讨厌,破碎和点击,但仍能发出声音.

我正在使用类似于我发现的名为WaveHeader的类的代码编写我的wave标头,可以在这里找到!

如果有人对此事有任何想法,我将非常感谢听到他们!:)

非常感谢德克斯特

Jon*_*oni 4

构造函数max中的 是 PCM 数据中的最大幅度。它用于在生成输出之前缩放输入。如果输入声音很大,则需要较高的值,如果输入安静,则需要较低的值。如果你传入0编码器将8192默认使用,这可能就足够了。

\n\n

另一种方法中的length是要从中查找最大幅度的 16 位样本的数量。此类假设输入 PCM 数据始终使用 16 位样本进行编码,这意味着每个样本跨越两个字节:如果您的输入长度为 2000 字节,则您有 1000 个样本。

\n\n

此类中的编码器为每个 16 位 PCM 样本生成一个 8 位 \xc2\xb5-Law 样本,因此字节大小减半。

\n