Android:播放Rtsp视频流的两种方式

一.SurfaceView + Mediaplayer

XML中添加SurfaceView:

<SurfaceViewandroid: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;@Overrideprotected 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() {@Overridepublic void surfaceCreated(SurfaceHolder holder) {playVideo();}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {if (mediaPlayer != null) {mediaPlayer.stop();mediaPlayer.release();mediaPlayer = null;}}};private void playVideo() {if (mediaPlayer == null) {mediaPlayer = new MediaPlayer();try {//公共Rtsp,后附多个目前可用的公共RtspmediaPlayer.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();}}}@Overridepublic void onPrepared(MediaPlayer mp) {mediaPlayer.start();}@Overridepublic void onDestroy() {super.onDestroy();}
}

二.VideoView

源码可以看到,VideoViewSurfaceView的封装,并且实现了MediaPlayerControl的方法
所以本质还是SurfaceView+MediaPlayer

XML添加VideoView:

<VideoViewandroid: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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_rtsp);mVideoView = findViewById(R.id.video_view);}@Overridepublic void onResume() {super.onResume();if (mVideoView != null) {videoConfig();}}private void videoConfig() {//公共Rtsp,后附多个目前可用的公共RtspmVideoView.setVideoURI(Uri.parse("rtsp://stream.strba.sk:1935/strba/VYHLAD_JAZERO.stream"));//本质还是SurfaceView+MediaPlayermVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {@Overridepublic void onPrepared(MediaPlayer mp) {Log.i(TAG, "onPrepared ... ........   ");mVideoView.requestFocus();mVideoView.start();}});//简化写法/*mVideoView.setOnPreparedListener(mp -> {mVideoView.requestFocus();mVideoView.start();});*/}@Overridepublic void onDestroy() {super.onDestroy();mVideoView.suspend();}
}

三.其他方式

网上也有很多自定义封装的viewplayer,也能方便快捷的实现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测试拉流地址 - 简书

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/70218.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Next.js【详解】CSS 样式方案

全局样式 Global CSS 默认已创建&#xff0c;即 src\app\globals.css&#xff0c;可根据需要修改 默认在全局布局中导入 src\app\layout.tsx import "./globals.css";组件样式 CSS Modules 新建文件 src\app\test\styles.module.css .red {color: red;}导入目标页面…

LVS相关原理

一、LVS集群的体系结构 1.1 LVS简介 LVS 是 Linux Virtual Server 的简称&#xff0c;也就是 Linux 虚拟服务器 , 是一个由章文嵩博士发起的自由软件项目&#xff0c;它的官方站点是 www.linuxvirtualserver.org 。现在 LVS 已经是 Linux标准内核的一部分&#xff0c;在Linux2…

【2025深度学习系列专栏大纲:深入探索与实践深度学习】

第一部分:深度学习基础篇 第1章:深度学习概览 1.1 深度学习的历史背景与发展轨迹 1.2 深度学习与机器学习、传统人工智能的区别与联系 1.3 深度学习的核心组件与概念解析 神经网络基础 激活函数的作用与类型 损失函数与优化算法的选择 1.4 深度学习框架简介与选择建议 第2…

Java与C语言中取模运算符%的区别对比

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: Java 文章目录 &#x1f4af;前言&#x1f4af;C语言中的取模运算符 %基本行为示例 注意事项示例&#xff1a;负数取模 &#x1f4af;Java中的取模运算符 %基本行为示例 对浮点数的支持示例&#xff1a;浮点数取模 符…

OpenCV机器学习(4)k-近邻算法(k-Nearest Neighbors, KNN)cv::ml::KNearest类

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::ml::KNearest 是 OpenCV 机器学习模块中的一部分&#xff0c;它提供了实现 k-近邻算法&#xff08;k-Nearest Neighbors, KNN&#xff09;的…

过于依赖chatgpt编程会有哪些弊端?

过于依赖ChatGPT编程可能会带来以下问题&#xff1a; 1. 基础不扎实&#xff0c;容易“变菜” 以前遇到代码还会琢磨哪里不懂、怎么改&#xff0c;现在直接复制粘贴&#xff0c;时间长了可能连基本的语法和逻辑都搞不清楚。就像考试总抄答案&#xff0c;真让你自己写的时候脑子…

红队视角出发的k8s敏感信息收集——Kubernetes API 扩展与未授权访问

针对 Kubernetes 第三方组件与 Operator 的详细攻击视角分析&#xff0c;涵盖 Service Mesh、Helm Releases 和 Database Operators 的潜在风险及利用方法。 攻击链示例 1. 攻击者通过未授权的 Tiller 服务部署恶意 Helm Chart → 2. 创建后门 Pod 并横向移动至 Istio 控制平…

