【问题标题】:Reading raw audio files读取原始音频文件
【发布时间】:2013-07-12 06:01:39
【问题描述】:

你好吗

  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;
  }
}

【问题讨论】:

  • 你看到了什么不同?
  • 不会 putc 写一个 char,丢弃你的 16 位值的高位部分吗?
  • @simonc 你会写什么呢?
  • 改用fwrite。或者使用putcfputc 一次写出数据字节。在任何一种情况下,您都必须确定您希望从源文件中获得哪种字节序以及希望在目标文件中使用哪种字节序。
  • @simonc 我试过 fwrite (r, sizeof(int), sizeof(r), ausgabe);但这给了我警告:传递 fwrite 的参数 1 使指针从整数而不进行强制转换 [默认启用]。

标签: c audio


【解决方案1】:

getc 会跳过一个字符。

另外,如果您每个通道有 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 行

【讨论】:

  • 这是原件:i.imgur.com/xdpTMdk.jpg,这是您的代码用它创建的 i.imgur.com/EdmSzJV.jpg 原件大小为 663kb,修改后的大小为 1,29MB
  • 顺便说一句。你知道while语句中的getc会跳过一个字符吗?
  • 这就是解决方案。如果你把它放在你的主要回复中,其他人就会看到。
  • 您的输入文件是每通道 16 位还是总共 16 位?如果是每个通道,那么您将需要每个通道的双字符输出,否则您在读入期间的位移是错误的,因为您将两个 8 位字符累积到一个通道中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-16
  • 2018-07-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多