使用libsox降级wav文件

我试图用Sox库C程序( http://sox.sourceforge.net/ )将16KHZ 16位有符号的PCM编码波形文件转换成8KHz 8位mu编码的wav文件。 从PCM到mu的转换工作正常。 但是,当我应用下采样效果输出文件的持续时间只是一半的I / P文件(见下文)。 我使用了后文中提到的技术如何更改采样率当sox C库格式转换时? 但它并没有帮助我。

当我执行下面的代码时,我看到一个警告

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 

贝娄是一个工作代码的差异。 我认为主要的错误在于,“开放”结构在开放之前必须先写好。

 +#include <sox.h> +#include <assert.h> +#include <stdlib.h> +#include <string.h> + + int main(int argc, char * argv[]) + { + static sox_format_t * in, * out; /* input and output files */ +@@ -7,9 +13,15 @@ assert(argc == 3); assert(sox_init() == SOX_SUCCESS); assert(in = sox_open_read(argv[1], NULL, NULL, NULL)); + out= (sox_format_t *) malloc(sizeof (sox_format_t)); + memcpy(out, in, sizeof (sox_format_t)); + out->encoding.encoding = SOX_ENCODING_ULAW; + out->encoding.bits_per_sample=8; + out->signal.rate = 8000; + out->signal.precision = 8; + out->signal.length = SOX_UNSPEC; + assert(out = sox_open_write(argv[2], &out->signal, &out->encoding, NULL, NULL, NULL)); - assert(out = sox_open_write(argv[2- 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")); @@ -17,16 +29,14 @@ 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_effect_options(e, 0, NULL) == SOX_SUCCESS); + e->handler.flags |= SOX_EFF_LENGTH; + assert(sox_add_effect(chain, e, &in->signal, &out->signal) == SOX_SUCCESS); free(e);