web-dev-qa-db-ja.com

RTSPライブビデオストリーミング

RaspberryPiから自分のAndroidデバイスにビデオをライブストリーミングするアプリケーションを構築しています。このストリームを再生するには、3つの機能的な方法があります。

rtsp://media.smart-streaming.com/mytest/mp4:sample_phone_150k.mp4

  1. メディアプレーヤー+ SurfaceView
  2. VideoView
  3. Intent.ACTION_VIEW

問題は、アプリケーションが上記の^ストリームを再生しますが、私のものは再生しません(rtsp://192.168.1.143:8554/vid.mp4)...しかしVLCは再生します

VLCとLIVE555を使用して複数のビデオ形式でストリーミングを試しました。また、電話で録画したビデオを再生してみました。

これが私のコードです:

//Stream methods 0 = MediaPlayer & SurfaceView, 1 = VideoView, 2 = Native Video Player
final int STREAM_USING = 0;

//MediaPlayer on surfaceView
String streamPath = "rtsp://192.168.1.143:8554/vid.mp4";//"rtsp://media.smart-streaming.com/mytest/mp4:sample_phone_150k.mp4";//"rtsp://192.168.1.143:8554/vid.mp4";//;"rtp://239.255.0.1:5004/";
Uri streamUri;
private MediaPlayer mediaPlayer;
private SurfaceView surfaceView;
private SurfaceHolder surfaceHolder;

//VideoView
VideoView videoView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //MediaPlayer
    switch (STREAM_USING) {
        case 0: {
            surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
            surfaceHolder = surfaceView.getHolder();
            surfaceHolder.setFixedSize(800, 480);
            surfaceHolder.addCallback(this);
            surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_Push_BUFFERS);
            mediaPlayer = new MediaPlayer();

            mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
                @Override
                public boolean onError(MediaPlayer mp, int what, int extra) {
                    if (what == MediaPlayer.MEDIA_ERROR_SERVER_DIED) {
                        mediaPlayer.release();
                        mediaPlayer = new MediaPlayer();
                        //mediaPlayer.stop();
                        play();
                    }
                    return false;
                }
            });

            mediaPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() {
                @Override
                public void onBufferingUpdate(MediaPlayer mp, int percent) {
                    Toast.makeText(getApplicationContext(), "BUFF : " + percent, Toast.LENGTH_SHORT).show();
                    if (!mediaPlayer.isPlaying()) {
                        mediaPlayer.start();
                    }
                }
            });

            //Intent i = new Intent(Intent.ACTION_GET_CONTENT);
            //i.setType("video/*");
            //startActivityForResult(i, 1234);
            streamUri = Uri.parse(streamPath);
            play();
            break;
        }
        case 1: {
            videoView = (VideoView) findViewById(R.id.videoView);
            videoView.setVideoURI(Uri.parse(streamPath));
            MediaController mediaController = new MediaController(this);
            //mediaController.setAnchorView(videoView);
            videoView.setMediaController(mediaController);
            videoView.requestFocus();
            try {
                videoView.start();
            }
            catch (SecurityException se) {
                Log.e("SE", se.getMessage());
                se.printStackTrace();
            }
            break;
        }
        case 2: {
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(streamPath));
            startActivity(intent);
            break;
        }
        default: {
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(streamPath));
            startActivity(intent);
        }
    }
}

private void play() {
    try {
        //final FileInputStream fis = new FileInputStream(streamPath);
        mediaPlayer.stop();
        mediaPlayer.reset();
        mediaPlayer.setDataSource(MainActivity.this, streamUri);
        //mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

        mediaPlayer.prepareAsync();
        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                //mediaPlayer.reset();
                mediaPlayer.start();
            }
        });


    } catch (SecurityException se) {
        Log.e("SE", se.getMessage());
        se.printStackTrace();
    } catch (IOException ie) {
        ie.printStackTrace();
    }
}

どんな助けでもありがたいです、私はこれをうまく機能させるために一週間努力してきました:(

12
Ciprian

ビット変更を追加したいだけで、すでに2つの方法を追加しました。ストリーミングララルタスクを実行しました。wowzaでrtspを使用しました。いくつかの方法でお知らせします。

一度試してみて、問題が発生した場合はお知らせください。vlcでのストリーミングが正常に機能している場合は、アプリ側に問題があります。これらの方法が機能しない場合は、別の電話で試してください。それはまたあなたを助けます。

1。ビデオビューで試してください

vvVideoPlay = (VideoView) findViewById(R.id.vvVideoPlay);
MediaController mediaController = new MediaController(this);

String videoUrl = "rtsp://192.168.1.143:8554/vid.mp4";

    mediaController.setAnchorView(vvVideoPlay);
    Uri uri = Uri.parse(videoUrl);
    vvVideoPlay.setVideoURI(uri);
    vvVideoPlay.setMediaController(mediaController);
    vvVideoPlay.requestFocus();

    vvVideoPlay.setOnPreparedListener(new OnPreparedListener() {

        @Override
        public void onPrepared(MediaPlayer mp) {

            mp.start();
            pdialog.dismiss();
            mp.setOnVideoSizeChangedListener(new OnVideoSizeChangedListener() {

                @Override
                public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {

                    mp.start();
                }
            });
        }
    });

2。電話プレーヤーを直接試してみてください

startActivity(new Intent(Intent.ACTION_VIEW,
                Uri.parse("rtsp://192.168.1.143:8554/vid.mp4")));

。3番目の方法は、アプリのカスタムプレーヤーでこのライブラリを試してみてください。

Step1。 Gradleに追加します

compile "fm.jiecao:jiecaovideoplayer:4.7.0"

Step2。 xmlレイアウトでビデオ再生として追加します。

<fm.jiecao.jcvideoplayer_lib.JCVideoPlayerStandard
    Android:id="@+id/videoPlayer"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent" />

ステップ3。クラスでこのライブラリを使用する方法をここから確認してください。

public class PlayVideoActivity extends BaseActivity {

@BindView(R.id.videoPlayer)
JCVideoPlayerStandard mVideoPlayer;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    restoreFromIntent(getIntent());
}

@Override
public int getLayout() {
    return R.layout.activity_play_video;
}


// get video path from intent and play the video here
private void restoreFromIntent(Intent intent) {

    mVideoPlayer.setUp("rtsp://192.168.1.143:8554/vid.mp4"
            , JCVideoPlayerStandard.SCREEN_LAYOUT_LIST, "");
}

@Override
public void onBackPressed() {
    if (JCVideoPlayer.backPress()) {
        return;
    }
    super.onBackPressed();
}

@Override
protected void onPause() {
    super.onPause();
    JCVideoPlayer.releaseAllVideos();
}
}

これがあなたの問題を解決するのに役立つことを願っています。ありがとう

7
Saveen