WebRtc直播流的播放

WebRtc直播流的播放

后端服务已经使用ZLMediaKit框架提供了直播流地址

一、WebRtc原生播放器播放直播流

1、使用ZLMediaKit框架提供的ZLMRTCClient.js

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>播放示例</title> <!-- 引入 zlmrtcclient.js 1.0.2 --> <script src="http://117.40.242.70:35080/ZLMRTCClient.js"></script> </head> <body> <!-- 视频播放元素 --> <video autoplay controls></video> <script> // 1. 获取视频元素 const videoElement = document.getElementById('videoPlayer'); // 2. 配置参数(严格对应 1.0.2 版本的 defaults 结构) const config = { element: videoElement, // 绑定视频播放元素(必填) debug: true, // 开启调试日志,方便排查问题 zlmsdpUrl: 'http://117.40.242.70:35080/index/api/webrtc?app=live&stream=test1&type=play', // 后端提供的流地址(必填) simulcast: false, // 不启用 simulcast(早期版本可能不支持) useCamera: false, // 播放时不需要启用本地摄像头 audioEnable: true, // 启用音频 videoEnable: true, // 启用视频 recvOnly: true, // 仅接收流(播放模式) resolution: { w: 800, h: 450 }, // 视频分辨率 usedatachannel: false // 不使用数据通道 }; // 3. 创建实例(1.0.2 版本可能通过构造函数直接初始化,无需 connect 方法) const rtcClient = new ZLMRTCClient.Endpoint(config); // 4. 监听事件(1.0.2 版本的事件名可能与早期定义一致) // 监听错误事件 rtcClient.on('error', (err) => { console.error('ZLMRTCClient 错误:', err); }); // 监听 WebRTC 不支持事件 rtcClient.on('webrtcNotSupport', () => { alert('当前浏览器不支持 WebRTC,请更换浏览器'); }); var remoteStream = null; // 监听远程流添加事件(核心:获取到流后播放) rtcClient.on('WEBRTC_ON_REMOTE_STREAMS', (event) => { console.log('收到远程流,开始播放'); // 1.0.2 版本可能自动绑定到 element,若未自动绑定则手动设置 if (videoElement.srcObject !== event.streams) { const stream = event.streams[0]; remoteStream = stream; videoElement.srcObject = stream; } }); // 监听连接状态变化 rtcClient.on('WEBRTC_ON_CONNECTION_STATE_CHANGE', (state) => { console.log('连接状态:', state); // 可能的状态:connecting/connected/disconnected }); function stop() { if (!rtcClient) return; // 停止视频播放 videoElement.pause(); videoElement.srcObject = null; // 停止媒体流轨道 if (remoteStream) { remoteStream.getTracks().forEach(track => track.stop()); remoteStream = null; } // 断开连接并清理实例 if (rtcClient.disconnect) { rtcClient.disconnect(); } else if (rtcClient.close) { rtcClient.close(); } rtcClient = null; } </script> </body> </html>

ZLMRTCClient.js的版本不同,实例化对象rtcClient对象不同,这里使用的1.0.2是

new ZLMRTCClient.Endpoint(config)

