Android WebRTC+SRS/ZLM视频通话(5):Android使用WebRTC从SRS/ZLMediaKit拉流

这篇具有很好参考价值的文章主要介绍了Android WebRTC+SRS/ZLM视频通话(5):Android使用WebRTC从SRS/ZLMediaKit拉流。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Android WebRTC+SRS/ZLM视频通话(5):Android使用WebRTC从SRS/ZLMediaKit拉流

来自奔三人员的焦虑日志

接着上一章内容,继续来记录Android是如何使用WebRTC从SRS/ZLMediaKit拉流播放。WebRTC是一种实现实时音视频通信的技术,而SRS(SRS Streaming Cluster)和ZLMediaKit则是两种常用的流媒体服务。 Android 平台上,可以使用 WebRTC 从 SRS/ZLMediaKit 中拉取流并进行播放。

WebRTC推拉流的区别

推流:WebRTC 中的推流通常指将本地音视频流发送到远端。推流涉及到本地设备上的音视频采集、编码、传输等过程。

拉流:WebRTC 中的拉流通常指从远端获取音视频流并进行播放。拉流涉及到 RTCPeerConnection 对象的建立和音视频解码等过程。拉流可以用于实现实时音视频播放、音视频录制等场景。

总的来说,WebRTC 的推拉流都是通过 PeerConnection 对象进行实现,具体的实现细节会有一些不同。其中推流涉及到本地设备的音视频采集和编码等过程,而拉流则是接收远端的音视频流进行解码和播放。

注意:这里暂不考虑NAT可穿透服务器,详情可了解STUN/TURN 服务器的搭建和使用

别看一堆文字就头大,实际上也就是两行代码的事,注意初始化时PeerConnection!!.addTransceiver方法的参数设置即可。去掉视频、音频采集等代码,剩下的就是交换sdp的API地址变一下就好。

		//拉流
        if (!isPublish) {
            peerConnection!!.addTransceiver(
                MediaStreamTrack.MediaType.MEDIA_TYPE_AUDIO,
                RtpTransceiver.RtpTransceiverInit(RtpTransceiver.RtpTransceiverDirection.RECV_ONLY)
            )
            peerConnection!!.addTransceiver(
                MediaStreamTrack.MediaType.MEDIA_TYPE_VIDEO,
                RtpTransceiver.RtpTransceiverInit(RtpTransceiver.RtpTransceiverDirection.RECV_ONLY)
            )
        }
        //推流
        else {
            peerConnection!!.addTransceiver(
                MediaStreamTrack.MediaType.MEDIA_TYPE_AUDIO,
                RtpTransceiver.RtpTransceiverInit(RtpTransceiver.RtpTransceiverDirection.SEND_ONLY)
            )
            peerConnection!!.addTransceiver(
                MediaStreamTrack.MediaType.MEDIA_TYPE_VIDEO,
                RtpTransceiver.RtpTransceiverInit(RtpTransceiver.RtpTransceiverDirection.SEND_ONLY)
            )
         }

这里我已经封装成工具类,详情看WebRTCUtil

页面代码

跟推流类似,我们新增一个预览页面、播放地址文本和一个开始拉流按钮,具体看下面代码:

					//拉流地址
                    Row(
                        modifier = Modifier.fillMaxWidth(),
                        verticalAlignment = Alignment.CenterVertically
                    ) {
                        Box(
                            modifier = Modifier.weight(1f)
                        ) {
                            Text(text = playUrl.value)
                        }
                        Box(
                            modifier = Modifier
                                .clickable {
                                    doPlay()//开始播放
                                }
                                .width(80.dp)
                                .background(
                                    Color.White,
                                    RoundedCornerShape(5.dp)
                                )
                                .border(
                                    1.dp,
                                    Color(0xFF000000),
                                    shape = RoundedCornerShape(5.dp)
                                )
                                .padding(5.dp),
                            contentAlignment = Alignment.Center
                        ) {
                            Text(text = "拉流")
                        }
                    }
                    //拉流部分
                    Box(
                        modifier = Modifier
                            .fillMaxWidth()
                            .height(300.dp)
                    ) {
                        surfaceViewRenderer2 = mSurfaceViewRenderer2(mEglBase, webRtcUtil2!!)
                        AndroidView({ surfaceViewRenderer2!! }) { videoView ->
                            CoroutineScope(Dispatchers.Main).launch {
                                //根据视频大小缩放surfaceViewRenderer控件
                                var screenSize = "480-640"
                                var screenSizeD = 720 / 1280.0
                                val screenSizeS: Array<String> =
                                    screenSize.split("-").toTypedArray()
                                screenSizeD =
                                    screenSizeS[0].toInt() / (screenSizeS[1].toInt() * 1.0)
                                var finalScreenSizeD = screenSizeD
                                var vto = videoView.viewTreeObserver
                                vto.addOnPreDrawListener {
                                    var width: Int = videoView.measuredWidth
                                    var height: Int = (finalScreenSizeD * width).toInt()
                                    //获取到宽度和高度后,可用于计算
                                    var layoutParams = videoView.layoutParams
                                    layoutParams.height = height
                                    videoView.layoutParams = layoutParams
                                    true
                                }
                            }
                        }
                    }
@Composable
fun mSurfaceViewRenderer2(mEglBase: EglBase, webRtcUtil2: WebRTCUtil): SurfaceViewRenderer {
    val context = LocalContext.current
    val surfaceViewRenderer = remember {
        SurfaceViewRenderer(context).apply {
            id = R.id.surface_view_2
        }
    }
    //Makes MapView follow the lifecycle of this composable
    val lifecycleObserver = rememberMapLifecycleObserver(surfaceViewRenderer, mEglBase, webRtcUtil2)
    val lifecycle = LocalLifecycleOwner.current.lifecycle
    DisposableEffect(lifecycle) {
        lifecycle.addObserver(lifecycleObserver)
        onDispose {
            lifecycle.removeObserver(lifecycleObserver)
        }
    }
    return surfaceViewRenderer
}
	private var webRtcUtil2: WebRTCUtil? = null
    private var playUrl =
        mutableStateOf("https://192.168.1.172/index/api/webrtc?app=live&stream=test&type=play")
    private var surfaceViewRenderer2: SurfaceViewRenderer? = null
    /**
     * 开始播放
     */
    private fun doPlay() {
        if (webRtcUtil2 != null) {
            webRtcUtil2!!.destroy()
        }
        webRtcUtil2 = WebRTCUtil(this@MainActivity)
        webRtcUtil2!!.create(
            mEglBase,
            surfaceViewRenderer2,
            isPublish = false,
            isShowCamera = true,
            playUrl = playUrl.value,
            callBack = object : WebRTCUtil.WebRtcCallBack {
                override fun onSuccess() {}
                override fun onFail() {}
            })
    }

主要新增这几个,详情可到Gitee拉取完整Demo

运行效果

Android WebRTC+SRS/ZLM视频通话(5):Android使用WebRTC从SRS/ZLMediaKit拉流,Android WebRTC+SRS/ZLM视频通话,android,webrtc,音视频,WebRTC拉流,ZLMediaKit

第五章到这里就结束了,下节继续记录Android如何往SRS推拉流,占用您的垃圾时间了,实在对不住文章来源地址https://www.toymoban.com/news/detail-623085.html

THE END


感谢查阅
玉念聿辉:编辑

到了这里,关于Android WebRTC+SRS/ZLM视频通话(5):Android使用WebRTC从SRS/ZLMediaKit拉流的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SRS4 对接海康威视GB28181协议推流 RTMP、webRTC拉流

    Ubuntu 20.04.2 LTS (GNU/Linux 5.4.0-88-generic x86_64) 编译SRS,需要切换到Develop分支,并开启gb28181功能: 配置文件:push.gb28181.conf Remark: 一定要修改配置文件中的host配置,改成你的服务器的IP,摄像头能访问到的这个IP。后续会改进为自动获取,目前还需要修改配置。 然后使用配置文件

    2023年04月08日
    浏览(46)
  • SRS服务器RTMP2WebRTC外网拉流配置

    将前端服务开放到外网,并且在外网使用WebRTC拉流,要求全部使用同一端口。 外网地址:10.172.59.42(域名:test.com)外网端口为33333 内网SRS服务器地址:192.168.5.177,内网端口为10090 路由器将外网33333端口映射到内网192.168.5.177:10090 一、使用docker搭建SRS服务器 1、编辑~/.bashrc,添

    2024年04月11日
    浏览(37)
  • SRS流媒体服务器——SRS4.0 WebRTC一对一通话环境搭建与逻辑分析

    环境搭建 SRS4.0 WebRTC1对1通话逻辑分析 1. 安装go语⾔环境 在Go语⾔官⽹找到对应的安装包(Downloads - The Go Programming Language) 下载和解析(使用的是阿里云的Ubuntu系统): 3.需要配置 GOROOT 和 PATH环境变量,在/etc/profile中配置。 4. 然后使用 source /etc/profile 命令使配置文件生效,就

    2023年04月08日
    浏览(52)
  • WebRTC音视频通话-WebRTC本地视频通话使用ossrs服务搭建

    iOS开发-ossrs服务WebRTC本地视频通话服务搭建 之前开发中使用到了ossrs,这里记录一下ossrs支持的WebRTC本地服务搭建。 ossrs是什么呢? SRS(Simple Realtime Server)是一个简单高效的实时视频服务器,支持RTMP、WebRTC、HLS、HTTP-FLV、SRT等多种实时流媒体协议。 官网地址:https://ossrs.net/lt

    2024年02月12日
    浏览(46)
  • Windows7中使用SRS集成音视频一对一通话

    SRS早就具备了SFU的能力,比如一对一通话、多人通话、直播连麦等等。在沟通中,一对一是常用而且典型的场景, 让我们一起来看看如何用SRS做直播和RTC一体化的一对一通话。 一、启动windows7-docker  二、拉取SRS镜像 执行命令:docker pull ossrs/srs:4 使用docker images查看当前镜像列

    2024年02月16日
    浏览(58)
  • 视频直播新时代,低延时直播交互,Web,Android,WebRtc推流拉流测试

    直播现在已经深入了生活,学习,工作和娱乐方方面面,由于前些年的技术所限,传统rtmp,flv,m3u8 技术让直播快速启动项目产品,但也有很多不足,特别的交互式直播,一直是其中的痛点,延时较大(1-10秒不等) 让用户即想用,已不是太爽,随技术进步,Webrtc已经切入了视

    2024年01月19日
    浏览(58)
  • WebRTC实战-第二章-使用WebRTC实现音视频通话

    、 什么是WebRTC|WebRTC入门到精通必看|快速学会音视频通话原理|WebRTC超全资料分享FFmpeg/rtmp/hls/rtsp/SRS WebRTC **WebRTC详细指南** http://www.vue5.com/webrtc/webrtc.html WEBRTC三种类型(Mesh、MCU 和 SFU)的多方通信架构 WebRTC API包括媒体捕获,音频和视频编码和解码,传输层和会话管理 。 假设

    2023年04月12日
    浏览(53)
  • Android平台一对一音视频通话方案对比:WebRTC VS RTMP VS RTSP

    一对一音视频通话使用场景 一对一音视频通话都需要稳定、清晰和流畅,以确保良好的用户体验,常用的使用场景如下: 社交应用 :社交应用是一种常见的使用场景,用户可以通过音视频通话进行面对面的交流; 在线教育: 老师和学生可以通过音视频通话功能进行实时互

    2024年02月13日
    浏览(53)
  • SpringBoot+WebSocket+Vue+PeerJs实现WebRTC视频通话功能,Vue视频通话,web视频通话,webrtc视频通话

    博主正在担任一款电商app的全栈开发,其中涉及到一个 视频通话 功能。但是由于业务需求及成本考虑,不能使用第三方提供的SDK进行开发。所以博主选择使用PeerJs+WebSocket来实现这个功能。 WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket通信协议于2011年被IETF定

    2024年02月08日
    浏览(50)
  • 开源流媒体服务器ZLMediaKit在Windows上运行、配置、按需拉流拉取摄像头rtsp视频流)并使用http-flv网页播放

    目前市面上有很多开源的流媒体服务器解决方案,常见的有SRS、EasyDarwin、ZLMediaKit和Monibuca等。 1、SRS GitHub - ossrs/srs: SRS is a simple, high efficiency and realtime video server, supports RTMP, WebRTC, HLS, HTTP-FLV, SRT, MPEG-DASH and GB28181. 2、EasyDarwin https://github.com/EasyDarwin/EasyDarwin 3、Monibuca Monibuca ·

    2023年04月16日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包