做网站网站关键词是什么/以下哪个单词表示搜索引擎优化

做网站网站关键词是什么,以下哪个单词表示搜索引擎优化,邢台网站制作那家便宜,苏州前程无忧官上做网站准备源文件 下载源文件 git clone https://github.com/ChihChengYang/wfs.js.git编译后得到wfs.js这个文件 调用 在demo/index.html中,前端对wfs.js进行了调用 var video1 document.getElementById("video1"), wfs new Wfs(); wfs.attachMedia…

准备源文件

下载源文件

git clone https://github.com/ChihChengYang/wfs.js.git

编译后得到wfs.js这个文件

调用

在demo/index.html中,前端对wfs.js进行了调用

var video1 = document.getElementById("video1"),
wfs = new Wfs();    
wfs.attachMedia(video1,'ch1');

对应wfs.js中的function Wfs() 函数

key: 'attachMedia',value: function attachMedia(media) {//arg1 通道var channelName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'chX';//arg2 媒体格式var mediaType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'H264Raw';//arg3 未定义var websocketName = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'play2';// 'H264Raw' 'FMp4'    this.mediaType = mediaType;this.media = media;//MEDIA_ATTACHING 事件处理this.trigger(_events2.default.MEDIA_ATTACHING, { media: media, channelName: channelName, mediaType: mediaType, websocketName: websocketName });

MEDIA_ATTACHING 事件的处理

MEDIA_ATTACHING: 'wfsMediaAttaching',

在var BufferController = function (_EventHandler)中

    key: 'onMediaAttaching',value: function onMediaAttaching(data) {var media = this.media = data.media;this.mediaType = data.mediaType;this.websocketName = data.websocketName;this.channelName = data.channelName;if (media) {// setup the media sourcevar ms = this.mediaSource = new MediaSource();//Media Source listeners//绑定ms的监听事件//打开时候onMediaSourceOpenthis.onmso = this.onMediaSourceOpen.bind(this);this.onmse = this.onMediaSourceEnded.bind(this);this.onmsc = this.onMediaSourceClose.bind(this);ms.addEventListener('sourceopen', this.onmso);ms.addEventListener('sourceended', this.onmse);ms.addEventListener('sourceclose', this.onmsc);// link video and media Source//连接video和刚刚创建的ms media Sourcemedia.src = URL.createObjectURL(ms);}}

ms的onMediaSourceOpen

在ms被打开的时候。调用 onMediaSourceOpen

key: 'onMediaSourceOpen',value: function onMediaSourceOpen() {var mediaSource = this.mediaSource;if (mediaSource) {// once received, don't listen anymore to sourceopen eventmediaSource.removeEventListener('sourceopen', this.onmso);}if (this.mediaType === 'FMp4') {this.checkPendingTracks();}//调用MEDIA_ATTACHED事件处理this.wfs.trigger(_events2.default.MEDIA_ATTACHED, { media: this.media, channelName: this.channelName, mediaType: this.mediaType, websocketName: this.websocketName });

MEDIA_ATTACHED事件处理

MEDIA_ATTACHED: 'wfsMediaAttached',
    key: 'onMediaAttached',value: function onMediaAttached(data) {if (data.websocketName != undefined) {//创建WebSocket连接var client = new WebSocket('ws://' + window.location.host + '/' + data.websocketName);//调用attachWebsocket方法this.wfs.attachWebsocket(client, data.channelName);} else {console.log('websocketName ERROE!!!');}}
    key: 'attachWebsocket',value: function attachWebsocket(websocket, channelName) {//调用WEBSOCKET_ATTACHING事件处理this.trigger(_events2.default.WEBSOCKET_ATTACHING, { websocket: websocket, mediaType: this.mediaType, channelName: channelName });}

WEBSOCKET_ATTACHING事件处理

WEBSOCKET_ATTACHING: 'wfsWebsocketAttaching',
    key: 'onWebsocketAttaching',value: function onWebsocketAttaching(data) {this.mediaType = data.mediaType;this.channelName = data.channelName;if (data.websocket instanceof WebSocket) {this.client = data.websocket;//websocket 的 onopen事件绑定绑定initSocketClientthis.client.onopen = this.initSocketClient.bind(this);this.client.onclose = function (e) {console.log('Websocket Disconnected!');};}}
    key: 'initSocketClient',value: function initSocketClient(client) {this.client.binaryType = 'arraybuffer';//websocket 的 onmessage 事件绑定绑定receiveSocketMessagethis.client.onmessage = this.receiveSocketMessage.bind(this);//WEBSOCKET_MESSAGE_SENDING事件处理this.wfs.trigger(_events2.default.WEBSOCKET_MESSAGE_SENDING, { commandType: "open", channelName: this.channelName, commandValue: "NA" });console.log('Websocket Open!');}

//WEBSOCKET_MESSAGE_SENDING事件处理

WEBSOCKET_MESSAGE_SENDING: 'wfsWebsocketMessageSending'
    key: 'onWebsocketMessageSending',value: function onWebsocketMessageSending(event) {this.client.send(JSON.stringify({ t: event.commandType, c: event.channelName, v: event.commandValue }));}

这样把信息通过json发送出去。

接收信息的处理

上面websocket 的 onmessage 事件绑定绑定receiveSocketMessage, 当websocket接收到信息时,调用receiveSocketMessage

    key: 'receiveSocketMessage',value: function receiveSocketMessage(event) {if (document['hidden']) return;this.buf = new Uint8Array(event.data);var copy = new Uint8Array(this.buf);if (this.mediaType === 'FMp4') {this.wfs.trigger(_events2.default.WEBSOCKET_ATTACHED, { payload: copy });}if (this.mediaType === 'H264Raw') {//H264_DATA_PARSING事件处理this.wfs.trigger(_events2.default.H264_DATA_PARSING, { data: copy });}}

H264_DATA_PARSING事件处理

H264_DATA_PARSING: 'wfsH264DataParsing',
        key: 'onH264DataParsing',value: function onH264DataParsing(event) {//读取数据this._read(event.data);var $this = this;//对于每个nalthis.nals.forEach(function (nal) {//H264_DATA_PARSED事件处理$this.wfs.trigger(_events2.default.H264_DATA_PARSED, {data: nal});});}

H264_DATA_PARSED事件处理

H264_DATA_PARSED: 'wfsH264DataParsed',
    key: 'onH264DataParsed',value: function onH264DataParsed(event) {//分析AVCTrackthis._parseAVCTrack(event.data);if (this.browserType === 1 || this._avcTrack.samples.length >= 20) {// Firefoxthis.remuxer.pushVideo(0, this.sn, this._avcTrack, this.timeOffset, this.contiguous);this.sn += 1;}}

数据经过_parseAVCTrack处理后,调用remuxer.pushVideo方法

    key: 'pushVideo',value: function pushVideo(level, sn, videoTrack, timeOffset, contiguous) {this.level = level;this.sn = sn;var videoData = void 0;// generate Init Segment if neededif (!this.ISGenerated) {this.generateVideoIS(videoTrack, timeOffset);}if (this.ISGenerated) {if (videoTrack.samples.length) {this.remuxVideo_2(videoTrack, timeOffset, contiguous);}}}

最后调用remuxVideo_2方法

    key: 'remuxVideo_2',value: function remuxVideo_2(track, timeOffset, contiguous, audioTrackLength) {var offset = 8,pesTimeScale = this.PES_TIMESCALE,pes2mp4ScaleFactor = this.PES2MP4SCALEFACTOR,mp4SampleDuration,mdat,moof,firstPTS,firstDTS,nextDTS,inputSamples = track.samples,outputSamples = [];/* concatenate the video data and construct the mdat in place(need 8 more bytes to fill length and mpdat type) */mdat = new Uint8Array(track.len + 4 * track.nbNalu + 8);var view = new DataView(mdat.buffer);view.setUint32(0, mdat.byteLength);mdat.set(_mp4Generator2.default.types.mdat, 4);var sampleDuration = 0;var ptsnorm = void 0,dtsnorm = void 0,mp4Sample = void 0,lastDTS = void 0;for (var i = 0; i < inputSamples.length; i++) {var avcSample = inputSamples[i],mp4SampleLength = 0,compositionTimeOffset = void 0;// convert NALU bitstream to MP4 format (prepend NALU with size field)while (avcSample.units.units.length) {var unit = avcSample.units.units.shift();view.setUint32(offset, unit.data.byteLength);offset += 4;mdat.set(unit.data, offset);offset += unit.data.byteLength;mp4SampleLength += 4 + unit.data.byteLength;}var pts = avcSample.pts - this._initPTS;var dts = avcSample.dts - this._initDTS;dts = Math.min(pts, dts);if (lastDTS !== undefined) {ptsnorm = this._PTSNormalize(pts, lastDTS);dtsnorm = this._PTSNormalize(dts, lastDTS);sampleDuration = dtsnorm - lastDTS;if (sampleDuration <= 0) {_logger.logger.log('invalid sample duration at PTS/DTS: ' + avcSample.pts + '/' + avcSample.dts + '|dts norm: ' + dtsnorm + '|lastDTS: ' + lastDTS + ':' + sampleDuration);sampleDuration = 1;}} else {var nextAvcDts = this.nextAvcDts,delta;ptsnorm = this._PTSNormalize(pts, nextAvcDts);dtsnorm = this._PTSNormalize(dts, nextAvcDts);if (nextAvcDts) {delta = Math.round(dtsnorm - nextAvcDts);if ( /*contiguous ||*/Math.abs(delta) < 600) {if (delta) {if (delta > 1) {_logger.logger.log('AVC:' + delta + ' ms hole between fragments detected,filling it');} else if (delta < -1) {_logger.logger.log('AVC:' + -delta + ' ms overlapping between fragments detected');}dtsnorm = nextAvcDts;ptsnorm = Math.max(ptsnorm - delta, dtsnorm);_logger.logger.log('Video/PTS/DTS adjusted: ' + ptsnorm + '/' + dtsnorm + ',delta:' + delta);}}}this.firstPTS = Math.max(0, ptsnorm);this.firstDTS = Math.max(0, dtsnorm);sampleDuration = 0.03;}outputSamples.push({size: mp4SampleLength,duration: this.H264_TIMEBASE,cts: 0,flags: {isLeading: 0,isDependedOn: 0,hasRedundancy: 0,degradPrio: 0,dependsOn: avcSample.key ? 2 : 1,isNonSync: avcSample.key ? 0 : 1}});lastDTS = dtsnorm;}var lastSampleDuration = 0;if (outputSamples.length >= 2) {lastSampleDuration = outputSamples[outputSamples.length - 2].duration;outputSamples[0].duration = lastSampleDuration;}this.nextAvcDts = dtsnorm + lastSampleDuration;var dropped = track.dropped;track.len = 0;track.nbNalu = 0;track.dropped = 0;if (outputSamples.length && navigator.userAgent.toLowerCase().indexOf('chrome') > -1) {var flags = outputSamples[0].flags;flags.dependsOn = 2;flags.isNonSync = 0;}track.samples = outputSamples;moof = _mp4Generator2.default.moof(track.sequenceNumber++, dtsnorm, track);track.samples = [];var data = {id: this.id,level: this.level,sn: this.sn,data1: moof,data2: mdat,startPTS: ptsnorm,endPTS: ptsnorm,startDTS: dtsnorm,endDTS: dtsnorm,type: 'video',nb: outputSamples.length,dropped: dropped};this.observer.trigger(_events2.default.FRAG_PARSING_DATA, data);return data;}

在处理完数据后,进行FRAG_PARSING_DATA事件处理

  FRAG_PARSING_DATA: 'wfsFragParsingData',
    key: 'onFragParsingData',value: function onFragParsingData(data) {var _this2 = this;if (data.type === 'video') {}[data.data1, data.data2].forEach(function (buffer) {if (buffer) {_this2.pendingAppending++;_this2.wfs.trigger(_events2.default.BUFFER_APPENDING, { type: data.type, data: buffer, parent: 'main' });}});}

BUFFER_APPENDING事件处理

BUFFER_APPENDING: 'wfsBufferAppending',
    key: 'onBufferAppending',value: function onBufferAppending(data) {if (!this.segments) {this.segments = [data];} else {this.segments.push(data);}this.doAppending();}
    key: 'doAppending',value: function doAppending() {var wfs = this.wfs,sourceBuffer = this.sourceBuffer,segments = this.segments;if (Object.keys(sourceBuffer).length) {if (this.media.error) {this.segments = [];console.log('trying to append although a media error occured, flush segment and abort');return;}if (this.appending) {return;}if (segments && segments.length) {var segment = segments.shift();try {if (sourceBuffer[segment.type]) {this.parent = segment.parent;sourceBuffer[segment.type].appendBuffer(segment.data);this.appendError = 0;this.appended++;this.appending = true;} else {}} catch (err) {// in case any error occured while appending, put back segment in segments table segments.unshift(segment);var event = { type: ErrorTypes.MEDIA_ERROR };if (err.code !== 22) {if (this.appendError) {this.appendError++;} else {this.appendError = 1;}event.details = ErrorDetails.BUFFER_APPEND_ERROR;event.frag = this.fragCurrent;if (this.appendError > wfs.config.appendErrorMaxRetry) {segments = [];event.fatal = true;return;} else {event.fatal = false;}} else {this.segments = [];event.details = ErrorDetails.BUFFER_FULL_ERROR;return;}}}}}

通过sourceBuffer[segment.type].appendBuffer(segment.data);把数据发送到video去。

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

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

相关文章

【STM32】知识点介绍一:硬件知识

文章目录 一、电源引脚简介二、电平信号三、电路分析 一、电源引脚简介 VCC、GND、VDD和VSS是电子电路中常见的术语&#xff0c;代表着不同的电源引脚或电压。 VCC&#xff08;Voltage at the Common Collector&#xff09;&#xff1a;VCC是指集电极&#xff08;Collector&am…

什么是 SEO(搜索引擎优化)?

您有网站吗&#xff0c;或者您正在考虑创建一个网站&#xff1f;您想吸引更多人加入您的业务吗&#xff1f;如果答案是肯定的&#xff0c;那么毫无疑问&#xff1a;SEO 应该是您营销工作的一部分。这是建立品牌和吸引用户访问您的网站的好方法。但它实际上意味着什么呢&#xf…

鸿蒙HarmonyOS NEXT设备升级应用数据迁移流程

数据迁移是什么 什么是数据迁移&#xff0c;对用户来讲就是本地数据的迁移&#xff0c;终端设备从HarmonyOS 3.1 Release API 9及之前版本&#xff08;单框架&#xff09;迁移到HarmonyOS NEXT&#xff08;双框架&#xff09;后保证本地数据不丢失。例如&#xff0c;我在某APP…

【现代深度学习技术】现代卷积神经网络04:含并行连接的网络(GoogLeNet)

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上&#xff0c;结合当代大数据和大算力的发展而发展出来的。深度学习最重…

【ESP32】ESP32与MQTT通信:实现传感器数据监测与设备控制

ESP32与MQTT通信 1 项目概览2 硬件组成3 MQTT协议解析MQTT协议简介MQTT核心概念本项目中的MQTT应用 4 MQTT Broker选择EMQX Broker其他常用MQTT Broker 5 代码解析初始化与配置MQTT消息处理发布传感器数据 6 MQTT话题TOPIC设计7 EMQX的优势在IoT项目中的体现8 MQTT通信流程9 应…

每天一篇目标检测文献(六)——Part One

今天看的是《Object Detection with Deep Learning: A Review》 目录 一、摘要 1.1 原文 1.2 翻译 二、介绍 2.1 信息区域选择 2.2 特征提取 2.3 分类 三、深度学习的简要回顾 3.1 历史、诞生、衰落和繁荣 3.2 CNN架构和优势 一、摘要 1.1 原文 Due to object dete…

Arthas线上问题诊断器

Arthas是Alibaba开源的java诊断工具 解决问题 这个类从哪个jar 包加载的&#xff1f;为什么会报各种相关的Exception&#xff1f; 遇到问题无法在线上debug&#xff0c;不能直通过加载日志再重新发布 有什么办法可以监控到JVM的实时运行状态&#xff1f; …

[Lc5_dfs+floodfill] 简介 | 图像渲染 | 岛屿数量

目录 0.floodfill算法简介 1.图像渲染 题解 2.岛屿数量 题解 之前我们在 bfs 中有介绍过[Lc15_bfsfloodfill] 图像渲染 | 岛屿数量 | 岛屿的最大面积 | 被围绕的区域&#xff0c;现在我们来看看 dfs 又是如何解决的呢 0.floodfill算法简介 floodfill算法又叫洪水灌溉或者…

JVM类加载器详解

文章目录 1.类与类加载器2.类加载器加载规则3.JVM 中内置的三个重要类加载器为什么 获取到 ClassLoader 为null就是 BootstrapClassLoader 加载的呢&#xff1f; 4.自定义类加载器什么时候需要自定义类加载器代码示例 5.双亲委派模式类与类加载器双亲委派模型双亲委派模型的执行…

【SPP】RFCOMM 层在SPP中互操作性要求深度解析

蓝牙串口协议&#xff08;SPP&#xff09;通过 RFCOMM 协议实现 RS232 串口仿真&#xff0c;其互操作性是设备互联的关键。本文基于蓝牙核心规范&#xff0c;深度解析 RFCOMM 层的能力矩阵、信号处理、流控机制及实战开发&#xff0c;结合状态机、流程图和代码示例&#xff0c;…

Gossip协议:分布式系统中的“八卦”传播艺术

目录 一、 什么是Gossip协议&#xff1f;二、 Gossip协议的应用 &#x1f4a1;三、 Gossip协议消息传播模式详解 &#x1f4da;四、 Gossip协议的优缺点五、 总结&#xff1a; &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博主的讲解方式&…

【C++初阶】----模板初阶

1.泛型函数 泛型编程&#xff1a;编写与类型无关的通用代码&#xff0c;是代码复用的一种手段。模板是泛型编程的基础。 2.函数模板 2.1函数模板的概念 函数模板代表了一个函数家族&#xff0c;该函数模板与类型无关&#xff0c;在使用时被参数化&#xff0c;根据实参类型…

git-- github的使用--账户和本地连接

以下指令在git 执行bash 流程&#xff1a;先看有没有密钥&#xff1b; 没有的话&#xff0c;在电脑生成密钥对&#xff0c;公钥复制到github&#xff1b; 要想使用https&#xff0c;配置令牌&#xff0c;注意令牌有期限问题&#xff0c;连接不了有可能是期限问题 一个电脑对…

Angular由一个bug说起之十五:自定义基于Overlay的Tooltip

背景 工具提示&#xff08;tooltip&#xff09;是一个常见的 UI 组件&#xff0c;用于在用户与页面元素交互时提供额外的信息。由于angular/material/tooltip的matTooltip只能显示纯文本&#xff0c;所以我们可以通过自定义Directive来实现一个灵活且功能丰富的tooltip Overlay…

搭建QNX Software Center的Docker环境

背景 本人使用 Ubuntu Server 22.04 服务器&#xff0c;所以没有图形界面&#xff0c;而 QNX Software Center 需要图形界面。为了保证服务器环境的整理&#xff0c;计划使用Docker部署QNX Software Center 一瓶安装图形界面。本方既是实现方案的记录。 资源 Dockerfile&…

C#/.NET/.NET Core技术前沿周刊 | 第 31 期(2025年3.17-3.23)

前言 C#/.NET/.NET Core技术前沿周刊&#xff0c;你的每周技术指南针&#xff01;记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿&#xff0c;助力技术成长与视野拓宽。 欢迎投稿、推荐…

【STM32】WDG看门狗(学习笔记)

学习来源----->江协科技STM32 WDG简介 WDG&#xff08;Watchdog&#xff09;看门狗看门狗可以监控程序的运行状态&#xff0c;当程序因为设计漏洞、硬件故障、电磁干扰等原因&#xff0c;出现卡死或跑飞现象时&#xff0c;看门狗能及时复位程序&#xff0c;避免程序陷入长…

2023第十四届蓝桥杯大赛软件赛国赛C/C++ 大学 B 组(真题题解)(C++/Java题解)

本来想刷省赛题呢&#xff0c;结果一不小心刷成国赛了 真是个小迷糊〒▽〒 但&#xff0c;又如何( •̀ ω •́ )✧ 记录刷题的过程、感悟、题解。 希望能帮到&#xff0c;那些与我一同前行的&#xff0c;来自远方的朋友&#x1f609; 大纲&#xff1a; 一、子2023-&#xff…

CSS学习笔记6——网页布局

目录 一、元素的浮动属性、清除浮动 清除浮动的其他方法 1、使用空标签清除浮动影响 2、使用overflow属性清除浮动 3、使用伪元素清除浮动影响 原理 overflow属性 二、元素的定位 1、相对定位 2、绝对定位 ​编辑 3、固定定位 z-index层叠等级属性 一、元素的浮动…

Linux之数据链路层

Linux之数据链路层 一.以太网1.1以太网帧格式1.2MAC地址1.3MTU 二.ARP协议2.1ARP协议工作流程2.2ARP协议格式 三.NAT技术四.代理服务4.1正向代理4.2反向代理 五.四大层的学习总结 一.以太网 在我们学习完了网络层后我们接下来就要进入数据链路层的学习了&#xff0c;在学习完网…