3D与2D机器视觉机械臂引导的区别

3D与2D机器视觉在机械臂引导中的主要区别如下&#xff1a; 数据维度 2D视觉&#xff1a;仅处理平面图像&#xff0c;提供X、Y坐标信息&#xff0c;无法获取深度&#xff08;Z轴&#xff09;数据。 3D视觉&#xff1a;处理三维空间数据&#xff0c;提供X、Y、Z坐标及物体的姿态…

日常开发中,使用JSON.stringify来实现深拷贝的坑

使用JSON.stringify的方式来实现深拷贝的弊端 弊端一&#xff1a;无法拷贝NaN、Infinity、undefined这类值 无法拷贝成功的原因&#xff1a; 对于JSON来说&#xff0c;它支持的数据类型只有null、string、number、boolean、Object、Array&#xff0c;所以对于它不支持的数据类…

AI大模型(如GPT、BERT等)可以通过自然语言处理(NLP)和机器学习技术,显著提升测试效率

在软件测试中,AI大模型(如GPT、BERT等)可以通过自然语言处理(NLP)和机器学习技术,显著提升测试效率。以下是几个具体的应用场景及对应的代码实现示例: 1. 自动生成测试用例 AI大模型可以根据需求文档或用户故事自动生成测试用例。 代码示例(使用 OpenAI GPT API): …

【Linux】Ubuntu Linux 系统——Node.js 开发环境

ℹ️大家好&#xff0c;我是练小杰&#xff0c;今天星期五了&#xff0c;同时也是2025年的情人节&#xff0c;今晚又是一个人的举个爪子&#xff01;&#xff01; &#x1f642; 本文是有关Linux 操作系统中 Node.js 开发环境基础知识&#xff0c;后续我将添加更多相关知识噢&a…

Dockerfile 编写推荐

一、导读 本文主要介绍在编写 docker 镜像的时候一些需要注意的事项和推荐的做法。 虽然 Dockerfile 简化了镜像构建的过程&#xff0c;并且把这个过程可以进行版本控制&#xff0c;但是不正当的 Dockerfile 使用也会导致很多问题。 docker 镜像太大。如果你经常使用镜像或者…

mysql 学习16 视图,存储过程,存储函数,触发器

视图&#xff0c; 存储过程&#xff0c; 存储函数 触发器

SpringBoot+Vue+数据可视化的动漫妆造服务平台(程序+论文+讲解+安装+调试+售后等)

感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望帮助更多的人。 系统介绍 在当今数字化高速发展的时代&#xff0c;动漫产业迎来了前所未有的繁荣&#xff0c;动漫…

rtsp rtmp 跟 http 区别

SDP 一SDP介绍 1. SDP的核心功能 会话描述&#xff1a;定义会话的名称、创建者、时间范围、连接地址等全局信息。媒体协商&#xff1a;明确媒体流的类型&#xff08;如音频、视频&#xff09;、传输协议&#xff08;如RTP/UDP&#xff09;、编码格式&#xff08;如H.264、Op…

Containerd 简介、安装与使用指南

1. Containerd 简介 Containerd 是一个开源的容器运行时&#xff0c;专注于管理容器的生命周期。它最初是 Docker 的一部分&#xff0c;后来被分离出来成为一个独立的项目&#xff0c;并成为 Kubernetes 和其他容器平台的底层运行时。Containerd 提供了容器的创建、启动、停止…

开源语音克隆项目 OpenVoice V2 本地部署

#本机环境 WIN11 I5 GPU 4060ti 16G 内存 32G #开始 git clone https://github.com/myshell-ai/OpenVoice.git conda create -n opvenv python3.9 -y conda activate opvenv pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/…

【Prometheus】prometheus结合domain_exporter实现域名监控

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

rustdesk编译修改名字

最近&#xff0c;我用Rust重写了一个2W行C代码的linux内核模块。在此记录一点经验。我此前没写过内核模块&#xff0c;认识比较疏浅&#xff0c;有错误欢迎指正。 为什么要重写&#xff1f; 这个模块2W行代码量看起来不多&#xff0c;却在线上时常故障&#xff0c;永远改不完。…

在linux系统中安装Anaconda,并使用conda

系统 : ubuntu20.04 显卡&#xff1a;NVIDIA GTX1650 目录 安装Anaconda第一步&#xff1a;下载合适版本的Anconda1. 查看自己Linux的操作系统及架构命令&#xff1a;uname -a2. 下载合适版本的Anconda 第二步&#xff1a;安装Aanconda1. 为.sh文件设置权限2. 执行.sh文件2.1 .…