【发布时间】:2013-07-12 06:01:39
【问题描述】:
你好吗
- 以二进制模式读取 16 位立体声原始音频文件
- 将其值转换为左右的整数。
- 将这些整数保存回一个新的 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。或者使用putc或fputc一次写出数据字节。在任何一种情况下,您都必须确定您希望从源文件中获得哪种字节序以及希望在目标文件中使用哪种字节序。 -
@simonc 我试过 fwrite (r, sizeof(int), sizeof(r), ausgabe);但这给了我警告:传递 fwrite 的参数 1 使指针从整数而不进行强制转换 [默认启用]。