2015-10-27 4 views
0

У меня есть файл 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. Что не так?

ответ

0

Вероятно, что flac декодируется на бит глубиной выше 8 бит. В этом случае вам нужно собрать два байта в короткий и затем умножить на коэффициент усиления. Представьте 16-битный образец 0x7fff. При делении на два вы ожидаете, что результат будет равен 0x3fff. Но поскольку вы делите каждый байт отдельно, результат будет 0x3f7f. Еще одна проблема, о которой нужно следить, - это знак.

непроверенная, но что-то, как это должно работать на 16-разрядное:

while(feof(stream) == 0) { 
    normal = (int16_t)((fgetc(stream) << 8) | (fgetc(stream)); 
    decreased = (int16_t) (normal * 0.5f); 
} 
+0

Спасибо за ответ, но я решил по-другому. Проблема заключалась в том, что функция «fgetc» возвращает беззнаковый int, даже если поток wav фактически подписан, например, (игнорируя дополнение двух), если я получил половину unsigned char 178, то есть -50 в подписанном символе, я получил 89 а не -25, как ожидалось. Решениями в этот момент было два: или заставить aplay принимать неподписанные 8-битные данные или форсировать возвращаемое значение fgetc в знакомой переменной. Я выбрал второй путь. Теперь он работает плавно. Спасибо, однако, за помощью. –

+0

@ giuliom_95. Вы должны убедиться, что данные являются 8-разрядными, а не 16-разрядными. Было бы необычно, если бы 8-битные данные вышли из flac или mp3. – jaket

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

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