代码之家  ›  专栏  ›  技术社区  ›  Robert Davis

如何将G.726 ADPCM信号转换为PCM信号?

  •  3
  • Robert Davis  · 技术社区  · 14 年前

    我通常会查看sox或window内置的音频库,但似乎它们都没有g.726编解码器。

    所以我有一个字节序列,我知道它被编码为g.726,尽管比特率和它是mu律还是a律目前还不知道(实验将决定这些参数),我需要将它们解码成一个正常的pcm信号。

    所以我从itu-t(itu-t建议g.191)下载了参考实现,但是我对如何使用 G726_decode 功能。根据文件 inp_buf out_buf 需要同样的长度 smpno 两个缓冲区都是16位缓冲区。在我看来,这似乎缺少一个步骤;否则使用g.726就无法完成压缩。根据维基百科网页 G.726 样本大小取决于比特率(从2位到5位)。我是不是应该自己把样本减压?所以如果我假设最大压缩(2位样本),那么每个字节将产生4个样本。

    例子:

    char b = /* read the code from input */
    short inp[4], output[4];
    inp[0] = b & 0x0003;
    inp[1] = b & 0x000C >> 2;
    inp[2] = (b & 0x0030) >> 4;
    inp[3] = (b & 0x00C0) >> 6;
    G726_state state;
    memset(&state, 0, sizeof(G726_state));
    G726_decode(inp, output, 4, "u", 2, 1, &state);
    /* ouput now contains 4 PCM samples */
    

    还是我完全错过了什么?

    1 回复  |  直到 14 年前
        1
  •  5
  •   Nik Reiman    14 年前

    看起来ffmpeg实际上无法做到这一点,因为我认为它肯定能够…然而,当我在谷歌上搜索时,我发现了这个 post to the ffmpeg mailing list 这提供了一个解决方案。

    基本上,有一个单独的程序叫做 g72x++ 它似乎能够为您解码音频到原始的pcm。