- 博客(121)
- 问答 (2)
- 收藏
- 关注
原创 RFC8489-STUN
Karn 算法通过避免使用重传后的 ACK 来更新 RTT 估计,提高了 RTT 估计的准确性。这对于 TCP 的拥塞控制和流量控制非常重要,因为它可以更准确地反映网络的实际延迟情况,从而更好地适应网络条件的变化。
2025-06-06 13:53:27
822
原创 视频存储开源方案
客户端 API 提供了一组全面的作来管理存储桶和对象。类别描述存储桶作创建新存储桶列出所有存储桶检查存储桶是否存在删除存储桶对象作上传对象下载对象获取对象元数据删除对象列出存储桶中的对象复制对象将文件作为对象上传将对象下载到文件删除多个对象Multipart启动分段上传上传对象的一部分完成分段上传中止分段上传特殊作使用 SQL 查询对象内容获取存储桶事件的通知通过组合其他对象来创建对象。
2025-05-26 16:59:28
947
原创 SRS流媒体服务器(7)源码分析之拉流篇
从SrsRtmpConn::stream_service_cycle()函数切入,它是RTMP拉流处理的核心入口,负责协调不同类型RTMP连接(播放或推流)的初始化和资源分配,为后续数据交互奠定基础。→ SrsRecvThread::do_cycle() → SrsProtocol::recv_message 协程接收RTMP消息。→ SrsRtmpConn::stream_service_cycle() RTMP连接处理主逻辑,→ SrsRtmpConn::publishing 开始发布流。
2025-05-25 20:10:06
761
原创 SRS流媒体服务器(6)源码分析之推流篇
本文详细介绍了RTMP协议在SRS流媒体服务器中的实现,重点分析了推流过程中的关键代码和流程。首先,文章强调了RTMP基础知识的重要性,并推荐了相关的学习资源。随后,文章深入探讨了SRS服务器中RTMP连接的启动、推流对象的创建、以及FMLE推流的具体实现。接着,文章详细解析了RTMP消息的接收、处理、分发过程,包括音频、视频、聚合消息和元数据的处理逻辑。文章还介绍了SRS中的核心组件如Hub、Bridger和Consumer的作用及其在流媒体分发中的协作方式。最后,文章分享了ATC时间戳处理、jitter
2025-05-19 21:13:43
804
原创 SRS流媒体服务器(5)源码分析之RTMP简单和复杂握手
学习RTMP握手逻辑前,需明确RTMP协议的连接流程及简单握手与复杂握手的区别。RTMP握手过程包括接收客户端发送的C0C1数据,解析C1,生成并发送S0S1S2数据,最后接收C2数据。复杂握手优先尝试,若失败则转为简单握手。复杂握手通过Schema0和Schema1两种方式解析C1,其中Schema0为固定位置验证,Schema1则通过时间戳计算Digest位置,安全性更高。简单握手中C1和S1从第9字节开始为随机数,S2是C1的复制,C2是S1的复制。代码示例展示了复杂握手和简单握手的实现细节,包括数据
2025-05-16 23:10:49
590
原创 SRS流媒体服务器(4)源码分析之RTMP端口监听
RTMP 监听的核心流程是:SrsServer→ 初始化→ 每个管理一个→通过协程循环接受新连接 → 连接通过回调传递给SrsServer处理业务逻辑。下列给出程序开始到rtmp监听整体时序图:学习资料分享。
2025-05-10 12:39:33
843
原创 SRS流媒体服务器(2)配置性能优化
SRS (Simple Realtime Server) 中提供的各种性能优化选项。这些选项允许您针对不同场景优化 SRS,从而在延迟、吞吐量和资源利用率之间取得平衡。有关常规配置的信息,请参阅。1.1 性能提升目标如上图所示,SRS 提供了几类性能优化,可以对其进行配置以匹配您的特定使用。
2025-05-06 21:29:21
974
原创 SRS流媒体服务器(1)概述和环境搭建
SRS(Simple Realtime Server)是一款高性能、跨平台的流媒体服务器,支持多种协议,包括 RTMP、WebRTC、HLS、HTTP-FLV、SRT、MPEG-DASH 和 GB28181。本文介绍了 SRS,包括其用途、关键功能、架构和支持协议。SRS 旨在创建一个免费的开源社区,帮助开发人员构建高质量的流媒体和 RTC 平台。它已获得 MIT 许可,使其适用于商业和非商业用途。目标和设计理念SRS 旨在成为一种简单、高效和实时的流媒体服务器,其基本功能侧重于性能和稳定性。
2025-05-05 18:52:22
647
原创 WebRTC 服务器之Janus视频会议插件信令交互
7. 最后 关闭所有的handles并关闭相关的相应的PeerConnections;消耗destroy会话session。创建⼀个或多个handle 以attach到插件(plugin)(例如videoroom、videocall等插件);连接到janus server并创建create⼀个会话session;与创建交互(发送/接收消息,协商PeerConnection);,并传递其依赖项(依赖项可选);,即是包含janus.js;连接服务器 & 创建会话。
2025-05-04 19:08:07
1176
原创 WebRTC 服务器之Janus架构分析
适合刚学习 WebRTC 的场景,简单易实现,但实际应用中因上行带宽占用大、线性资源占用等问题,超过 4 人时问题明显,几乎无人在真实场景中使用。,可以根据终端下行网络状况进行流控,如根据带宽、网络延时情况选择性地丢弃一些媒体数据,以保证通信的连续性,更好地适应不同的网络状况和终端设备。,作为音视频网关,通过解码、再编码可以屏蔽不同编解码设备之间的差异化,满足更多客户的集成需求,提升用户体验和产品竞争力。- 统一画面输出,将多路视频混合成一路,所有参与者看到的是相同的画面,有助于提供一致的客户体验。
2025-05-03 18:24:00
1359
原创 WebRTC 服务器之Janus概述和环境搭建
Janus 是由 Meetecho 开发的通用 WebRTC 服务器,它为构建 WebRTC 应用程序提供了一个模块化框架。服务器目标:实际功能是在浏览器通过 Janus 核心连接的服务器端插件中实现的。这种模块化架构允许占用空间小,同时提供最大的灵活性。主要特点。
2025-05-03 13:55:47
1485
原创 深入理解ffmpeg第四章封装与解封装
书籍基本信息书名: 《深入理解FFmpeg》作者: 刘歧、杜金房、宋韶颍 等出版社: 电子工业出版社出版时间: 2020 年适合读者: FFmpeg 开发者、音视频工程师、对 FFmpeg 源码感兴趣的技术人员。深入理解。
2025-03-06 17:39:53
224
原创 去中心化技术P2P框架代码示例
第七步 接收到p2p连接请求,回发 NTY_PROTO_P2P_CONNECT_ACK 一方切换成p2p消息状态。一个典型的P2P打洞(UDP hole punching)的过程。第四步 p2p连接,把自己id和p2p id发送给服务器。或不p2p 发送消息】这是一个典型的P2P应用架构,类似于早期P2P通信软件的基本实现方式。【第八步 双方切换成p2p消息状态,消息发送。第九步:P2P模式消息接收,进行ack回复】第六步 接收到p2p方ip 进行udp连接。搜索正则过滤:第[^步]*步。
2025-03-03 15:17:06
486
原创 去中心化技术P2P框架
1.双方属于完全锥型NAT (1次 p2p大概率成功)2.双方属于限制类型nat (受限,则通过中继服务器转发,最终p2p)3.两边是对称nat ()4.NAT1为限制锥型NAT,NAT2为对称NAT。总结:步骤3由于是锥形,不会产生记录。所以需要额外记录这次nat ip:port,步骤4 又产生多余的记录。只能靠猜测4是ip:port+1的模式,进行尝试。最后客户机1根据上述两点进行猜测。
2025-02-25 15:27:35
1298
3
原创 深入理解ffmpeg第二章FFmpeg简介
FFmpeg 的许可证FFmpeg 的发布许可证取决于编译时的选项LGPL-2.1(及之后):适用于使用动态链接库的情况,允许闭源使用。GPL-2.0(及之后):适用于使用静态链接库或修改 FFmpeg 源代码的情况,要求开源。开发者可以根据需求选择合适的许可证版本。总结FFmpeg既是一个多媒体工具集(包含 ffmpeg、ffplay、ffprobe),也是一个开发套件(提供丰富的 API 和工具库)。其核心功能包括音视频编解码、格式转换、流媒体处理、色彩与采样率转换等。
2025-01-23 16:48:19
727
原创 深入理解ffmpeg第一章多媒体基础
傅里叶变换将时域信号转换为频域信号,揭示信号的频率组成。时域表示信号随时间的变化,频域表示信号中不同频率的振幅。通过旋转三维视图,可以更直观地观察频谱分布。时域和频域是同一信号的两种表示方式,各有其应用场景。声音的大小变化并不是线性的,即声音的刺激与人真正听到的感觉不是线性的,而是呈对数关系一个对数曲线示意图如图1-6所示,x轴为声音的刺激量,y轴为人的感觉量,即声音的响度(音量),声音的响度以分贝(dB)表示频率大小决定听到的内容。人耳对响度和频率的敏感度。
2025-01-21 12:50:25
908
原创 Android NDK开发入门2之适应idm环境
前面已经运行了一个简单的初始程序,现在我们来往初始程序添加类和函数,并成功运行的实验。上述讨论了如何导出不同的动态库,现在如果只想根据x86架构导出单个so库如何实现?1、可执⾏⼆进制⽂件的格式以及⽀持的内容类型,⼆进制⽂件如:程序、共享库...32位Intelx86架构,主要用于模拟器和部分低端设备。学习如何指定动态库导出路劲,并根据动态库切换,实现多种版本调用。64位Intelx86架构,主要用于模拟器和高性能设备。:主要用于模拟器,通过二进制翻译可以运行ARM架构的代码。
2025-01-07 18:06:32
1237
1
原创 Android NDK开发实战之环境搭建篇(so库,Gemini ai)
音视频安卓开发首先涉及到ffmpeg编译打包,先了解动态库之间的cpu架构差异性。然后再搭建可运行的Android 环境。
2025-01-04 11:54:54
1131
2
原创 ffmpeg filter 滤镜命令
FFmpeg filter滤镜是一种强大的功能,可以用于处理和操作视频和音频数据。视频处理调整视频分辨率、宽高比、帧率等属性执行视频剪辑和裁剪操作应用各种视觉特效,如模糊、锐化、色彩校正等合成多个视频源,如画中画、叠加文字等音频处理调整音量、均衡、混合多个音频轨道添加回声、噪音抑制等音频特效执行音频剪辑和拼接格式转换在不同的编解码器和容器格式之间进行转换,实现视频和音频的解复用操作。分析和调试测量视频和音频的质量指标,如 PSNR、SSIM 等获取视频和音频的元数据信息。
2025-01-03 14:44:24
1665
原创 音视频采集推流时间戳记录方案
落点值 = T = current systime - starttime //当前系统时间 – 起始时间。frameTimeStamp = current systime - start time //第一帧时间戳= 系统时间–起始时间。//如果当前帧的计算时间戳(CurrentFrameTS)与系统时间差值(T)的绝对值大于等于一个半帧间隔,那么我们就应该将当前帧的时间戳直接设置为系统时间差值T。初始化 starttime = systime。
2024-12-26 13:51:56
2315
原创 Easylogging++日志库介绍和崩溃解决方案
Easylogging++ 是一个轻量级、高性能且易于使用的 C++ 日志库。它被设计用于在 C++ 项目中提供可靠、灵活和可定制的日志记录功能。跨平台支持Easylogging++ 可以在 Windows、Linux 和 macOS 等主流操作系统上工作。它具有良好的跨平台兼容性。易于集成和使用Easylogging++ 只需要包含单个头文件就可以在项目中使用。它没有任何外部依赖,易于集成。它提供了直观的 API,使用起来非常简单,开发者可以快速上手。高度可配置。
2024-12-23 15:07:37
1039
原创 boost asio 高性能服务器
这小部分主要就是socket绑定的内容。后续我们关注重点放在发送和接收数据。为什么要提供这些api?其实这里涉及到粘包问题:三个解决方案1.读固定字节 2.读特定符号停止 比如“\r\n” 3.header + body形式 头部放body长度。write_some 可以每次向指定的空间写入固定的字节数。read_until 一直读取,直到读取指定字符结束。read和send recvice/writer 一次阻塞读完,能保证数据不丢。
2024-12-22 23:32:07
1276
原创 播放器秒开优化2
我们在第一篇主要提到网络延迟优化以及较为细节的播放器参数优化。本篇我们结合业务场景,谈论优化点,首先提到容器格式,其次谈论预加载技术,最后根据场景细节分析优化点,最后谈到给预加载加一层代理缓存节点。
2024-12-11 13:44:08
828
原创 播放器秒开优化
结合公司实力进行优化,优先考虑缓存提速比如dns http这类连接耗时,tcp改进为fast open,cdn gop缓存机制。其次ijkplay源码,流媒体更改为格式固定版本,去除协议探测耗时。其次考虑源码参数,比如播放器缓存队列启动大小,引入池化技术。
2024-12-10 16:46:53
1456
原创 基于 http-flv 的端到端延迟优化
先让ai看看直播互动体验和商业应用场景(电商直播、在线教育等)需要低延迟高延迟会影响互动体验,降低用户参与度推流端延迟:编码、发送缓存等拉流端延迟:边缘节点加载延迟、本地缓存GOP Cache 策略:缓存 N 组 GOP 序列,降低加载延迟观众端本地缓存优化:解决网络抖动,但会增加总视觉延迟通过调整推流、转码、CDN 等配置,实现总视觉延迟 3-6 秒可能存在技术瓶颈,如网络带宽探测、播放流畅性等需要更复杂的算法和策略来平衡延迟和流畅性。
2024-12-10 14:06:26
771
原创 C++ 11重点总结2
std::recursive_timed_mutex,带超时的递归互斥量。包装可调用对象(如函数或 lambda 表达式)的类,可以异步执行该对象。std::recursive_mutex,递归互斥量,不带超时功能。std::time_mutex,带超时的独占互斥量,不能递归使用。std::mutex,独占的互斥量,不能递归使用。允许定义接受任意数量和类型参数的模板函数和模板类。折叠表达式(C++17)综合示例简单的线程池。
2024-11-27 19:16:44
817
原创 C++ 11重点总结1
auto_ptrunique_ptrshared_ptrweak_ptr: 自定义删除器。shared_ptrshared_ptrshared_ptrunique_ptrunique_ptrshared_ptr初始化灾难。new T会造成重复类型声明。代码可读性差删除器区别。需要指定删除器类型weak_ptrshared_ptrthisweak_ptr举个例子,监视某内存的释放。weak_ptr在使用前需要检查合法性。智能指针通常是安全的,但在多线程访问同一个shared_ptr对象时需要考虑线程安全性。
2024-11-27 15:45:11
1190
原创 OpenGL 变换
理论总结:向量与标量相加减乘除向量的长度计算向量取反向量单位化向量与向量相加减向量点乘向量叉乘矩阵介绍线性变换和仿射变换行主序和列主序矩阵与标量相加减和数乘计算虽然复杂,但是我们使用计算机计算,调库传参数足以。
2024-11-22 12:55:28
308
原创 OpenGL 纹理
纹理是什么,图片的坐标轴向在 OpenGL 中,纹理(Texture)是一种用于存储和管理二维图像数据的机制。它是一种非常重要的渲染技术,可以大大增强 3D 场景的细节和真实感。纹理的基本概念纹理图像纹理是由一个或多个二维图像组成的,也存在1D or 3D。这些图像包含了丰富的颜色和细节信息。纹理坐标纹理坐标是一个二维坐标系统,用于描述纹理图像上的某个位置。纹理坐标通常用 (s, t) 来表示,取值范围为 [0, 1]。还有r 和xyz相似。纹理映射将纹理图像映射到 3D 模型表面的过程叫做纹理映射。
2024-11-21 10:43:00
1092
原创 OpenGL 渲染
在OpenGL中,任何事物都在3D空间中,而屏幕和窗口却是2D像素数组,这导致OpenGL的大部分工作都是关于把3D坐标转变为适应你屏幕的2D像素。3D坐标转为2D坐标的处理过程是由OpenGL的图形渲染管线(Graphics Pipeline,大多译为管线,实际上指的是一堆原始图形数据途经一个输送管道,期间经过各种变化处理最终出现在屏幕的过程)管理的。图形渲染管线可以被划分为两个主要部分:第一部分把你的3D坐标转换为2D坐标,第二部分是把2D坐标转变为实际的有颜色的像素。
2024-11-19 22:45:56
977
qt creator idm
2024-07-10
Mysql中on与where关系
2023-08-26
G4.9 pool alloc 与SGI STL二级空间配置器内存管理是一样的吗?
2023-08-09
求解字符数组和字符‘带\0’问题
2021-06-12
C++中虚析构函数作用和继承
2021-05-24
TA创建的收藏夹 TA关注的收藏夹
TA关注的人