2011-10-06 154 views
2

我有一個從Android設備流媒體視頻/音頻服務器 流都很好,但是當我保存流數據來回MediaRecoreder我無法播放該文件的應用程序如何播放從Android設備流式傳輸到服務器的視頻?

的Android代碼:

String hostname = "000.000.000.000"; 
int port = 0000; 
Socket socket = null; 
try { 
socket = new Socket(InetAddress.getByName(hostname), port); 
} catch (UnknownHostException e1) { 
e1.printStackTrace(); 
} catch (IOException e1) { 
e1.printStackTrace(); 
} 
ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(socket); 
MediaRecorder recorder = new MediaRecorder(); 
recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
recorder.setOutputFile(pfd.getFileDescriptor()); 
recorder.start(); 

服務器端:

Socket userSocket = socket.accept(); 
//DataInputStream dis; 
dis = new DataInputStream(userSocket.getInputStream()); 
while(true){ 
     dis.read(buf , 0 , buf.length); 
     saveBufferToFile(buf); 
} 

現在我用FileOutStream .write()保存緩衝區;方法,但輸出文件根本無法播放。

經過研究我明白,我需要將mp4頭文件添加到文件中,然後再將數據寫入文件中,但我不知道如何執行此操作!

問候,

回答

0

首先,MPEG4容器不僅僅是「報頭」,以視頻數據更多。

其次,服務器端代碼看起來不正確。我認爲它是Java。具體來說:

dis = new DataInputStream(userSocket.getInputStream()); 
while(true){ 
    dis.read(buf , 0 , buf.length); 
    saveBufferToFile(buf); 
} 

具體而言,DataInputStream.read()不一定讀取緩衝區的整個長度。 JavaDocs說:

嘗試讀取多達len字節,但可能會讀取較小的數字 ,可能爲零。

我懷疑你正在寫入磁盤的文件已損壞。您可以通過比較客戶端發送的字節數和文件大小來確認這一點。我的直覺說文件會大得多。

要解決它,你將需要採取不通過read()讀取的字節數,並且只寫那些字節的磁盤。緩衝區的其餘部分實際上是垃圾,忽略它。

+0

好的,我確定我讀取了所有的字節,並將該文件保存在設備和服務器上!這不會解決問題!而我正在尋找這個問題!我發現我需要添加文件頭和頁腳,這些文件包含文件的內容長度,我不知道我保存了多少!所以我認爲這是聯合國可解決的問題,我應該找到另一種方式將數據從Android設備傳輸到服務器。 – daigoor

+1

@daigoor:問題不在於讀取所有字節。它寫入的字節太多。在每個循環中,您正在寫入整個緩衝區,無論天氣與否,它都會被讀取。從網絡讀取並在文件的持續時間內填充緩衝區的可能性幾乎沒有。直到你解決這個問題,你永遠不會讓它走得更遠。 –

+0

我知道..但我現在遠離這個錯誤,現在我開始做其他事情,我停止了這個項目的工作,直到我完成了我的任務。 – daigoor

相關問題