Android:播放Rtsp视频流的两种方式
一.SurfaceView + Mediaplayer
XML中添加SurfaceView:
<SurfaceView
android:id="@+id/surface_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
Activity代码:
package com.android.rtsp;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Toast;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import com.android.rtsp.R;
public class RtspActivity extends AppCompatActivity implements MediaPlayer.OnPreparedListener {
private final String TAG = this.getClass().getSimpleName();
private MediaPlayer mediaPlayer;
private SurfaceView surfaceView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_rtsp);
surfaceView = findViewById(R.id.surface_view);
SurfaceHolder holder = surfaceView.getHolder();
holder.addCallback(sfvCallBack);
}
private SurfaceHolder.Callback sfvCallBack = new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
playVideo();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (mediaPlayer != null) {
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer = null;
}
}
};
private void playVideo() {
if (mediaPlayer == null) {
mediaPlayer = new MediaPlayer();
try {
//公共Rtsp,后附多个目前可用的公共Rtsp
mediaPlayer.setDataSource("rtsp://stream.strba.sk:1935/strba/VYHLAD_JAZERO.stream");
mediaPlayer.setDisplay(surfaceView.getHolder());
mediaPlayer.setOnPreparedListener(this);
mediaPlayer.prepareAsync();
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(this, "Error loading video", Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start();
}
@Override
public void onDestroy() {
super.onDestroy();
}
}
二.VideoView
源码可以看到,VideoView是SurfaceView的封装,并且实现了MediaPlayerControl的方法
所以本质还是SurfaceView+MediaPlayer
XML添加VideoView:
<VideoView
android:id="@+id/video_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
Activity代码:
package com.android.rtsp;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageButton;
import android.widget.VideoView;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import com.android.rtsp.R;
public class RtspActivity extends AppCompatActivity {
private final String TAG = this.getClass().getSimpleName();
private VideoView mVideoView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_rtsp);
mVideoView = findViewById(R.id.video_view);
}
@Override
public void onResume() {
super.onResume();
if (mVideoView != null) {
videoConfig();
}
}
private void videoConfig() {
//公共Rtsp,后附多个目前可用的公共Rtsp
mVideoView.setVideoURI(Uri.parse("rtsp://stream.strba.sk:1935/strba/VYHLAD_JAZERO.stream"));
//本质还是SurfaceView+MediaPlayer
mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
Log.i(TAG, "onPrepared ... ........ ");
mVideoView.requestFocus();
mVideoView.start();
}
});
//简化写法
/*mVideoView.setOnPreparedListener(mp -> {
mVideoView.requestFocus();
mVideoView.start();
});*/
}
@Override
public void onDestroy() {
super.onDestroy();
mVideoView.suspend();
}
}
三.其他方式
网上也有很多自定义封装的view和player,也能方便快捷的实现Rtsp视频流的播放
可自行查阅
四.公共rtsp地址
目前暂时可用的Rtsp地址:
- Nordland rtsp://77.110.228.219/axis-media/media.amp
- Norwich rtsp://37.157.51.30/axis-media/media.amp
- Orlando rtsp://97.68.104.34/axis-media/media.am
- PriceCenterPlaza rtsp://132.239.12.145:554/axis-media/media.amp
- Vaison-La-Romaine rtsp://176.139.87.16/axis-media/media.amp
- VyhladJazero rtsp://stream.strba.sk:1935/strba/VYHLAD_JAZERO.stream
- Western Cape rtsp://196.21.92.82/axis-media/media.amp
- Zeeland rtsp://213.34.225.97/axis-media/media.amp
- Allendale rtsp://71.83.5.156/axis-media/media.amp
- Bedford Hills rtsp://73.114.177.111/axis-media/media.amp
rtsp、rtmp测试地址_rtsp测试地址-CSDN博客
2025 rtsp测试拉流地址 - 简书