2011-06-29 31 views
13

這可能是相當的人的intresting題目誰在即時串流intrested從設備一個Web服務器。 (主要的Android/Java) 我終於找到了一種方法,讓我的設備的相機直播到我的網絡服務器(網站)。在無線網絡上,它需要約。 1幀/秒顯示在WiFi網絡上,它也適用於EDGE/3G網絡。在這個主題/問題中,我想討論關於直播的新技術,改進和想法,因爲我將與您分享我的代碼(代碼也很感謝。)直播主題

我的代碼使用setOneShotPreviewCallback()從相機預覽中反覆拍攝快照。調用onPreviewFrame()。該幀以YUV格式傳送,因此raw2jpg()將其轉換爲用於jpeg編碼器的32位ARGB。 NV21是YUV平面格式。

getPicture()被應用程序調用,並生成私有字節數組mCurrentFrame中圖像的jpeg數據並返回該數組。

之後,byteArray mCurrentFrame獲取Base64Encoded,並以HTTP POST方法連同字符串值Base64和自己的ID代碼一起發送到我的web服務器,這樣人們將無法再向其發送其他圖像。在網絡服務器上,它被再次解碼並放入文件test.jpg中。 PHP和Javascript正在Web服務器上運行。 PHP獲取POST方法,JavaScript每750秒重新載入一次圖像。這基本上是如何工作的。

現在我對你的想法,改進以及其他想要添加/詢問的東西很感興趣。 以下是我的一些問題:

1)什麼是用於音頻直播的最佳方法?視頻錄製或我的方法+錄音?

2)你會如何處理視頻記錄流?

3)如何將音頻流到網絡服務器? (主要目標)(使用Java,PHP和JavaScript)

4)我也計劃向我添加典型的直播流式技術,當有名人出現時,您可以在直播時顯示自己的名字,或者只需將sd目錄中的圖像添加到您的直播中。你還會解碼它並覆蓋圖像,或以某種方式將圖像放入您的直播?

這個主題主要是針對問題,所以請這可能是一些人在這裏一些很大的幫助。因此我添加了50(woot!)代表賞金。

真誠, XverhelstX

+1

我看不出有什麼獎金?儘管我無資格回答這個問題。 –

+0

是的,我知道。我似乎無法在這裏添加一個。雖然看來我可以將它們添加到我的其他問題上。它可能需要等待批准。 – Verhelst

+0

@XverhelstX在經過一段時間後才能開始賞金。 –

回答

7

這讓我覺得,http發佈可能不是一個很好的方法來做視頻直播到您的服務器。其他人一直在玩直播,他們使用套接字將直播視頻流和音頻流廣播到他們的服務器。

我以爲這很迷人 - 這是一個鏈接。

http://www.mattakis.com/blog/kisg/20090708/broadcasting-video-with-android-without-writing-to-the-file-system

但是那傢伙還貼出了部分代碼示例 -

String hostname = "your.host.name"; 
int port = 1234; 

Socket socket = new Socket(InetAddress.getByName(hostname), port); 

ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(socket); 

MediaRecorder recorder = new MediaRecorder(); 

// Additional MediaRecorder setup (output format ... etc.) omitted 

recorder.setOutputFile(pfd.getFileDescriptor()); 

recorder.prepare(); 

recorder.start(); 

涼爽的一部分,我不知道是ParcelFileDescriptor - 它創建於Android的文件系統,它實際上是一個文件一個管道連接到套接字 - 所以寫入文件的任何東西都會通過網絡傳播到遠程服務器。套接字是做這種事情的正確方法,因爲它們允許您連續發送數據,直到您的記錄完成而無需重複發送標題。

我認爲這種技術很酷的地方在於他從MediaRecorder(它將成爲一個編碼視頻流)輸出並將其通過套接字泵送到他的服務器。然後他可以簡單地保存通過套接字進入的數據。沒有框架,沒有處理(Android SDK不公開在SDK中的編碼器非常好,他們非常性能密集)。

人們報告說,它的工作原理,但我沒有測試過。無論如何,希望這是有幫助的。

+1

嘿謝謝,這非常有趣。 Sherif和你給出了一些很好的解釋,以及Android操作系統能夠提供的資源。雖然,我只能給1賞金。感謝walta指出這一點 – Verhelst

+0

是的,不客氣。我打算在某個時候自己做這件事,所以很高興完成了這項研究。 – walta

+0

當然,如果你需要我的techinque的一些代碼,只要下午(如果這可能在這裏stackoverflow)我,我也已經找到了一種方式來覆蓋圖像在圖像上創建像Q 4 – Verhelst

2

注:我不是一個Android開發者。

從你所說的話看來,你只是拍攝一張快照而不是真正的流媒體。如果你擔心帶寬,則使用較低的分辨率。究竟如何做到這一點在Android我不知道

我認爲,如果有內置流媒體類,你將能夠獲得視頻流和音頻流。不要做任何本地代碼轉換(你的raw2jpg()算作轉碼),因爲它可能會使用太多的處理能力。只需流,壓縮它,並將其發送到您的服務器。


編輯:

一些鏈接,讓你開始

  • An interesting project它可以將Android手機到IP攝像機。你可以周圍挖了代碼,以弄清楚他們是如何得到阿霍德相機流
  • An SO question關於這一主題
+0

TheLQ,你知道一本書,教程或開源項目,它是否符合你所說的我們可以學習的內容?即使它是用於另一個平臺,比如ios。謝謝。 – nickfox

+0

@nickfox查看更新,我只是做了一些簡單的谷歌搜索。除此之外,我可以提供的幫助並不多。不,不幸的是,我不知道任何書籍或教程。 – TheLQ

4

您發送每次整個快照?你爲什麼不嘗試使用一些視頻壓縮技術,而不是每次發送壓縮版本(可能是差異或類似的東西)時發送完整圖像,而是根據最後一張圖像在服務器上創建圖像和剛剛收到的數據。我認爲所有的視頻編解碼器都這樣做,你可以試着查看一些開放的編解碼器規範來獲得一些想法。

關於音頻。我會發送音頻流分離,並根據我們現在顯示的視頻幀與視頻流進行同步。

基本上,我會嘗試讓我的流盡可能接近真正的視頻流如何工作。也許你可以看看ffmpeg,ffmpeg有一個rtsp服務器,如果你可以爲android構建它,你可以簡化你的工作。

2

1)使用音頻直播的最佳方法是什麼?視頻錄製或我的方法+錄音?

This really depends on your view of "best". If you are looking for resources and not the quality, then your way is really good. Otherwise, you should use a native streaming mechanism or maybe implement a video streaming technique to stream and encode video.

3)你如何流音頻的網絡服務器? (主要目標)(在Java,PHP和JavaScript)

I suggest that you stick to MediaRecorder because it really does what your doing in a good way. Still try to find a way to get the stream in order to send in your way as files are not the best choice although you could stick to files and send small files in a timely manner. In this way you could put a bigger portion of the load on the server rather than the client.

4)我還計劃於典型的實時流feautures添加到我,例如當有名人出現時,您可以在直播時顯示自己的名字,或者只需將sd目錄中的圖像添加到您的直播中。你還會解碼它並覆蓋圖像,或以某種方式將圖像放入您的直播?

Do not even try to put it in your livestream. With your php server, you have more capabilities to send this info alone with certain tag and let the server do the processing or maybe integration of these with the video