二、使用开源的播放器easyPlayer

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>演示</title> <script src="./js/EasyPlayer-pro.js"></script> </head> <style> .player_item { position: relative; padding-bottom: 56%; background-color: black; margin-bottom: 20px; } .player_box { position: absolute; top: 0; bottom: 0; right: 0; left: 0; } .inputs { -webkit-appearance: none; background-color: #fff; background-image: none; border-radius: 4px; border: 1px solid #dcdfe6; box-sizing: border-box; color: #606266; display: inline-block; font-size: inherit; height: 36px; line-height: 36px; outline: none; padding: 0 15px; transition: border-color .2s cubic-bezier(.645, .045, .355, 1); width: 100%; max-width: 600px; margin-right: 16px; margin-bottom: 16px; margin-top: 16px; } .btn-item { cursor: pointer; display: inline-block; padding: 6px 12px; margin-right: 15px; border-radius: 4px; border: 1px #ccc solid; } .df { display: flex; align-items: center; margin-bottom: 16px; } .box { padding-top: 10px; margin: auto; max-width: 800px; } </style> <body> <div> <br> <h2>EasyPlayerPro案例演示</h2> <br> <div> <div></div> </div> <div> <input type="checkbox" /><span>音频</span> </div> <input type="text" value="ws://localhost:6230/ws_flv/live/stream_1_0.flv"> <div> <div>播放</div> <div>重播</div> <div>静音</div> <div>注销</div> </div> </div> <script> window.onload = function () { var playerInfo = null var config = { stretch: true, hasAudio: true, } playCreate() var input = document.getElementById('input'); var audio = document.getElementById('hasAudio'); var player = document.getElementById('onPlayer'); var replay = document.getElementById('onReplay'); var mute = document.getElementById('onMute'); var stop = document.getElementById('onStop'); if (config.hasAudio) audio.checked = true audio.onclick = () => { if (audio.checked == true) { config.hasAudio = true } else { config.hasAudio = false } } player.onclick = () => { onPlayer() } replay.onclick = () => { onReplay() } mute.onclick = () => { onMute() } stop.onclick = () => { onStop() } function playCreate() { var container = document.getElementById('player_box'); playerInfo = new EasyPlayerPro(container, config); } function onPlayer() { playerInfo && playerInfo.play(input.value).then(() => { }).catch((e) => { console.error(e); }); } function onMute() { if (!playerInfo) return playerInfo.setMute(true) } function onReplay() { onDestroy().then(() => { playCreate(); onPlayer() }); } function onDestroy() { return new Promise((resolve, reject) => { if (playerInfo) { playerInfo.destroy() playerInfo = null } setTimeout(() => { resolve(); }, 100); }) } function onStop() { onDestroy().then(() => { playCreate(); }); } } </script> </body> </html>

播放效果好,具有截图、视频录制等功能

Read more

AI编程实战 : 使用 TRAE CN 将 MasterGo 设计稿转化为前端代码

AI编程实战 : 使用 TRAE CN 将 MasterGo 设计稿转化为前端代码

文章目录 * 什么是 MCP * 前置条件 * 1. 账号权限 * 2. 环境要求 * 3. 设计稿准备 * MasterGo AI Bridge 支持的能力 * 操作步骤 * 第一步: 安装/升级 TRAE CN IDE * 第二步: 获取 MasterGo 的 Personal Access Token * 第三步: 添加 MCP Server * 第四步: 创建自定义智能体(可选) * 第五步: 调用 MCP 生成前端代码 * 5.1 复制 MasterGo 设计稿链接 * 5.2 在 TRAE CN IDE

By Ne0inhk
用 龙虾10 分钟搞定 C 语言 + 前端实训?我试了,真香!

用 龙虾10 分钟搞定 C 语言 + 前端实训?我试了,真香!

🚀 用龙虾10 分钟搞定 C 语言 + 前端实训?我试了,真香! 一句话总结:选对模型 + 写好提示词,让“龙虾”帮你从零生成可运行的 C 语言成绩管理系统 + 全栈博客前端项目,连实训报告都自动生成! 大家好,我是 VON。最近“AI 编程助手”火出圈,但很多人还在手动敲代码、调 Bug、写报告……其实,只要用对工具,一个指令就能完成整套高校实训作业! 今天我就带大家实测:如何用 AI 智能体(俗称“龙虾”) 快速搞定两类典型课程设计—— ✅ C 语言学生成绩管理系统 ✅ React 全栈个人博客系统 全程无需打开 IDE,甚至不用看一行代码!👇 🔧 第一步:选对模型,效率翻倍! 智能体的输出质量,70%

By Ne0inhk
【前端实战】Axios 错误处理的设计与进阶封装,实现网络层面的数据与状态解耦

【前端实战】Axios 错误处理的设计与进阶封装,实现网络层面的数据与状态解耦

目录 【前端实战】Axios 错误处理的设计与进阶封装,实现网络层面的数据与状态解耦 一、为什么网络错误处理一定要下沉到 Axios 层 二、Axios 拦截器 interceptors 1、拦截器的基础应用 2、错误分级和策略映射的设计 3、错误对象标准化 三、结语         作者:watermelo37         ZEEKLOG优质创作者、华为云云享专家、阿里云专家博主、腾讯云“创作之星”特邀作者、火山KOL、支付宝合作作者,全平台博客昵称watermelo37。         一个假装是giser的coder,做不只专注于业务逻辑的前端工程师,Java、Docker、Python、LLM均有涉猎。 --------------------------------------------------------------------- 温柔地对待温柔的人,包容的三观就是最大的温柔。 --------------------------------------------------------------------- 【前

By Ne0inhk
一文了解Blob文件格式,前端必备技能之一

一文了解Blob文件格式,前端必备技能之一

文章目录 * 前言 * 一、什么是Blob? * 二、Blob的基本特性 * 三、Blob的构造函数 * 四、常见使用场景 * 1. 文件下载 * 2. 图片预览 * 3. 大文件分片上传 * 四、Blob与其他API的关系 * 1. File API * 2. FileReader * 3. URL.createObjectURL() * 4. Response * 五、性能与内存管理 * 六、实际案例:导出Word文档 * 七、浏览器兼容性 * 八、总结 前言 最近在项目中需要导出文档时,我首次接触到了 Blob 文件格式。作为一个前端开发者,虽然经常听到 "Blob" 这个术语,但对其具体原理和应用场景并不十分了解。经过一番研究和实践,

By Ne0inhk