119

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

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

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

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

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


編集: Cagney Moreau のブログをご覧ください。彼はこれの実装について詳しく説明します。

4

4 に答える 4

55

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

ただし、それらをアプリに含める必要がある場合は、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を作成します。ローカルで実行され、メディアプレーヤーのGETリクエストを受け入れ、HTTPヘッダーで応答し、リモートサーバーからそのサーバーにデータをコピーできるプロキシ。(a)の場合は、ファイルパスまたはファイルURLを使用してメディアプレーヤーを作成し、(b)の場合は、プロキシを指すhttpurlを指定します。

参照:

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

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

于 2013-01-21T05:04:59.630 に答える
9

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

于 2013-01-22T16:37:33.880 に答える
8

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

于 2013-01-18T14:56:12.263 に答える
5

ビデオをストリーミングおよび再生できるAndroid VLCを確認できます。さらにインダゲートしたい場合は、GITを確認して、彼らが何をしているかを分析できます。幸運を!

于 2013-01-27T03:28:51.680 に答える