web-dev-qa-db-ja.com

あるAndroid電話から別の電話へのWiFi経由のライブストリームビデオ

WiFi接続を介してAndroid電話から別のAndroid電話にビデオストリーミング機能を実装する方法について、インターネットを数日間検索しましたが、有用なものが見つかりません。サンプルコード、stackoverflow、google、AndroidブログのAndroid開発者を探しましたが、何もありませんでした。私が見つけることができるのは、ストリーミング用の電話からデスクトップまたはデスクトップから電話への何らかのソリューションですが、実装で借りることができるものは何もありません。

Arduino ADKを使用してロボットを制御する必要があるため、2台の電話を使用しています。1台はロボットに搭載され、もう1台はロボットからビデオストリームを受信します。放送時間と視聴時間の間の最小遅延を達成しようとしているため、これについて言及しています。

私は2つのアプリを作成しています。1つはスレーブアプリを制御し、ストリームを受信するロボット(ハンドヘルド電話から)を制御するマスターアプリ、もう1つはロボットに縛られた電話で実行され、モーター/アクチュエーターを制御するスレーブアプリです/マスターアプリへのストリーミング。残念ながらサードパーティのアプリは使用できません。ビデオストリームコードを2つのアプリに統合する必要があります。

これを達成するためのオプションは何ですか?また、ビデオストリーミングを扱ったことがないので非常に難しいのですが、JavaとAndroidの両方の開発で非常にうまくやっています。ストリームをエンコード/デコードする方法、接続を開始する方法、TCP/IPの代わりにUDPを使用する必要がありますか?どこから始めればいいかわかりません。どこにもサンプルコードはありません。これが達成できると確信しています。正しい方向に着手するのに役立つものを見つけることができません。

spydroid に出くわしましたが、デスクトップでVLCを使用しているので、私には良くありません。


EDIT:Cagney Moreauの blog をご覧ください。彼はこれの実装について詳しく説明します。

112
androidu

アプリで録音および再生機能が必要ない場合は、市販のストリーミングアプリとプレーヤーを使用するのが妥当な選択です。

ただし、それらをアプリに含める必要がある場合は、 MediaRecorder API(サーバー/カメラアプリ用)および MediaPlayer (クライアント/プレイヤー用)を調べる必要があります。アプリ)。

サーバーのクイックサンプルコード:

// this is your network socket
ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(socket);
mCamera = getCameraInstance();
mMediaRecorder = new MediaRecorder();
mCamera.unlock();
mMediaRecorder.setCamera(mCamera);
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
// this is the unofficially supported MPEG2TS format, suitable for streaming (Android 3.0+)
mMediaRecorder.setOutputFormat(8);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
mediaRecorder.setOutputFile(pfd.getFileDescriptor());
mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());
mMediaRecorder.prepare();
mMediaRecorder.start();

プレーヤー側では少し注意が必要です。これを試すことができます。

// this is your network socket, connected to the server
ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(socket);
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setDataSource(pfd.getFileDescriptor());
mMediaPlayer.prepare();
mMediaPlayer.start();

残念ながら、mediaplayerはこれを好まない傾向があるため、(a)ソケットからファイルにデータを保存し、(少しデータを取得した後)ファイルからmediaplayerを再生するか、(b)小さなhttpを作成するかの2つのオプションがありますローカルで実行され、mediaplayerのGETリクエストを受け入れ、HTTPヘッダーで応答し、リモートサーバーからデータをコピーできるプロキシ。 (a)ファイルパスまたはファイルURLを使用してmediaplayerを作成し、(b)プロキシを指すhttp URLを指定します。

こちらもご覧ください:

ソケットfdを使用して電話から電話へライブビデオをストリーミング

mp3再生の開始時にMediaPlayerが途切れる

53
Alex I

このような作業を一度行ったことがありますが、ビデオを送信してリアルタイムで再生するのは非常に複雑です。 PNGのみで作業することをお勧めします。私の実装では、ホストカメラを使用してPNGをキャプチャし、ネットワーク経由でクライアントに送信しました。クライアントは、受信するとすぐに画像を表示し、ホストから次の画像を要求します。 Wi-Fiを使用しているので、通信は1秒あたり約8〜10枚の画像を取得するのに十分な速度になります(概算のみ、Bluetoothで作業しました)。したがって、これは連続したビデオのように見えますが、労力ははるかに少なくなります。通信には、UDPソケット(より高速で複雑ではない)またはDLNA(どのように機能するかはわかりません)を使用できます。

9
Arveen

IP Webcam を使用するか、DLNAを使用できます。たとえば、Samsungデバイスには、ネットワーク上のDLNA対応デバイスを共有およびアクセスできるAllShareというアプリが付属しています。ただし、IP Webcamが最善の策だと思います。 MX Videoプレーヤーなどを使用して作成したストリームを開くことができるはずです。

8
ldam

Android VLC をチェックしてビデオをストリーミングおよび再生できます。さらに情報を追加したい場合は、 GIT をチェックして、その動作を分析できます。がんばろう!