直播推流和拉流--系统篇

        今天实现一下直播推流和拉流。服务器端使用opencloudos8系统。顺便把我之前写的小系统弄上去跑跑,搭建个git服务器,使用ssh协议,密钥方式。

        先展示一下在iphone上推流效果图

        再展示下在谷歌浏览器上的拉流效果图,safari浏览器和微信浏览器效果都是差不多

        再展示下在百度小程序上的拉流效果图

        实现推流,新建uniapp项目,命名为app,为何要新建uniapp项目啊,不想写条件编译,单独出负责app模块更加清晰。新建live-pusher.nvue,同时弄个同名文件夹。在index.vue里面写个跳转

<navigator url="live-pusher/live-pusher" hover-class="navigator-hover">
        <button type="default">实时音视频录制</button>
    </navigator>

        在live-pusher.nvue里面编写

<template>
    <view>
        <live-pusher id='livePusher' ref="livePusher" class="livePusher" url="这里填写服务器访问地址"
        mode="SD" :muted="false" :enable-camera="true" :auto-focus="true"
        aspect="9:16" @statechange="statechange" @netstatus="netstatus" @error = "error"
        ></live-pusher>
        <button class="btn" @click="start">开始推流</button>
        <button class="btn" @click="pause">暂停推流</button>
        <button class="btn" @click="resume">resume</button>
        <button class="btn" @click="stop">停止推流</button>
        <button class="btn" @click="snapshot">快照</button>
        <button class="btn" @click="startPreview">开启摄像头预览</button>
        <button class="btn" @click="stopPreview">关闭摄像头预览</button>
        <button class="btn" @click="switchCamera">切换摄像头</button>
    </view>
</template>

<script>
    export default {
            data() {
                return {}
            },
            onReady() {
                // 注意:需要在onReady中 或 onLoad 延时
                this.context = uni.createLivePusherContext("livePusher", this);
            },
            methods: {
                statechange(e) {
                    console.log("statechange:" + JSON.stringify(e));
                },
                netstatus(e) {
                    console.log("netstatus:" + JSON.stringify(e));
                },
                error(e) {
                    console.log("error:" + JSON.stringify(e));
                },
                start: function() {
                    this.context.start({
                        success: (a) => {
                            console.log("livePusher.start:" + JSON.stringify(a));
                        },
                        fail: (err) => {
                            console.log('推流失败:', err);
                        }
                    });
                },
                close: function() {
                    this.context.close({
                        success: (a) => {
                            console.log("livePusher.close:" + JSON.stringify(a));
                        }
                    });
                },
                snapshot: function() {
                    this.context.snapshot({
                        success: (e) => {
                            console.log(JSON.stringify(e));
                        }
                    });
                },
                resume: function() {
                    this.context.resume({
                        success: (a) => {
                            console.log("livePusher.resume:" + JSON.stringify(a));
                        }
                    });
                },
                pause: function() {
                    this.context.pause({
                        success: (a) => {
                            console.log("livePusher.pause:" + JSON.stringify(a));
                        }
                    });
                },
                stop: function() {
                    this.context.stop({
                        success: (a) => {
                            console.log(JSON.stringify(a));
                        }
                    });
                },
                switchCamera: function() {
                    this.context.switchCamera({
                        success: (a) => {
                            console.log("livePusher.switchCamera:" + JSON.stringify(a));
                        }
                    });
                },
                startPreview: function() {
                    this.context.startPreview({
                        success: (a) => {
                            console.log("livePusher.startPreview:" + JSON.stringify(a));
                        }
                    });
                },
                stopPreview: function() {
                    this.context.stopPreview({
                        success: (a) => {
                            console.log("livePusher.stopPreview:" + JSON.stringify(a));
                        }
                    });
                }
            }
        }
</script>

<style>

</style>
 

        注意改写live-pusher组件的url,由于服务器实现方法多样,大家改成各自的服务器地址,另外把声音开了,:muted="false"

        拉流就以百度小程序拉流代码为例

        新建uniapp项目,命名为baidu。再新建live-player.vue文件,也建立同名文件夹。在index.vue里面也写个跳转

