2013-07-20 122 views
0

在我的應用程序中,我需要首先從特定文件中讀取音頻數據,然後將其存儲在緩衝區中。之後,我會用它來處理和東西。問題是,當我試圖打印出它的內容是給0:緩衝區讀取文件給出零的音頻數據

String data = String.valueOf(buffer[50]+"  "+buffer[100]+"  "+buffer[200]+buffer[599]); 
display.setText(data); 

打印上述statment給所有零...爲什麼???!

這裏是我的代碼:

public void readAudioDataFromFile() { 

    String filePath2 = "/storage/sdcard0/Sounds/originalFile.pcm"; 
    FileInputStream ins = null; 
    File file = new File(filePath2); 
    int size = (int) file.length();  
    byte [] buffer=new byte [size]; 
    try { 
     ins= new FileInputStream(filePath2); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 
    try { 
     ins.read(buffer, 0,size); 
     int count =0; 
     for(int i=0; i<buffer.length; i++) 
     { 
     if(buffer[i]!=0) 
      count++; 
     } 
     String data = String.valueOf((count); 
     display.setText(data); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    } 

奇怪的是,當我嘗試了以下聲明:

int x= ins.read(buffer, 0,size); 

當我打印的x,它給出了一個數等於文件大小,

此外,當我試圖打印出「計數」,你可以看到我的代碼,它也給出了輸出!

我的意思是不應該都意味着該緩衝區不是空的?以及爲什麼如果它不是空的,爲什麼當我試圖打印出它的元素它給了我零?

+0

什麼樣的數據是「音頻數據」? – skyman

+0

@bugy在談論音頻數據時,我們可以假設PCM,並且文件的擴展名是PCM。 –

+0

您對'ins.read'的調用返回一個整數,表示從文件中讀取的字節數。它返回什麼價值? –

回答

1

這不是顯而易見的問題是什麼,但它可以通過這個原因引起的:

ins.read(buffer, 0,size); 

你忽略了read呼叫,它會告訴你多少字節被實際讀取到的結果buffer。假設您將讀取size字節...即使文件大小爲size也是不正確的。

正確的方法做,這是循環,直到您已經閱讀整個文件......這樣的事情:

 int pos = 0; 
     while (pos < size) { 
      pos += ins.read(buffer, pos, size - pos); 
     } 

至於爲什麼你得到全零,我覺得最簡單的(並且很可能)的解釋是您正在閱讀的文件包含全零。