c - 读取原始音频文件

标签 c audio

你好吗

  1. 以二进制模式读取 16 位立体声原始音频文件
  2. 将其左右值转换为整数。
  3. 将这些整数保存回新的 16 位立体声原始音频文件。

最后两个文件应该是一样的,用我的代码,他们不是。为什么?

我的代码:

char ergebnis[80];                                                  
sprintf(ergebnis,"%s.neu.raw",Datei);
FILE* ausgabe = fopen(ergebnis, "wb");
FILE* f = fopen(Datei, "rb");                    
if (f == NULL)
  return;
int i = -1;
int r1 = 0;
int r2 = 0;
int l1 = 0;
int l2 = 0;
int l = 0;
int r = 0;
while((getc(f))!=EOF)
{  
  i++;
  if (i == 0)
    r1 = (unsigned)fgetc(f);
  if (i == 1)
  {
    r2 = (unsigned)fgetc(f);
    r = r1 | r2 << 8;  
  }
  if (i == 2)
    l1 = (unsigned)fgetc(f);
  if (i == 3)
  {
    l2 = (unsigned)fgetc(f);
    l = l1 | l2 << 8;
    putc(r,ausgabe);
    putc(l,ausgabe);
    i = -1;
  }
}  
fclose(f);
fclose(ausgabe);
exit(-1);

编辑:用

解决了
int wo = 0;
while(wo !=EOF)
{
  wo = getc(f);  
  i++;
  if (i == 0)
    r1 = (unsigned)wo;
  if (i == 1)
  {
    r2 = (unsigned)wo;
    r = (r2<<8)+r1; //r1 | r2 << 8;  
  }
  if (i == 2)
    l1 = (unsigned)wo;
  if (i == 3)
  {
    l2 = (unsigned)wo;
    l = (l2<<8)+l1; //l1 | l2 << 8;   
    putc((char) ( r       & 0xff),ausgabe);
    putc((char) ((r >> 8) & 0xff),ausgabe); 
    putc((char) ( l       & 0xff),ausgabe);
    putc((char) ((l >> 8) & 0xff),ausgabe);
    i = -1;
  }
}

最佳答案

getc while 会跳过一个字符。

此外,如果您每个 channel 有 16 位而不是

putc(r,ausgabe);
putc(l,ausgabe);

putc((char) ( r       & 0xff),ausgabe);
putc((char) ((r >> 8) & 0xff),ausgabe);
putc((char) ( l       & 0xff),ausgabe);
putc((char) ((l >> 8) & 0xff),ausgabe);

可能你想要一个不同的字节顺序,然后只是交换第 1 行和第 2 行以及第 3 行和第 4 行

关于c - 读取原始音频文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17595611/

相关文章:

c++ - va_arg 给出运行时错误

python-3.x - 从内置麦克风获取音频信号

java - 在没有外部库的情况下在java中将mp3转换为WAV

javascript - 如何在不复制 javascript 功能的情况下创建多个音频播放器(每个播放器包含不同的歌曲)?

c++ - 传递多维数组时的链接错误

c - 用于获取进程使用的内存状态的系统 API

c - Rust 的 (void) 变量替代品

c - 如何使用共享内存在CoDeSys和非CoDeSys平台之间建立通信?

java - android实时获取声音频率?

python - 如何确保单独的音频文件之间的帧大小一致?