<navigator url="live-player/live-player" hover-class="navigator-hover">
        <button type="default">实现音视频播放</button>
    </navigator>

        在live-player.vue文件里面编写

<template>
    <view>
        <live-player
          src="这里写服务器端地址"
          autoplay
          @statechange="statechange"
          @error="error"
          style="width: 300px; height: 225px;"
        />
    </view>
</template>

<script>
    export default {
        data() {
            return {
                
            }
        },
        methods: {
            
        }
    }
</script>

<style>

</style>
        注意live-player组件的src写入各自服务器地址

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

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

相关文章

安全芯片 OPTIGA TRUST M 使用介绍与示例(基于STM32裸机)

文章目录 目的资料索引硬件电路软件框架介绍数据存储框架移植框架使用 使用示例示例地址与硬件连接通讯测试功能测试 总结 目的 OPTIGA TRUST M 是英飞凌推出的安全芯片&#xff0c;芯片通提供了很多 slot &#xff0c;用于存放各类安全证书、密钥、用户数据等&#xff0c;内置…

数据结构 之 二叉树遍历 ------中序(根)遍历 和 后序(根)遍历(六)

提示&#xff1a;本篇章主要讲解数据结构中树的相关知识。 文章目录 中序&#xff08;根&#xff09;遍历二叉树&#xff08;LTR&#xff09;后序&#xff08;根&#xff09;遍历二叉树&#xff08;LRT)中根遍历二叉树的递归算法 &#xff08;重要&#xff09;后序遍历二叉树的…

数据结构 ——— 二叉树的概念及结构

目录 二叉树的概念 特殊的二叉树 一、满二叉树 二、完全二叉树 二叉树的概念 二叉树树示意图&#xff1a; 从以上二叉树示意图可以看出&#xff1a; 二叉树每个节点的度不大于 2 &#xff0c;那么整个二叉树的度也不大于 2 &#xff0c;但是也不是每个节点都必须有 2 个…

IDEA解决 properties 文件乱码问题

博主介绍&#xff1a; 计算机科班人&#xff0c;全栈工程师&#xff0c;掌握C、C#、Java、Python、Android等主流编程语言&#xff0c;同时也熟练掌握mysql、oracle、sqlserver等主流数据库&#xff0c;具有丰富的项目经验和开发技能。提供相关的学习资料、程序开发、技术解答、…

MySQL 9从入门到性能优化-创建触发器

【图书推荐】《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;》-CSDN博客 《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;&#xff08;数据库技术丛书&#xff09;》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) MySQL9数据库技术_夏天又到了…

电子邮件营销平台教程:从零开始营销指南!

电子邮件营销平台功能详解&#xff1f;哪个电子邮件营销平台好&#xff1f; 无论是初创企业还是成熟品牌&#xff0c;掌握电子邮件营销平台的技巧&#xff0c;都能有效提升品牌影响力和销售业绩。MailBing将为你提供一份详尽的电子邮件营销平台教程&#xff0c;帮助你从零开始…

软件行业似乎要消失了

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 软件行业是企业倒闭和裁员降薪的重灾区&#xff0c;其实比网站、站长、电商群体更惨。 据赛迪发布&#xff0c;354家软件上市公司财报数据显示&#xff1a;上半年合计利润6.9亿&#xff0c;同比下跌91.62%&#x…

windows 10 clion配置32位c++环境

主要就是这一个地方&#xff0c;需要32位的mingw32&#xff0c;mingw32可以在红框的蓝色download下载

计算机视觉-对极几何

1 基本概念 对极几何&#xff08;Epipolar Geometry&#xff09;描述的是两幅视图之间的内在射影关系&#xff0c;与外部场景无关&#xff0c;只依赖于摄像机内参数和这两幅视图之间的相对位姿 两视图的对极几何可以理解为图像平面与以基线为轴的平面束相交的几何关系&#xf…

