【发布时间】:2014-08-01 12:53:19
【问题描述】:
我正在尝试使用 Sox 库 C 程序 (http://sox.sourceforge.net/) 将 16KHZ 16 位签名 PCM 编码波形文件转换为 8KHz 8 位 mu 编码 wav 文件。从 PCM 到 mu 的转换工作正常。但是当我应用下采样效果时,输出文件的持续时间只是 i/p 文件的一半(见下文)。我使用了How to change the samples rates when do the format conversion by sox C libraries? 帖子中提到的技术,但对我没有帮助。
当我执行下面的代码时,我看到一个警告
wav: Premature EOF on .wav input file
输出:
Input File : 'text2speech_0.wav'
Channels : 1
Sample Rate : 16000
Precision : 16-bit
**Duration : 00:00:06.24 = 99777 samples ~ 467.705 CDDA sectors**
File Size : 200k
Bit Rate : 256k
Sample Encoding: 16-bit Signed Integer PCM
Input File : 'out_8k.wav'
Channels : 1
Sample Rate : 8000
Precision : 14-bit
**Duration : 00:00:03.12 = 24945 samples ~ 233.859 CDDA sectors**
File Size : 49.9k
Bit Rate : 128k
Sample Encoding: 8bit u-law
代码:
int main(int argc, char * argv[])
{
static sox_format_t * in, * out; /* input and output files */
sox_effects_chain_t * chain;
sox_effect_t * e;
char * args[10];
assert(argc == 3);
assert(sox_init() == SOX_SUCCESS);
assert(in = sox_open_read(argv[1], NULL, NULL, NULL));
assert(out = sox_open_write(argv[2], &in->signal, NULL, NULL, NULL, NULL));
chain = sox_create_effects_chain(&in->encoding, &out->encoding);
e = sox_create_effect(sox_find_effect("input"));
args[0] = (char *)in, assert(sox_effect_options(e, 1, args) == SOX_SUCCESS);
assert(sox_add_effect(chain, e, &in->signal, &in->signal) == SOX_SUCCESS);
free(e);
out->signal.rate = 8000;
in->signal.rate = 16000;
if (in->signal.rate != out->signal.rate) {
e = sox_create_effect(sox_find_effect("rate"));
args[0] = "16000", assert(sox_effect_options(e, 1, args) == SOX_SUCCESS);
assert(sox_add_effect(chain, e, &in->signal, &out->signal) == SOX_SUCCESS);
free(e);
}
if (in->signal.channels != out->signal.channels) {
e = sox_create_effect(sox_find_effect("channels"));
assert(sox_effect_options(e, 0, NULL) == SOX_SUCCESS);
assert(sox_add_effect(chain, e, &in->signal, &out->signal) == SOX_SUCCESS);
free(e);
}
e = sox_create_effect(sox_find_effect("output"));
args[0] = (char *)out, assert(sox_effect_options(e, 1, args) == SOX_SUCCESS);
assert(sox_add_effect(chain, e, &in->signal, &out->signal) == SOX_SUCCESS);
free(e);
sox_flow_effects(chain, NULL, NULL);
sox_delete_effects_chain(chain);
sox_close(out);
sox_close(in);
sox_quit();
return 0;
}
编译与执行:
gcc -g -o example3 example3.c `pkg-config --cflags --libs sox`
./example3 text2speech_0.wav out_8k.wav
【问题讨论】:
-
我不熟悉 Sox lib,所以可能会问一些愚蠢的问题:为什么 'out_8k.wav' 在您的输出中又是“输入文件”。为什么它是“精度:16 位”但您说“到 8KHz 8-bit mu-encoded wav"。为什么要手动为输入文件
in->signal.rate = 16000;指定采样率? -
我们正在传递 out_8k.wav 以便将数据写入那里。精度用于转换/下采样,与编码无关(实际上它的 14 位已在后期更新)。我不必指定输入采样率,尝试不同的东西并错误地添加了它。那行可以去掉
-
我没用过这个库,但是从命令行看
-B Bits你的out->signal.rate和-e encoding的组合表明下采样可以通过PCM存储是否为@ 987654331@。我无法从您的代码中判断这是否与此处相关,但这是检查的一种途径。 -
我尝试将 16KHz PCM 无符号 wav 文件转换为 8KHZ u-law 结果是一样的。在输出文件中只获取一半的输入数据