【从零开始用Go写浏览器】:手把手教你打造属于自己的Web渲染引擎

第一章:从零开始用Go构建浏览器的核心理念

构建一个浏览器内核看似遥不可及,但在现代编程语言如Go的加持下,这一目标变得更具可行性。Go语言以其高效的并发模型、简洁的语法和强大的标准库,为系统级开发提供了坚实基础。通过合理抽象与模块化设计,我们可以逐步实现解析HTML、布局渲染、JavaScript执行等核心功能。

选择Go的理由

  • 内置并发支持,便于处理多任务如网络请求与脚本执行
  • 静态编译生成单一二进制文件,便于部署与分发
  • 丰富的标准库,尤其是net/http和html包,极大简化网络与解析逻辑

核心组件的初步划分

组件职责
Parser将HTML源码转换为DOM树
Renderer计算元素位置并绘制到画布
JS Engine执行JavaScript代码(可集成otto等解释器)

快速启动一个网页加载流程

以下是一个简化的HTTP请求与HTML解析示例:
// 发起HTTP请求并解析HTML
package main

import (
    "fmt"
    "net/http"
    "golang.org/x/net/html"
)

func parseHTML(url string) {
    resp, _ := http.Get(url)
    defer resp.Body.Close()
    
    doc := html.Parse(resp.Body) // 构建DOM树根节点
    fmt.Println("Document parsed with root type:", doc.Type)
}

func main() {
    parseHTML("https://example.com")
}
该代码展示了如何获取网页内容并生成初始DOM结构,是构建浏览器解析层的第一步。后续可通过递归遍历DOM节点实现样式匹配与布局计算。
graph TD A[用户输入URL] --> B{发起HTTP请求} B --> C[接收HTML响应] C --> D[解析为DOM树] D --> E[构建渲染树] E --> F[布局与绘制]

第二章:Web渲染引擎的基础架构设计

2.1 HTTP协议解析与资源加载机制

HTTP作为Web通信的核心协议,负责客户端与服务器之间的资源请求与响应。浏览器在接收到HTML文档后,会解析其中的标签并触发对CSS、JavaScript、图片等子资源的HTTP请求。
请求-响应模型
一次完整的资源加载始于HTTP请求,典型请求头如下:

GET /style.css HTTP/1.1
Host: example.com
Accept: text/css
User-Agent: Mozilla/5.0
服务器返回状态码、响应头及资源内容。例如:

HTTP/1.1 200 OK
Content-Type: text/css
Content-Length: 1024

