Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как записать WAV файл?

82K
14 июня 2012 года
Gizm0
5 / / 14.06.2012
Доброго дня! Пытаюсь записать WAV файл из массива данных полученных с помощью библиотеки bass, а именно функции BASS_ChannelGetData. Записываю данные следующим образом:

Код:
BASS_ChannelPlay(chan, FALSE); // play it
BASS_ChannelGetInfo(chan,&info);
T=BASS_ChannelBytes2Seconds(chan, BASS_ChannelGetLength(chan, BASS_POS_BYTE));
strcpy(wh.chunkId, "RIFF");
strcpy(wh.format, "WAVE");
strcpy(wh.subchunk1Id, "fmt ");
strcpy(wh.subchunk2Id, "data");
wh.numChannels=info.chans;
wh.sampleRate=info.freq;
wh.bitsPerSample=info.origres;
wh.subchunk1Size=16;
wh.subchunk2Size=T*wh.sampleRate*wh.numChannels*wh.bitsPerSample/8;
wh.chunkSize=4+(8+wh.subchunk1Size)+(8+wh.subchunk2Size);
wh.audioFormat=0x0001;
wh.byteRate=wh.sampleRate*wh.numChannels*wh.bitsPerSample/8;
wh.blockAlign=wh.numChannels*wh.bitsPerSample/8;
fwrite(&wh,sizeof(WAVHEADER),1,fp);
while (BASS_ChannelIsActive(chan)!=BASS_ACTIVE_STOPPED)
{
BASS_ChannelGetData(chan,fft,4096);
 
fwrite(fft,sizeof(fft),1,fp);
}
Файл записывается и воспроизводится, но внутри сплошной шум. Может кто знает что надо исправить? Или подскажите другой способ записи.
414
14 июня 2012 года
CassandraDied
763 / / 24.05.2012
Смотреть, что возвращает.
Цитата:
If an error occurs, -1 is returned, use BASS_ErrorGetCode to get the error code. When requesting FFT data, the number of bytes read from the channel (to perform the FFT) is returned. When requesting sample data, the number of bytes written to buffer will be returned (not necessarily the same as the number of bytes read when using the BASS_DATA_FLOAT flag). When using the BASS_DATA_AVAILABLE flag, the number of bytes in the channel's buffer is returned.


Вообще, там неплохая документация. Стоило бы покурить.

82K
15 июня 2012 года
Gizm0
5 / / 14.06.2012
Если я Вас правильно понял, то нудно исправить следующим образом:
 
Код:
int size=BASS_ChannelGetData(chan,fft,4096|BASS_DATA_AVAILABLE);
fwrite(fft,size,1,fp);
Но это ничего не изменило
414
15 июня 2012 года
CassandraDied
763 / / 24.05.2012
Конечно, потому что это бессмысленный код.
Проверь, какое число возвращает функция и, если это -1, то вызови BASS_ErrorGetCode. В документации к библиотеке написаны, какие коды какие ошибки обозначают.
82K
15 июня 2012 года
Gizm0
5 / / 14.06.2012
szie = 4096, а BASS_ErrorGetCode = 0. Я так понимаю, что последний флаг и делает этот код бессмысленным?
414
15 июня 2012 года
CassandraDied
763 / / 24.05.2012
Угу. Там либо число одно должно быть, либо один флаг. И лучше пользоваться стандартными макросами, а не числами.
К тому же, ноль вернётся только тогда, когда либо из канала ничего не считалось, либо в буффер ничего не записалось.
82K
15 июня 2012 года
Gizm0
5 / / 14.06.2012
Тогда как мне получить PCM данные с помощью этой функции? Использовать флаг BASS_DATA_FLOAT?
82K
15 июня 2012 года
Gizm0
5 / / 14.06.2012
Немного покурив, понял, что можно воспроизводить из памяти. Реально ли полученный массив обрабатывать и воспроизводить?

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог