我有一个flac文件。我想通过“flac -dc”命令对其进行解码,读取命令输出的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
声音严重失真。如果我尝试通过“mpg123 -s”命令解码mp3文件,情况不会改变。怎么了?
最佳答案
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);
}
关于audio - 如何减少wav流的数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33368350/