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

在昇腾NPU上跑Llama 2模型:一次完整的性能测试与实战通关指南

在昇腾NPU上跑Llama 2模型:一次完整的性能测试与实战通关指南

目录 * 在昇腾NPU上跑Llama 2模型:一次完整的性能测试与实战通关指南 * 引言:从“为什么选择昇腾”开始 * 第一幕:环境搭建——好的开始是成功的一半 * 1.1 GitCode Notebook 创建“避坑指南” * 1.2 环境验证:“Hello, NPU!” * 第二幕:模型部署——从下载到运行的“荆棘之路” * 2.1 安装依赖与模型下载 * 2.2 核心部署代码与“坑”的化解 * 第三幕:性能测试——揭开昇腾NPU的真实面纱 * 3.1 严谨的性能测试脚本 * 3.2 测试结果与分析 * 第四幕:性能优化——让Llama跑得更快 * 4.1 使用昇腾原生大模型框架 * 4.

Llama-3.2-3B步骤详解:Ollama部署后启用GPU加速(CUDA/cuDNN)全流程

Llama-3.2-3B步骤详解:Ollama部署后启用GPU加速(CUDA/cuDNN)全流程 1. 为什么需要GPU加速?——从“能跑”到“跑得快”的关键跃迁 你可能已经用Ollama成功拉起了Llama-3.2-3B,输入几句话就能看到回复,一切看似顺利。但当你连续提问、生成稍长文本,或者尝试多轮对话时,会明显感觉到响应变慢——几秒甚至十几秒的等待,让原本流畅的交互体验打了折扣。 这不是模型能力的问题,而是默认情况下Ollama在CPU上运行。Llama-3.2-3B虽是3B参数量的轻量级模型,但其Transformer结构天然适合并行计算。一块中端消费级显卡(比如RTX 3060或更高),在GPU模式下推理速度可比CPU快3~5倍,显存占用更合理,还能释放出CPU资源去做其他事。 更重要的是,Ollama官方明确支持CUDA加速,且无需手动编译模型或修改源码。整个过程不涉及复杂配置文件编辑,也不要求你成为CUDA专家——只要你的机器有NVIDIA显卡、驱动正常、CUDA环境基础就绪,就能完成切换。本文将带你从零开始,一步步验证环境、启用加速、实测对比,并解决你最可能卡

LLaMA Factory 从入门到精通,一篇讲完

LLaMA Factory 从入门到精通,一篇讲完

目录 一、LLaMA-Factory 简介 二、安装部署 三、数据微调 1、数据集的建立 2、数据集格式 3、模型参数 4、开始运行 5、导出模型 四、webui 评估预测与对话 导出 五、SFT 训练 命令行 六、LoRA 合并 合并 量化 七、推理 原始模型推理配置 微调模型推理配置 多模态模型 批量推理 八、评估 通用能力评估 NLG 评估 评估相关参数 一、LLaMA-Factory 简介 LLaMA Factory 是一个简单易用且高效的大型语言模型(Large

万字长文:重点区域低空安全防御系统(反无人机)深度实战方案 | 从0到1构建立体安防体系(WORD)

万字长文:重点区域低空安全防御系统(反无人机)深度实战方案 | 从0到1构建立体安防体系(WORD)

摘要:随着低空经济爆发式增长,无人机"黑飞"已成为国家重点区域安防的重大威胁。本文基于真实政务项目案例,深度解析一套覆盖"探测-识别-定位-反制-溯源"全链条的低空安全防御系统建设方案。全文8000+字,涵盖TDOA无源定位、相控阵雷达、导航诱骗等核心技术,以及等保2.0合规、电磁频谱安全等实施细节,为安防系统集成商、智慧城市建设者提供保姆级技术参考。 一、项目背景与战略价值:低空经济背后的安全缺口 1.1 低空经济崛起的"双刃剑"效应 近年来,随着《"十四五"数字经济发展规划》的深入推进,低空经济已被纳入国家战略性新兴产业序列。无人机在物流配送、电力巡检、应急救援、城市测绘等领域的应用呈现爆发式增长。据统计,截至2025年初,我国民用无人机保有量已突破500万架,年飞行时长超过数千万小时。 然而,