2013-07-11 98 views
1

你怎麼閱讀原始音頻文件

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

什麼區別你有看到? – LostBoy

+0

不會'putc'寫一個'char',丟棄16位值的上半部分嗎? – simonc

+0

@simonc你會寫什麼呢? –

回答

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

也許你想要一個不同的字節順序然後就swaplines 1和2以及3和4行

+0

這是一個原創:http://i.imgur.com/xdpTMdk.jpg這就是你的代碼創建出來http://i.imgur.com/EdmSzJV.jpg也是原始大小爲663kb,修改後的一個1.29MB – Zurechtweiser

+0

Btw。你知道while語句中的getc會跳過一個字符嗎? – LostBoy

+0

這就是解決方案。如果你把這個放在你的主要答覆中,其他人會看到。 –