2014-08-07 4 views
1

Я пишу фрагмент кода в C для pocketsphinx модуля freeswitch, чтобы сохранить высказывание (сигнал или звук) в файл. Я получаю аудио как void *data и его unsigned int len и должен сохранить его как файл RAW (или PCM) (без заголовков). Как это сделать?Написание сырого звука в файл?

Я попытался это:

FILE *_file; 
int16_t *_data; 
_data = (int16_t *) data; 
_file=fopen("utterance","ab"); 
fwrite(data, sizeof(_data[0]), sizeof(_data)/sizeof(_data[0]), _file); 
fclose(_file); 
_file=NULL; 

Это не работает (Может быть, я не делаю это правильно?). Я также нашел libvlc и libsndfile, но не нашел функции, которая бы обслуживала меня. У кого-нибудь есть простой пример/учебник по этому вопросу?

Я работаю на C, VS2010, Win8.1 (x64)

ответ

1

вы не должны использовать sizeof(_data)/sizeof(_data[0]), когда _data является указателем; sizeof(_data), сколько байт указатель _data принимает

size_t valueCount = sampleCount * channelCount; 
FILE *_file; 
int16_t *_data; 
_data = (int16_t *) data; 
_file=fopen("utterance","ab"); 
fwrite(data, sizeof(_data[0]), valueCount, _file); 
fclose(_file); 
_file=NULL; 

вы также можете использовать

fwrite(data, 1, len, _file); 
+0

Я не могу поверить, как я пропустил это. Я использовал 'fwrite (data, 1, len, _file);' и он работает. Спасибо за тонну Джейка за быстрый и точный ответ! – codedrunk

0

Основная проблема с этим состоит в том, что вы используете sizeof(_data)/sizeof(_data[0]) как попытку вычислить длину массива. Однако, поскольку _data имеет тип int16_t *, то есть просто указатель, то sizeof(_data) вернет размер указателя (что в вашем случае составляет всего 8). Вам понадобится другой способ передать длину массива.

0

sizeof применяется к указателю, не скажет вам, сколько памяти есть «за ним» (указатель Безразлично» t знать, указывает ли он на одну одинокую вещь или на первый элемент массива).
Вместо этого он сообщает вам размер, измеренный в char s, указателя, который обычно составляет 4 или 8 в эти дни.

Поскольку вы знаете, где находятся данные (data) и сколько их есть (len), вам не нужно ничего отличить или рассчитать.

Используйте либо

fwrite(data, 1, len, _file); 

или

fwrite(data, len, 1, _file); 

 Смежные вопросы

  • Нет связанных вопросов^_^