leetcode344. Reverse String

Write a function that reverses a string. The input string is given as an array of characters s. You must do this by modifying the input array in-place with O(1) extra memory. Example 1: Input: s [“h”,“e”,“l”,“l”,“o”] Output: [“o”,“l”,“l”…

ssm016基于 Java Web 的校园驿站管理系统(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;校园驿站管理系统的设计与实现 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好…

鸿蒙自定义加载 LoadingDialog

代码如下&#xff1a; Component export struct LoadingDialog {Prop title: stringbuild() {Stack() {Column() {LoadingProgress().color(Color.White).width(100).height(100)Text(this.title).fontSize(18).fontColor(0xffffff).margin({ top: 8 }).visibility(this.title …

【AI开源项目】Dify- 轻松打造可持续运营的 GPT 系列的 AI应用 —— 全面解析LLMOps平台

文章目录 什么是Dify&#xff1f;Dify的名称由来 了解LLMOpsDify的核心功能兼容多种LLMs Dify的优势完全开源核心能力 如何安装Dify快速启动使用Helm Chart在Kubernetes上部署自定义配置 使用Dify创建AI应用第一步&#xff1a;创建应用程序第二步&#xff1a;编写和调试提示词第…

【HTML】——VS Code 基本使用入门和常见操作,新手小白也能看懂

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 零&#xff1a;HTML开发工具VSCode的使用 1&#xff1a;创建项目 2&#xff1a;创建格式模板&#x…

基于springboot+vue实现的公考知识学习平台 (源码+L文+ppt)4-103

4.1 系统功能结构设计 根据对公考知识学习平台的具体需求分析&#xff0c;把系统可以划分为几个不同的功能模块&#xff1a;管理员可以对系统首页、个人中心、用户管理、讲师管理、在线咨询管理、学习资料管理、讲座信息管理、讲座预约管理、学习论坛、练习自测管理、试题管理…

计算结构力学:多自由度振动系统

本文以笔记的形式记录计算结构力学的若干基础知识。 注1&#xff1a;限于研究水平&#xff0c;分析难免不当&#xff0c;欢迎批评指正。 注2&#xff1a;文章内容会不定期更新。 预修1&#xff1a;线性代数 1. 标准特征值 复矩阵Schur分解&#xff1a;对于复矩阵&#xff0c…

将多个commit合并成一个commit并提交

0 Preface/foreword 1 压缩多个commit方法 1.1 git merge --squash 主分支&#xff1a;main 开发分支&#xff1a;test 当前在test分支提交了8个commits&#xff0c;功能已经开发完成&#xff0c;需要将test分支合并到main分支&#xff0c;但是不想在合并时候&#xff0c;看…

JVM 实战篇(一万字)

此笔记来至于 黑马程序员 内存调优 内存溢出和内存泄漏 内存泄漏&#xff08;memory leak&#xff09;&#xff1a;在Java中如果不再使用一个对象&#xff0c;但是该对象依然在 GC ROOT 的引用链上&#xff0c;这个对象就不会被垃圾回收器回收&#xff0c;这种情况就称之为内…

使用Fiddler Classic抓包工具批量下载音频资料

1. 通过F12开发者工具&#xff0c;下载音频文件 浏览器打开音频列表->F12快捷键->网络->媒体&#xff0c;播放一个音频文件&#xff0c;右边媒体下生成一个音频文件&#xff0c;右击“在新标签页中打开”&#xff0c;可以下载这个音频文件。 2.通过Fiddler Classic抓…

新能源行业必会基础知识---电力现货问答---第9问---什么是输电权?什么是输电权市场?

新能源行业必会基础知识-----电力现货问答-----主目录-----持续更新https://blog.csdn.net/grd_java/article/details/142909208 虽然这本书已经出来有几年了&#xff0c;现货市场已经产生了一定变化&#xff0c;但是原理还是相通的。还是推荐大家买来这本书进行阅读观看&#…