我有一个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
声音严重失真。如果我尝试通过&#34; mpg123 -s&#34;解码mp3文件,情况就不会改变。命令。怎么了?
答案 0 :(得分:0)
flac可能正在解码到高于8位的位深度。在这种情况下,您需要将两个字节组合成一个短路,然后乘以增益。想象一下16位的0x7fff样本。除以2时,您希望结果为0x3fff。但是既然你要分别划分每个字节,你的结果就是0x3f7f。您需要注意的另一个问题是标志。
未经测试但是这样的事情应该适用于16位签名:
while( feof( stream ) == 0 ) {
normal = (int16_t)((fgetc(stream) << 8) | (fgetc(stream));
decreased = (int16_t) (normal * 0.5f);
}