如何将 adpcm 数据保存到电话系统中的 wav、mp3 等文件中?

问题描述

电话通讯系统如下。

system

其中,我打算开发一个中继器。 中继器进行 TCP/IP 通信。

分别从 user1 和 user2 接收以字节为单位的 adpcm 数据。

我想将从中继器接收到的数据保存为音频文件

一旦收集了来自一侧(user1)的数据并制成字节数组,我使用 Naudio 创建了一个 wav 文件,但它失败了。

当我使用window10的认播放应用程序播放时,它播放了大约1秒钟并结束。 但总播放时间较长,如6秒7秒。

下面的数据是我创建的wav文件的二进制数据开头的一部分。

52 49 46 46 B4 65 00 00 57 41 56 45 66 6D 74 20 32 00 00 00 02 00 01 00 40 1F 00 00 00 10 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 02 00 FF 00 00 00 00 C0 00 40 00 F0 00 00 00 CC 01 30 FF 88 01 18 FF 66 61 63 74 04 00 00 00 C4 CA 00 6 6 0 7 0 7 6 0 7 6 7 6 08 08 08 08 08 08 08 80 08 08 9A 99 99 90 01 21 21 12 25 53 40 9A B9 91 24 34 11 8A BC AA 80 13 40 01 21 21 8 BA 80 13 49 BB A 2 BB A 2 8 BA 8 BA A9 8A 01 33 33 31 10 1A 0B BB BA A0 91 22 32 11 90 A9 BB BB 9B 11 23 33 41 11 19 9B AB B9 11 22 13 35 BB 919 A 38 BB 19 19 A AB 19 19 A 10 13 14 12 91 90 9B 9B B9 A0 11 13 41 29 29 09 9B AB B9 09 10 13 33 11 A9 BB BB CA 09 00 12 33 33 39 AA 39 09 A 19 09 A 19 09 A 31 41 01 9A 9B 9C 9A 9A 90 01 33 33 21 01 09 9B A9 90 11 11 33 33 21 01 0A 9B 9A 99 01 03 14 10 1 9 1 9 0 1 9 A 10 1 9 1 0 1 9 B 33 01 10 09 99 B0 A0 10 12 13 31 29 99 9B 9A B0 99 90 01 11 21 90 91 09 19 09 10 90 12 03 19 19 99 19 9 99 00 11 13 10 90 99 BA B9 B0 99 00 01 91 00 99 11 99 00 11 01 11 11 11 19 99 11 91 91 11 00 10 9 9 1 9 9 A 10 9 9 1 9 9 10 11 11 21 11 3A 09 99 90 00 31 11 19 10 91 91 11 01 9A

这是我实现的代码(audiodata 是 adpcmdata 的字节数组):

        var adpcmWaveFormat = new AdpcmWaveFormat(8000,1);

        using (WaveFileWriter writer = new WaveFileWriter("D:\\test.wav",adpcmWaveFormat))
        { 
            writer.Write(audiodata,audiodata.Length);
        }

如何将 adpcm 数据保存为音频文件

如何将用户 1 和用户 2 的声音同时保存在一个文件中?

解决方法

文件的标题(来自上面的数据块)对于 8kHz Mono ADPCM 看起来不错。所有这些都是由 NAudio 编写的,所以我希望它们与代码相匹配。该特定文件共有 51,908 个样本(约 6.5 秒),与数据块中的 25,954 字节数据相匹配。到目前为止,一切都很好...如果数据是 Microsoft ADPCM 格式。

不幸的是,有许多 ADPCM 格式都有细微的差异,无论是在编解码器使用的系数、每个样本的位数(从 2 到 6 的任何地方,但最常见的是 4)、支持的采样率和块编码。 G723 曾经在电话中很常见,但您会发现各种各样的。

除了支持的特性(每个样本的位数、通道数、样本频率等)不同之外,不同的格式使用不同的块结构。 IMA/DVI ADPCM 生成带有 4 字节标头的样本块,以纠正漂移并使解码器状态恢复同步。

如果我不得不猜测的话,我会使用类似 Dialogic/OKI ADPCM 的格式。