RTSP直播视频流

12

我正在构建一个应用程序,将视频从树莓派实时传输到我的Android设备。我有三种功能性方式可以播放这个流:

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();
    }
}

任何帮助都将不胜感激,我已经试了一个星期还没有成功 :(


当您尝试加载该RTSP URI时,提供Android Media API的Logcat如何?媒体播放器和/或视频视图正在执行什么操作? - Robert Rowntree
好的,我明天会回复您。 - H4CKY
抱歉回复晚了: RTP情况: E/MediaPlayer﹕ Error (1, -1003) RTSP情况: E/MediaPlayer﹕ Error (1, -2147483648) - H4CKY
@ciprianoss:你需要一个好的媒体播放器来播放吗?你确定你要播放的是正确的流媒体URL,并且在任何浏览器中都能正常工作吗? - Jai
1个回答

8

您已经提供了两种方法,我想要增加一些修改。我已经完成了与流媒体相关的任务。我使用了Wowza的RTSP。以下是几种方法:

请尝试一下,如果遇到问题请告诉我。如果在VLC中播放正常,则可能是应用程序端出现了问题。如果这些方法不起作用,请尝试使用不同的手机。这也可能有所帮助。

1. 尝试使用VideoView

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")));

第三种方式是在您的应用程序中使用自定义播放器与此库一起尝试。

步骤1:将其添加到gradle中。

compile "fm.jiecao:jiecaovideoplayer:4.7.0"

步骤二。 将其添加为您的视频播放器以xml布局形式呈现。

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

步骤三:从这里查看如何在您的类中使用此库。

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();
}
}

希望这能帮助您解决问题。谢谢。

谢谢你的回答,我今天稍后会尝试一下并看看它是否有效。我认为你没有理解某些事情,我能够使用VLC播放我的流,但不能使用我的代码,然而测试链接流在我的代码中都可以播放。 - H4CKY
是的,我明白你的意思,所以我会给你一些提示。这些提示可以帮助你找出问题并轻松调试你的代码。 - Saveen
好的,我目前正在尝试今天发现的一个选项,然后我会尝试你的。 - H4CKY
好的,如果你有任何问题,请告诉我。 - Saveen
谢谢伙计,还有一件事。请移除 RTSP 流中的 .mp4 然后再试一下。 - Saveen
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接