У меня есть файл flac. Я хочу декодировать его через команду «flac -dc», прочитать поток wav, который выдает команда, уменьшить громкость на половину и вывести сигнал обратно. Вот мой фактический код:Как уменьшить объем потока wav?
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
FILE *stream;
int16_t normal, decreased;
stream = popen("/usr/bin/flac -dc 1.flac", "r");
while(feof(stream) == 0) {
normal = fgetc(stream);
decreased = (int16_t) (normal * 0.5f);
printf("%c", decreased);
}
pclose(stream);
return 0;
}
Но когда я запускаю эту программу и перенаправить вывод в аудиосистему с помощью этой команды:
./myprogram | aplay -f dc
звука сильно искажен. Ситуация не меняется, если я пытаюсь декодировать mp3-файл через команду mpg123 -s. Что не так?
Спасибо за ответ, но я решил по-другому. Проблема заключалась в том, что функция «fgetc» возвращает беззнаковый int, даже если поток wav фактически подписан, например, (игнорируя дополнение двух), если я получил половину unsigned char 178, то есть -50 в подписанном символе, я получил 89 а не -25, как ожидалось. Решениями в этот момент было два: или заставить aplay принимать неподписанные 8-битные данные или форсировать возвращаемое значение fgetc в знакомой переменной. Я выбрал второй путь. Теперь он работает плавно. Спасибо, однако, за помощью. –
@ giuliom_95. Вы должны убедиться, что данные являются 8-разрядными, а не 16-разрядными. Было бы необычно, если бы 8-битные данные вышли из flac или mp3. – jaket