使用G711编码对wav文件进行编码

时间:2015-12-08 09:57:18

标签: c

我正在尝试使用A law编码对PCM未压缩的Wav文件进行编码。 我写了一个函数,它接收16位PCM数据并返回8位编码数据。编码后,我的文件无法正常播放..我觉得有些东西我没有正确处理文件。我有将文件的标题信息分开,并将相同的标题写入输出文件。

<button type="submit" class="btn btn-lg btn-block btn-primary">Sign In</button>

3 个答案:

答案 0 :(得分:1)

您正在使用相同的标题编写数据,这意味着任何音频程序都会认为WAV文件中的数据仍然是PCM。检查file format for WAV并相应更改。

主要是你需要将0x0014-0x0015的音频格式更改为a-law和其他值,以标记每秒正确的字节数,块大小等。

确保它们正确的最简单方法可能是使用音频编辑器转换文件,然后检查值的差异。

答案 1 :(得分:0)

请参阅波形文件的格式

http://www.topherlee.com/software/pcm-tut-wavformat.html

现在检查标头的所有字节,并确保有关比特率,采样率等的所有信息都是正确的。

如果您的压缩代码是正确的,那么问题应该只与头文件有关。

答案 2 :(得分:0)

当您不使用数组时,您的代码是如何编译的?尽管如此,您使用<html> <div class="HARBOURPAGE"></div> <html> function hallTheme(){ document.getElementById("HARBOURPAGE").innerHTML = document.getElementById("mainDIV").outerHTML; } 并不好,请参阅Why is “while ( !feof (file) )” always wrong?

feof

我也注意到您使用#include <stdio.h> #define BUFSIZE 512 int main(void) { short inbuff[BUFSIZE]; // must be an array unsigned char outbuff[BUFSIZE]; // must be an array size_t bread, i; unsigned char temp_8; short temp_16; FILE *inp, *out; // ... open the file // ... transcribe the header // rewrite the data while ((bread = fread(inbuff, 2 , BUFSIZE, inp)) > 0) { for (i=0; i < bread; ++i) // only the data actually read { temp_16 = inbuff[i]; temp_8 = Lin2Alaw(temp_16); outbuff[i] = temp_8; } fwrite(outbuff, 1 , bread, out); // only the data actually read } // ... finish off and close the file return 0; } 作为16位数据 - 应该是signed short吗?