body { color: #333; }
该过程遵循“先请求,后渲染”的原则,响应头中的Content-Type决定浏览器如何解析资源。
关键资源加载顺序
浏览器按以下优先级处理资源:
  • HTML文档解析启动
  • CSS样式表阻塞渲染,但不阻塞页面解析
  • JavaScript脚本默认阻塞解析,除非标记为async或defer
  • 图片等媒体资源异步加载,不影响主渲染流程

2.2 HTML词法与语法分析器的实现

HTML解析器的核心在于将原始标记文本转换为结构化的文档对象模型(DOM)。该过程分为词法分析与语法分析两个阶段。
词法分析:标记化处理
词法分析器逐字符读取输入,识别出标签、属性、文本等记号。例如,将 `
` 拆解为开始标签 `div` 和属性 `class="main"`。
// 简化的词法单元结构
type Token struct {
    Type  string // 如 "StartTag", "Text"
    Value string
    Attrs map[string]string
}
上述结构用于封装解析出的标记信息,Attrs 存储键值对形式的属性。
语法分析:构建树形结构
语法分析器依据HTML语法规则,将标记流构造成嵌套的节点树。它需处理标签闭合、父子关系推断等逻辑。
  • 遇到开始标签时创建新节点并入栈
  • 结束标签时从栈中弹出对应节点
  • 文本内容作为子节点挂载到当前栈顶元素

2.3 构建DOM树:从标记化到节点生成

浏览器解析HTML文档时,首先将字节流转换为字符,再通过词法分析进行标记化(Tokenization),识别出开始标签、结束标签、属性和文本等内容。
标记生成示例
<div class="container">
  <p>Hello World</p>
</div>
上述HTML会被分解为:
  • 开始标签 token: <div>,属性 class="container"
  • 开始标签 token: <p>
  • 文本 token: "Hello World"
  • 结束标签 token: </p>
  • 结束标签 token: </div>
节点生成与树构建
每个开始标签触发对应DOM节点的创建,并根据父子关系插入树中。文本内容成为文本节点,嵌套结构自然形成层级。
DOM树结构示意: div.container └── p └── 文本节点 "Hello World"

2.4 CSS选择器解析与样式规则匹配

CSS选择器是浏览器匹配DOM元素并应用样式的依据。解析过程从右到左进行,以提升匹配效率。
常见选择器类型
  • 元素选择器:如 p 匹配所有段落
  • 类选择器:如 .highlight 匹配 class 属性包含 highlight 的元素
  • ID选择器:如 #header 匹配唯一ID元素
  • 属性选择器:如 [type="text"] 匹配特定属性值的元素
选择器优先级计算
选择器类型权重
内联样式1000
ID选择器100
类/属性/伪类10
元素/伪元素1
实际匹配示例
/* 选择类名为 'nav' 下的所有超链接 */
.nav a {
  color: blue;
  text-decoration: none;
}
该规则表示:先找到所有 class="nav" 的元素,再查找其后代中的 <a> 元素,并应用蓝色文字和无下划线样式。浏览器采用“关键选择器”(最右边的 a)反向追溯父级,提高匹配性能。

2.5 渲染树的构造与布局初步设计

在浏览器渲染流程中,渲染树(Render Tree)的构建是连接 DOM 与 CSSOM 的关键步骤。它仅包含需要显示的节点,如可见元素,而忽略 <script>、<meta> 等不可见节点。
渲染树构建过程
浏览器遍历 DOM 树,结合 CSSOM 计算每个可见节点的最终样式,生成渲染树节点。例如:

.container {
  display: block;
  color: #333;
}
.hidden {
  display: none;
}
上述样式中,.hidden 元素不会进入渲染树,因其 display: none 不参与布局。
布局阶段的初步设计
渲染树构建完成后,进入布局(Layout)阶段,也称重排(Reflow)。此时为每个元素计算几何位置,形成盒模型布局。
阶段输入输出
DOM 解析HTMLDOM 树
CSSOM 构建CSS样式规则
渲染树构建DOM + CSSOMRender Tree

第三章:Go语言中的图形绘制与界面呈现

3.1 使用Go图形库进行Canvas渲染

在Go语言中,通过第三方图形库如`gg`(基于Cairo)可实现高效的Canvas渲染。开发者能够以编程方式绘制矢量图形、文本和图像。
基础绘图流程
首先初始化画布并设置尺寸:

package main

import "github.com/fogleman/gg"

func main() {
    const width, height = 500, 500
    ctx := gg.NewContext(width, height) // 创建指定宽高的画布
    ctx.SetRGB(1, 1, 1)                 // 设置白色背景
    ctx.Clear()
}
上述代码创建了一个500×500像素的画布,并填充白色背景。`gg.NewContext`返回一个绘图上下文,后续所有操作均在此上下文中执行。
绘制几何图形
支持绘制线条、矩形、圆形等基本形状:
  • ctx.DrawLine(x1, y1, x2, y2):绘制直线
  • ctx.DrawRectangle(x, y, w, h):绘制矩形
  • ctx.DrawCircle(cx, cy, r):绘制圆
调用ctx.Stroke()描边或ctx.Fill()填充图形。

3.2 布局引擎基础:盒模型与几何计算

在现代前端渲染体系中,布局引擎的核心任务之一是解析元素的几何尺寸与位置。这一过程依赖于CSS盒模型,每个元素被视为包含内容(content)、内边距(padding)、边框(border)和外边距(margin)的矩形盒子。
盒模型结构分解
标准盒模型的总宽度计算公式为: width + padding-left + padding-right + border-left + border-right + margin-left + margin-right
  • content-box:宽高仅包含内容区域(默认值)
  • border-box:宽高包含边框与内边距,更利于响应式设计
几何计算示例
.box {
  box-sizing: border-box;
  width: 200px;
  padding: 20px;
  border: 10px solid #000;
  margin: 10px;
}
上述元素的渲染宽度为200px(由box-sizing: border-box决定),内容区实际宽度为200 - 2×(20 + 10) = 140px。布局引擎在重排(reflow)阶段会递归计算每个节点的几何信息,构建最终的视觉坐标系。

3.3 文本绘制与字体处理实战

基础文本绘制
在Canvas中,使用fillText()方法可实现文本绘制。以下示例展示如何在指定坐标绘制字符串:

const canvas = document.getElementById('textCanvas');
const ctx = canvas.getContext('2d');
ctx.font = '24px Arial';
ctx.fillStyle = '#000';
ctx.fillText('Hello Web', 50, 100);
其中,font属性设置字体大小与类型,fillStyle定义颜色,fillText(text, x, y)在(x,y)位置绘制实心文本。
字体加载与高级控制
现代浏览器支持FontFace API动态加载自定义字体:
  • 创建FontFace实例并添加到页面
  • 等待字体加载完成后再进行渲染
  • 避免因字体未就绪导致的渲染异常

第四章:交互功能与脚本支持进阶开发

4.1 JavaScript引擎集成(Goja)实践

在Go应用中嵌入JavaScript逻辑,Goja提供了一个轻量且高性能的ECMAScript 5.1兼容引擎。其核心优势在于无缝的Go与JS数据互通。
基础集成示例

vm := goja.New()
result, err := vm.RunString(`"Hello " + "Goja!"`)
if err != nil {
    log.Fatal(err)
}
fmt.Println(result.String()) // 输出: Hello Goja!
该代码创建一个Goja虚拟机实例,并执行简单字符串拼接。`RunString`直接解析并运行JS代码,返回值为`goja.Value`类型,可通过`String()`方法转换为Go字符串。
数据交互机制
Goja支持双向数据传递。通过`Set`方法可将Go变量注入JS上下文:
  • 基本类型自动转换(int → number)
  • 结构体可暴露为JS对象
  • 函数可封装为JS可调用对象

4.2 事件循环与用户交互响应机制

浏览器的事件循环是驱动用户交互响应的核心机制。JavaScript 作为单线程语言,依赖事件循环协调任务执行顺序,确保界面流畅响应用户操作。
事件循环基本流程
事件循环持续从任务队列中取出宏任务(如 setTimeout、DOM 事件)并执行,每轮循环结束后处理微任务队列(如 Promise 回调),优先级更高。

setTimeout(() => {
  console.log('宏任务');
}, 0);

Promise.resolve().then(() => {
  console.log('微任务');
});

console.log('同步代码');
// 输出顺序:同步代码 → 微任务 → 宏任务
上述代码展示了任务执行优先级:同步代码最先执行,随后是微任务,最后是宏任务。这种机制保障了异步回调的有序性和响应性。
与用户交互的关联
用户点击、输入等行为触发 DOM 事件,被加入宏任务队列。事件循环在适当时机执行这些任务,调用对应监听器,实现交互响应。

4.3 页面跳转与历史栈管理

在单页应用(SPA)中,页面跳转依赖于前端路由系统对浏览器历史栈的操作。通过 pushState 和 replaceState 方法,可实现URL变更而不触发整页刷新。
常见的跳转方式对比
  • push():向历史栈压入新记录,用户可后退到前一页面
  • replace():替换当前历史记录,禁止返回上一页
  • go(n):在历史栈中前进或后退n步
编程式导航示例
router.push({
  path: '/user',
  query: { id: '123' }
}); // 添加一条新记录
上述代码将路由推入新状态,并保留返回能力。参数 path 指定目标路径,query 用于传递URL查询参数。
历史栈操作的副作用控制
不当的跳转可能导致用户陷入“历史黑洞”。建议在表单提交后使用 replace 防止重复提交。

4.4 简易开发者工具雏形实现

基础架构设计
为提升开发效率,构建一个轻量级开发者工具雏形,核心功能包括代码实时校验与接口调试。采用插件化架构,便于后续功能扩展。
核心功能实现
通过监听文件系统变化触发代码语法检查,结合内置的HTTP客户端实现API快速测试。以下为文件监听模块的实现示例:

// 监听指定目录下的文件变更
func watchDir(dirPath string) {
    watcher, _ := fsnotify.NewWatcher()
    watcher.Add(dirPath)
    go func() {
        for event := range watcher.Events {
            if event.Op&fsnotify.Write == fsnotify.Write {
                fmt.Println("文件已修改:", event.Name)
                validateCode(event.Name) // 触发校验
            }
        }
    }()
}
上述代码使用 fsnotify 库监控目录变化,当检测到文件写入操作时,调用 validateCode 执行静态分析,确保代码规范。
功能对照表
功能状态依赖组件
文件监听已完成fsnotify
语法校验开发中go/parser

第五章:总结与未来可扩展方向

微服务架构的弹性扩展实践
在高并发场景下,基于 Kubernetes 的自动伸缩机制能显著提升系统稳定性。通过配置 Horizontal Pod Autoscaler(HPA),可根据 CPU 使用率或自定义指标动态调整 Pod 副本数。
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: user-service-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: user-service
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70
边缘计算集成路径
将部分数据处理逻辑下沉至边缘节点,可降低中心集群负载并减少延迟。例如,在 IoT 场景中,使用 KubeEdge 将设备上报数据在本地完成预处理后,仅上传聚合结果。
  • 边缘节点运行轻量级 K8s 组件,实现与中心集群的统一调度
  • 通过 MQTT 协议接入传感器数据,部署 Node-RED 进行流式处理
  • 利用 CRD 定义边缘作业,由云端控制器分发配置
AI 驱动的异常检测扩展
结合 Prometheus 采集的时序数据,训练 LSTM 模型识别异常流量模式。以下为模型输入特征示例:
特征名称描述数据来源
request_rate每秒请求数Envoy access log
error_ratio5xx 响应占比Prometheus query
latency_p9999 分位延迟Jaeger trace aggregation
使用Gio构建跨平台GUI应用 Gio是一个用Go语言编写跨平台GUI应用的绝佳选择。它拥有高效的2D图形引擎、即时模式图形系统、少量依赖等优点。使用Gio可以轻松构建一个跨平台的GUI程序。希望本文能够帮助大家快速上手Gio,让跨平台应用开发变得更简单。要构建出色的产品,还需要不断实践与探索。🧡。 阅读详情

相关推荐

DashClaw:开发者本地监控仪表盘,打造高效数字驾驶舱

在软件开发和运维领域,监控与信息聚合是保障系统稳定性和提升工作效率的关键技术。其核心原理在于通过数据采集、处理和可视化,将分散的系统状态、日志、性能指标等信息集中呈现。这项技术的价值在于帮助开发者与运维工程师快速掌握全局状态,实现主动式问题发现与效率优化。典型的应用场景包括服务器资源监控、容器化环境管理、CI/CD状态跟踪以及个人工作流信息整合。本文聚焦的DashClaw项目,正是这一理念的工程实践典范。它采用可配置化与本地优先的设计哲学,通过YAML配置灵活定义小部件,将Docker容器监控、系统资源数据

weixin_42566072的博客 571

golong实现服务端浏览器截屏

笔者说:近期在使用golang进行开发工作时,受360技术公众号曾发布过文章的启发,想到是否可以使用golang操作无屏浏览器(headless bro...

360技术 1012

你的小程序技术博客还缺什么?试试用Towxml 3.0渲染Markdown,打造沉浸式阅读体验

本文介绍了如何使用Towxml 3.0在小程序中渲染Markdown,打造专业级的技术博客阅读体验。通过解析代码高亮、LaTeX公式支持和复杂表格渲染等核心功能,帮助开发者解决小程序原生渲染引擎的局限性,提升内容展示的专业性和用户体验。

weixin_29009339的博客 81

【从零开始用Go写浏览器】:手把手教你打造高性能Web渲染引擎(仅限前1000人领取源码)

wu

ProceNest的博客 750

Mythos安全模型:AI驱动的自动化漏洞挖掘与利用范式

AI安全模型正从辅助分析工具演进为具备端到端攻防能力的系统级智能体。其核心原理在于对计算系统全栈(OS内核、浏览器引擎、云API、硬件指令集)的深度语义建模与符号化执行,实现从漏洞发现到可复现exploit生成的自动闭环。这种能力带来显著的技术价值:将传统需数周的人工渗透压缩至小时级,大幅降低高危漏洞的发现-利用时间窗,重塑企业安全投入的ROI逻辑。典型应用场景包括供应链风险评估、老旧系统长尾资产审计、红蓝对抗自动化推演等。Claude Mythos Preview正是这一范式的标志性落地,其SWE-ben

weixin_34258838的博客 449

基于D3.js与Sigma.js的Vuls漏洞数据可视化实战

数据可视化是将抽象数据转化为直观图形的关键技术,其核心原理在于利用视觉编码高效传达信息。在网络安全领域,面对海量的漏洞扫描结果,传统的文本报告难以揭示资产、软件与漏洞间的复杂关联关系。此时,图数据可视化技术展现出巨大价值,它通过节点和边构建关系网络,能清晰呈现风险传播路径,极大提升安全态势感知与应急响应效率。D3.js作为强大的数据驱动文档操作库,提供了极致的灵活性和丰富的布局算法,适合构建自定义可视化组件;而Sigma.js则专为大规模网络图优化,凭借WebGL硬件加速能力,能流畅渲染成千上万的节点与边。

weixin_34101229的博客 331

告别下载烦恼!File Browser全格式在线预览终极指南:PDF、Office文件一键查看

还在为查看服务器上的文档反复下载而烦恼吗?是否遇到过Office文件必须用专用软件才能打开的尴尬?File Browser作为一款轻量级Web文件管理工具,彻底解决了这些痛点,让你无需安装任何软件就能直接在浏览器中流畅查看PDF、Word、Excel等20多种格式文件,打造属于自己的云端文件管理系统。这篇完整指南将带你从零开始掌握File Browser的安装、配置和高级使用技巧,让你轻松管理服务

gitblog_00389的博客 408

go语言实现Websocket 浏览器(附完整源码)

go语言实现Websocket 浏览器(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 312

Sqribble模板驱动文档自动化原理与实战

文档自动化是现代内容交付的核心能力,其本质是通过结构化内容模型(IDM)与预设排版规则的协同,实现从杂乱输入到专业PDF的确定性转化。它不依赖AI生成,而依托模板驱动、语义标记和云端渲染三大技术支柱,确保格式统一、版本可控、跨设备一致。相比传统Word排版或设计软件,该方案显著降低非专业用户的排版认知负荷,同时满足营销资料、培训手册、客户简报等高频场景对效率、合规与视觉专业性的复合需求。Sqribble正是这一范式的典型实践。

angel192939的博客 407

Go语言实现浏览器自动化操作:基于Chrome调试协议的高效解决方案

Chrome调试协议(Chrome DevTools Protocol,简称CDP)是Google为开发者提供的一套底层通信协议,用于与基于Chromium的浏览器进行深度交互。该协议通过WebSocket与浏览器实例建立连接,允许外部程序发送指令并接收运行时数据,从而实现对页面加载、DOM操作、网络请求、性能监控等全方位控制。相较于传统的自动化工具,CDP直接作用于浏览器内核层面,具备更高的执行效率和更低的资源开销。

weixin_35639680的博客 2218

负鼠:用Golang编写的基本网络浏览器

负鼠Web浏览器 基本的便携式Web浏览器; 只需一个Go编译器即可编译,无需C依赖项。 UI是使用构建的 仍然是非常实验性的,大多数功能都缺少,这是屏幕截图: : 支持的功能: 基本CSS / HTML5支持,诸如float / flex布局之类的大部分只是存根实现 服务器端渲染的网站 图片(虽然一次全部预加载) TLS 可以激活实验性JS / DOM(非常基本的jQuery示例都可以工作) 文件下载 安装 方案9 您可以从下载带有二进制文件的tarball。 ./opossum-plan9-amd64.bin 此外,还需要存在/sys/lib/tls/ca.pem才能正常工作。 可以从curl主页下载ca证书: hget https://curl.haxx.se/ca/cacert.pem > /sys/lib/tls/ca.pem 要编译源代码,需要Go 1.1

从场景构建到业务适配:CS架构数字孪生的架构演进与实践

数字孪生作为连接物理世界与数字空间的关键技术,其核心在于通过数据驱动实现对实体对象的动态映射与仿真。其技术原理在于集成物联网、三维可视化与业务系统数据,构建虚实交互的闭环。这一技术的核心价值在于超越静态展示,实现对业务流程的深度洞察与决策支持,广泛应用于智慧城市、工业制造及水利设施管理等场景。本文聚焦于CS(客户端-服务器)架构下的数字孪生应用,探讨如何克服传统方案中重渲染轻业务的局限,通过架构分层、数据驱动与配置化管理,实现从“炫技式”场景构建到深度“业务适配”的转型,从而应对数据集成、多端协同等工程挑战

weixin_33985507的博客 405

产业园区如何高效对接企业技术需求与高校科研成果?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

基于Minium与PageObject的微信小程序UI自动化测试实战指南

UI自动化测试是现代软件工程中提升测试效率、保障回归质量的核心实践。其原理是通过脚本模拟用户操作,自动执行预设的测试用例,从而将测试人员从重复的机械劳动中解放出来。这项技术的价值在于能够实现快速反馈、提升测试覆盖率,并作为持续集成与交付(CI/CD)流程中的重要质量门禁。在Web和移动应用开发领域,UI自动化测试已被广泛应用。对于微信小程序这一特殊载体,其独特的渲染层与逻辑层分离架构,以及运行在微信客户端沙箱环境中的特点,对测试工具提出了特定要求。为此,微信官方推出了Minium测试框架,它提供了原生、多端

weixin_34319817的博客 343

国央企创新负责人如何快速掌握本地科技资源分布与匹配情况?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

AI数字人短视频数字人口播数字人分身建模流程全解析

在人工智能与计算机图形学蓬勃发展的当下,数字人建模作为打造虚拟数字人的核心环节,其流程复杂且精妙,融合了多种前沿技术与创意构思,为栩栩如生的数字人形象奠定基石。​。

2403_87518095的博客 1447

用golang实例来看看浏览器的同源策略(跨域问题其实很好懂)

明天中秋节, 今天出来吃海底捞,取号后,还要等100多桌,呵呵哒。索性来奈雪喝茶,写点东西玩玩。 浏览器同源策略?网上一查一大堆,多数是理论讲解,网文也经常到处复制抄袭, 我不具体解释理论了。 本文来简单玩一下, 便于对浏览器的同源策略有更具体地理解。 来看static.go的代码: package main imp...

认知 行动 坚持 4806

【实用运维脚本】Windows 批量 TCP 端口检测(tcping 一键巡检)

摘要:本文介绍一款高效的Windows批量TCP端口检测脚本,适配tcpingv0.39工具,实现多服务器一键巡检。脚本具有进度可视化、双日志输出、自动容错等优势,支持注释行过滤和UTF-8编码。 使用仅需三步: 1)下载tcping工具 2)编辑目标列表 3)运行脚本即可自动检测并生成带编号的检测报告。 该方案解决了手动检测效率低、易遗漏的问题,特别适合日常运维中的端口连通性检查,实测稳定可靠,开箱即用。

