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

手把手教你使用 Faster-Whisper 实时语音输入转文本,本地部署教程

手把手教你使用 Faster-Whisper 实时语音输入转文本,本地部署教程

文章目录 * 前言 * 一、安装环境 * 二、使用步骤 * 1.下载模型 * 2.实时录音转文本脚本 * 3.报错解决方法 * 总结 前言 要想实现像豆包、微信等一样的语音输入功能,通常有两种主流方案:云端 API(轻量、准确度极高)和 本地模型(免费、隐私、无需联网)。由于目前开发的系统需要添加一个语音识别功能,刚好记录一下使用 Faster-Whisper 实时语音输入转文本。Faster-Whisper官网地址链接: Faster-Whisper官网地址 复现成功如下图所示,请看下文教程就能部署本地实时语音输入转文本模型: 电脑有显卡的话可以参考下面这篇文章安装 cuda 和 cudnn cuda和cudnn的安装教程: cuda和cudnn的安装教程(全网最详细保姆级教程) 一、安装环境 在你的虚拟环境安装 faster-whisper,命令如下: pip install faster-whisper 安装录音库

终极jQuery范围滑块指南:Ion.RangeSlider完全入门教程

终极jQuery范围滑块指南:Ion.RangeSlider完全入门教程 【免费下载链接】ion.rangeSliderjQuery only range slider 项目地址: https://gitcode.com/gh_mirrors/io/ion.rangeSlider 在当今的Web开发中,jQuery范围滑块已成为创建交互式用户界面的重要组件。Ion.RangeSlider作为一款功能强大的jQuery滑块插件,为开发者提供了简单、灵活且响应式的解决方案,能够轻松实现各种范围选择需求。无论您需要价格筛选、日期选择还是数值范围设定,这款插件都能完美胜任。本文将为您提供完整的入门教程,帮助您快速掌握这个实用的工具。 什么是Ion.RangeSlider?🚀 Ion.RangeSlider是一款基于jQuery的响应式范围滑块插件,它完全替代了原生的HTML输入元素,提供了丰富的配置选项和美观的界面。这个插件支持单滑块和双滑块两种模式,适用于各种Web应用场景,从简单的数值选择到复杂的数据筛选都能轻松应对。 Ion.RangeSlider在平板设备上的实际应用

DeepSeek-R1-Distill-Qwen-1.5B开箱即用:1块钱起体验AI写作

DeepSeek-R1-Distill-Qwen-1.5B开箱即用:1块钱起体验AI写作 你是不是也和我一样,每天都在为写文章绞尽脑汁?标题没灵感、内容干巴巴、逻辑不顺畅……作为自媒体作者,最怕的不是熬夜,而是写了半天没人看。最近我试了一个叫 DeepSeek-R1-Distill-Qwen-1.5B 的模型,中文写作能力真的让我眼前一亮——它不仅能帮你生成流畅自然的文章,还能模仿你的风格,甚至自动优化标题和结构。 但问题来了:网上都说要本地部署,可我的电脑显卡一般,装个大模型动不动就要几十GB显存,搞不好还得折腾一整天,最后发现跑不动?更别说训练、调参这些专业操作了。有没有一种方式,能让我零风险、低成本、快速上手,先看看这个模型到底值不值得用? 答案是:有!现在通过ZEEKLOG星图平台提供的预置镜像,你可以花1块钱起步,5分钟内就启动一个可用的AI写作助手,不需要任何本地硬件投入,也不用担心环境配置失败。这个镜像是专门为像你我这样的内容创作者设计的——开箱即用、中文优化、支持对外服务调用,连API都给你配好了。 这篇文章就是为你写的。我会带你一步步从零开始,用最简单的方式跑

【低代码+AI编程】GitHub Copilot各个模型区别,实现高效编程

【低代码+AI编程】GitHub Copilot各个模型区别,实现高效编程

Copilot AI模型对比说明 模型分类 🏆 高级模型 (需额外付费) 模型名称相对成本特点说明Claude Haiku 4.50.33x性价比最高,速度快,成本低Claude Sonnet 3.51.0x平衡性能与成本的主力模型Claude Sonnet 41.0x升级版本,能力更强Claude Sonnet 4.51.0x最新版本,综合表现优秀GPT-51.0x最强大旗舰,复杂推理能力顶尖Gemini 2.5 Pro1.0x超长上下文,适合处理大量文本 📊 标准模型 (包含在基础套餐内) 模型名称成本特点说明GPT-4.1免费GPT-4优化版本GPT-4o免费多模态专家,视觉语音交互强GPT-5 mini免费GPT-5轻量版,速度快Grok Code Fast 1免费编程专用,代码生成优化 选择指南 根据需求推荐: 🚀 日常使用 * 推荐:GPT-4o 或 GPT-5