2011-07-28 14 views
5

私は最近、Android SDKの初心者です。このプロジェクトの全体的な目標は、UstreamやQikに似たアプリを作成することです(初心者のためのベストアイデアはわかりません)。ライブオーディオとビデオをWebにストリームする必要があります。おそらくWowzaを使用してビデオのエンコーディングを適切な形式に処理するビデオサーバーが存在します。AndroidからPC/Webにオーディオとビデオをストリーミングする。

私は今まで見つかったことから、カメラをソースとして使用してアンドロイドのMediaRecorderを使用し、出力をサーバーに送信する必要があります。それは私にとって理にかなっていますが、私はそれをどうやって行うのか正確にはわかりません。誰かが私に正しい方向へのプッシュを与えることができますか?私は "http://ipcamera-for-android.googlecode.com/svn/trunk"の例を参照していますが、これは必要以上に複雑であるように見えます。とにかくそれをテストするために日食で働いています。

+0

私はWebRTCを使ってみましたが、スマートテレビで働いていませんでした(私の問題はアンドロイドとスマートテレビの間の伝送です)、スマートテレビにはクロムがありません:( – vrbsm

答えて

8

これは単純ではありませんが、可能です。

MediaRecorder APIは、出力がランダムアクセスファイルであることを前提としています。つまり、mp4(またはその他の)ファイルコンテナを書き込んだり戻ったりすることができます。 ipcamera-for-androidのように、出力ファイルはランダムアクセスではないソケットに送られます。 事実はMediaRecorderのAPIは(H264上)FPS、SPS/PPSのようないくつかのデータを「書き込み」とその記録が行われている場合のみになりますので、それは難しいの発信ストリームを解析することができます。 APIは、バック(ファイルヘッダが存在する)は、ストリームの先頭に追求しようとしますが、ストリームをファイルにソケットに送信されていないので、それは失敗します。

ipcamera-for-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)。

関連する問題