14

私は現在、2 つの Android Phone 間のビデオ ストリーミングに取り組んでいます。ビデオを sd ファイルに記録できるアプリケーションを作成しました (MediaRecorder を使用)。ファイルのビデオを表示できる別のアプリケーションを作成しました。どちらのアプリケーションも完全に機能します。

下記サイトに「Androidで動画配信 - ローカルファイルへの書き込みなし」のサイトを見つけました。それはまさに私がやりたかったことです。

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

コードを変更しました。

ビデオ レコーダーの場合は、次のとおりです。

socket=severSocket.accept();
ParcelFileDescriptor=pfd;
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
recorder.setVideoFrameRate(15);
recorder.setVideoSize(320, 240);
recorder.setPreviewDisplay(holder.getSurface());
pfd = ParcelFileDescriptor.fromSocket(socket);
recorder.setOutputFile(pfd.getFileDescriptor());
recorder.prepare(); 
recorder.start();

ビデオ プレーヤーの場合:

Socket socket = new Socket(IP,PORT);
mMediaPlayer = new MediaPlayer();
pfd = ParcelFileDescriptor.fromSocket(socket);
mMediaPlayer.setDataSource(pfd.getFileDescriptor()); // <-- here is the problem
mMediaPlayer.setDisplay(holder); 
mMediaPlayer.prepare();
mMediaPlayer.setOnBufferingUpdateListener(this);            
mMediaPlayer.setOnCompletionListener(this);            
mMediaPlayer.setOnPreparedListener(this);            
mMediaPlayer.setOnVideoSizeChangedListener(this);
mMediaPlayer.start();

MediaPlayerでプログラムがクラッシュしmMediaPlayer.setDataSource(pfd.getFileDescriptor());ます。DataSource を正しくセットアップしていないことはわかっています。ParcelFileDescriptorを MediaPlayer に配置するには、追加の設定が必要です。

MediaPlayer にParcelFileDescriptorを使用する方法を知っている人はいますか? 役立つアドバイスやヒントがあればいいのですが......

ありがとうございました

意思

4

2 に答える 2

4

ビデオ再生側では、ウェルカム ソケットを作成する必要があります。

ServerSocket welcomeSocket = new ServerSocket(portNumber);
socket soc = welcomeSocket.accept();

と使用

mMediaplayer.prepareAsync();

それ以外の

mMediaplayer.prepare();
于 2011-12-02T22:10:14.277 に答える
1

Androidは、Android2.1以下のビデオストリーミングをネイティブにサポートしていません。私たちがしたことは、フレームごとに画像を取得することでした。各炎をBYTE[]に分割し、Socketクラスを使用して送信します。また、受信側では、受信したBYTE[]データを使用して画像を再構築します。

于 2011-05-03T05:15:02.190 に答える