我正在文件@ 16KBps上写入一些静默PCM数据。该文件为.wav格式。为此,我有以下代码:
#define DEFAULT_BITRATE 16000
long LibGsmManaged:: addSilence ()
{
char silenceBuf[DEFAULT_BITRATE];
if (fout) {
for (int i = 0; i < DEFAULT_BITRATE; i++) {
silenceBuf[i] = '\0';
}
fwrite(silenceBuf, sizeof(silenceBuf), 1, fout);
}
return ftell(fout);
}
更新:这是我写标题的方式
void LibGsmManaged::write_wave_header( )
{
if(fout) {
fwrite("RIFF", 4, 1, fout);
total_length_pos = ftell(fout);
write_int32(0);
fwrite("WAVE", 4, 1, fout);
fwrite("fmt ",4, 1, fout);
write_int32(16);
write_int16(1);
write_int16(1);
write_int32(8000);
write_int32(16000);
write_int16(2);
write_int16(16);
fwrite("data",4,1,fout);
data_length_pos = ftell(fout);
write_int32(0);
}
else {
std::cout << "File pointer not correctly initialized";
}
}
void LibGsmManaged::write_int32( int value)
{
if(fout) {
fwrite( (const char*)&value, sizeof(value), 1, fout);
}
else {
std::cout << "File pointer not correctly initialized";
}
}
我使用NSTimer在iOS设备上以1.0秒的间隔运行此代码。所以AFAIK,如果我运行60秒钟,我应该得到一个file.wav,播放时应该显示60秒钟的持续时间(再次是AFAIK)。但是在实际测试中,它显示了几乎两倍的持续时间,即2分钟。(大约)。我还测试了将DEFAULT_BITRATE更改为8000时的文件持续时间几乎正确。
我无法确定这里发生了什么。我在这里想念一些不好的东西吗?我希望我的代码没有错。
您尝试执行的操作(编写自己的WAV文件)应该完全可行。那是个好消息。但是,我对您的确切参数和约束以及注释中的其他许多约束感到有些困惑,这就是为什么他们一直试图充实细节。
您想将原始的,未压缩的无声PCM写入WAV文件。好的。PCM数据需要多宽?您正在创建要写入文件的字符数组。字符是8位字节。那是你要的吗?如果是这样,则需要使用无声中心点0x80(128)。WAV文件中的8位PCM是无符号的,即0..255,并且128是无声的。
如果打算存储无声的16位数据,该数据将是带符号的数据,因此中心点(在-32768和32767之间)为0。而且,它还将以小尾数字节格式存储。但是由于它是静音(全0),所以没关系。
问题的标题表示(并且第一句重申)您要以16 kbps的速度写入数据。您确定要原始的16 kbps音频吗?那是每秒16千比特,或每秒16000比特。根据您要写入的是8位还是16位PCM样本,这仅允许2000或1000 Hz音频,这可能不是您想要的。您是说16 kHz音频吗?16 kHz音频每秒转换为16000个音频样本,这与您的代码更加一致。再说一次,您的代码中提到了GSM(LibGsmManaged
),所以也许您正在寻找16 kbps的音频。但是我假设我们正在沿原始PCM路线进行。
您事先知道需要写几秒钟的音频吗?这使得此过程非常容易。您可能已经注意到,WAV标头需要在几个位置上提供长度信息。您可以预先编写(如果您知道值),也可以稍后填写(如果您编写的金额不确定)。
假设您正在将2秒的原始,单声道,16000 Hz,16位PCM写入WAV文件。中心点是0x0000。
WAV编写过程:
'RIFF'
'WAVEfmt '
(带空格)'data'
如果您需要写入大量的音频数据,请将步骤2和12中的length字段保留为0,然后在完成写入后再查找并填写这些内容。我不认为您的原始代码正在编写长度字段正确。一些播放软件可能会忽略这些,而其他播放软件可能不会,因此您可能会得到不同的结果。
希望有帮助!如果您了解Python,这是我回答的另一个问题,它描述了如何使用Python的结构库编写WAV文件(在编写上述步骤时,我经常提到该代码片段)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句