蕲士|D365 & 服务器运维,心有东坡,行稳致远。 799

golang 打开浏览器

package desktop import ( "fmt" "os/exec" "runtime" ) var commands = map[string]string{ "windows": "cmd /c start", "darwin": "open", "linux": &quot

idwtwt的专栏 5576

拯救你的备份数据!STM32F407 RTC Tamper功能防篡改设计指南

本文详细介绍了STM32F407 RTC Tamper功能在物联网数据安全中的应用,包括硬件触发、数据清除和时间戳记录等核心机制。通过实战案例和代码示例,展示了如何构建多层次的防御体系,确保敏感数据在物理入侵时自动擦除并记录精确时间戳,适用于智能门锁、工业传感器等高安全需求场景。

weixin_28278377的博客 279

SMPTE ST 2110 概论(一)

SMPTE ST 2110 概论(一)前言ST 2110与ST 2022-6ST 2110-10:基本结构与时序ST 2110-20:未压缩的视频流后续 前言 这是一份我在实习期间制作的,关于SMPTE ST 2110的简单介绍。 这篇文章主要以梳理总结 SMPTE ST 2110 的概念为主,关于具体的内容,比如IP数据报的格式、RTP时间戳的具体代码内容等等,大家可以查阅 SMPTE ST 2...

Cidd0422的博客 2万+
上一篇: 【Go语言高并发编程实战】:揭秘百万级QPS系统设计核心技巧
下一篇: 【程序员节专属福利大放送】:1024狂欢背后的高效编程秘籍全公开
CodePulse
博客等级 码龄2年 187粉丝 2233原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值