近日在使用NAudio开源音频库做音频文件分析,业务流程是读取音频文件,然后将音频样本数据推送到第三方,做的过程中遇到一个坑,在此记录。
PCM音频格式的主要数据包括:
名称 | 偏移地址 | 字节数 | 端序 | 内容 | 当前值 |
AudioFormat | 0x08 | 2Byte | 小端 | 音频格式 | 1,PCM音频数据的值为1。则当前没有Fact chunk |
NumChannels | 0x0A | 2Byte | 小端 | 声道数 | 2,表示音频数据的声道数,1:单声道,2:双声道。 |
SampleRate | 0x0C | 4Byte | 小端 | 采样率 | 44100,每秒采样数量 |
ByteRate | 0x10 | 4Byte | 小端 | 每秒数据字节数 | 176400。SampleRate * NumChannels * BitsPerSample / 8 |
BlockAlign | 0x14 | 2Byte | 小端 | 数据块对齐,每个采样所需的字节数 | 4。NumChannels * BitsPerSample / 8 |
BitsPerSample | 0x16 | 2Byte | 小端 | 每个采样保存的位数, | 采样深度16bit。8:8bit,16:16bit,32:32bit |
第三方接口需要同时推送NumChannels,SampleRate,ByteRate,BitsPerSample等数据,我在推送后,发觉声音在对端不正常。
我使用了NAudio提供的通用读取程序 AudioFileReader,他可以读wav、mp3等多种格式的音频,以此作为解析源。
在仔细排查之后,发现我的文件BitsPerSample原本是16bit,但在提供程序返回的数据中变成了32bit,导致对端识别声音数据失败,播放异常。想来应该是NAudioWie了最大程度兼容不同格式执行了数据的自动转换。
得出结论,AudioFileReader返回的音频格式不完全是源音频的格式,如果要获取源音频的格式数据,使用Mp3FileReader或者WavFileReader,或者自己用文件流读取源文件。