2011-07-28 93 views
5

我是Android SDK的新手,這個項目的總體目標是創建一個非常類似於Ustream或Qik的應用程序(是的,我不知道對於初學者來說是最好的主意)。我需要將現場音頻和視頻傳輸到網絡。將有一個視頻服務器,最有可能使用Wowza,處理視頻的編碼爲正確的格式。從Android到PC /網絡的音頻和視頻流。

從我發現到目前爲止,我需要使用Android的MediaRecorder與相機作爲源,並指示輸出到服務器。這對我來說很有意義,但我不知道如何去做。任何人都可以給我一個正確的方向?我在「http://ipcamera-for-android.googlecode.com/svn/trunk」中瀏覽了一個例子,但這似乎比我需要做的事情複雜得多,而且我一直無法獲得它在eclipse中工作無論如何測試它。

+0

我有類似的問題,我試過使用WebRTC,但沒有在智能電視工作(我的問題是Android和智能電視之間的傳輸),智能電視沒有鍍鉻:( – vrbsm

回答

8

這樣做並不簡單,但可能。

MediaRecorder API假定輸出是一個隨機訪問文件,這意味着,它可以爲了寫入mp4(或其他)文件容器而前後移動。 正如你可以在ipcamera-for-android中看到的,輸出文件被定向到一個不是隨機訪問的套接字。 事實上,由於MediaRecorder API只會在錄製完成後纔會「寫入」fps,sps/pps(在h264上)等等數據,所以很難分析出站流。 API將嘗試回溯到流的開始處(文件頭存在的地方),但是它會失敗,因爲流發送到套接字而不是文件。

以ipcamera爲Android是一個很好的參考,如果我記得正確,在流媒體之前,它將視頻記錄到文件中,打開標題並從中獲取所需內容,而不是開始記錄到套接字並使用它從頭中取出的數據來解析流。

在分析mp4(或其他您想使用的文件容器)以獲取幀時,您還需要一些基本的理解。 您可以在設備上或服務器端執行此操作。

下面是數據流寫入到一個插座一個良好的開端: Tutorial

我希望這是有幫助的,對於分析沒有好的教程,出流進行解碼,因爲它不是那麼簡單......但再一次,這是可能的一些努力。

看看這裏還看到了如何將輸出流引導到可發送到服務器的流: MediaRecorder Question

+0

非常有用的凹凸在正確的方向。進入這些鏈接。謝謝 – ajs

0

SipDroid不正是你需要的。

它涉及到一種破解需要文件描述符的MediaRecorder類的限制。它將MediaRecorder視頻流的結果保存到本地套接字(用作一種管道),然後重新讀取(在同一個應用程序中,但另一個線程),從另一端的此套接字創建RTP數據包從收到的數據中取出,最後將RTP數據包廣播到網絡(您可以在此處使用廣播或單播模式)。

基本上它歸結爲以下的(簡化的代碼):

// Create a MediaRecorder 
MediaRecorder mr = new MediaRecorder(); 
// (Initialize mr as usual) 
// Create a LocalServerSocket 
LocalServerSocket lss = new LocalServerSocket("foobar"); 
// Connect both end of this socket 
LocalSocket sender = lss.accept(); 
LocalSocket receiver = new LocalSocket(); 
receiver.connect(new LocalSocketAddress("foobar")); 
// Set the output of the MediaRecorder to the sender socket file descriptor 
mr.setOutputFile(sender.getFileDescriptor()); 
// Start the video recording: 
mr.start(); 
// Launch a background thread that will loop, 
// reading from the receiver socket, 
// and creating a RTP packet out of read data. 
RtpSocket rtpSocket = new RtpSocket(); 
InputStream in = receiver.getInputStream(); 
while(true) { 
    fis.read(buffer, ...); 
    // Here some data manipulation on the received buffer ... 
    RtpPacket rtp = new RtpPacket(buffer, ...); 
    rtpSocket.send(rtpPacket); 
} 

RtpPacketRtpSocket類(相當簡單的),並且其操作所述視頻流內容的確切的代碼的執行可以在找到SipDroid項目(尤其是VideoCamera.java)。