- 博客(77)
- 问答 (2)
- 收藏
- 关注
原创 信令服务器设计之websocket
对于我们WebRTC项目而言,nodejs主要是实现信令服务器的功能,客户端和服务器端的交互我们选择websocket作 为通信协议,所以该章节的实战以websocket的使用为主。web客户端的websocket和nodejs服务器端的websocket有一定的差别,所以我们分开两部分进行讲解。本章节主要介绍后续信令服务器的协议websocket基本运用,后续对信令服务器进行详细描述学习资料分享。
2024-11-08 23:37:10 683
原创 WebRTC基础理论和通话原理
WebRTC(Web RealTime Communication)是 Google于2010以6829万美元从 Global IP Solutions 公司购买,并 于2011年将其开源,旨在建立一个互联网浏览器间的实时通信的平台,让 WebRTC技术成为 H5标准之一。它定义了一组标准化的API,用于在浏览器和移动应用程序中进行实时语音、视频和数据通信,无需安装任何插件或其他软件。
2024-11-07 13:41:07 966
原创 ubuntu编译ffmpeg
运行环境:vmware ubuntu 20.04时间:2024年10月24日权限问题:由于ubuntu权限问题 建议使用root权限编译,且~是根据用户组来进行定位的。
2024-10-26 20:32:24 640
原创 hls协议基础知识1
HLS (HTTP Live Streaming) 是由 Apple 公司开发的一种自适应比特率流媒体技术协议。它通过将整个视频流拆分成一系列小的 HTTP 文件片段来实现,每个片段描述了整个视频流的一小段时间。在播放过程中,客户端可以从多个不同码率的替代流中选择,从而根据可用带宽自动调整视频质量,确保流畅的播放体验。HLS 的主要特点包括:自适应比特率:HLS 可以根据用户的网络状况自动调整视频的码率和分辨率,确保视频播放的连续性。
2024-10-23 13:13:14 1091
原创 qt creator 转 visual stdio 项目调试
最后成功编译通过,本文主要介绍从qt creator 转 visual stdio 调试的步骤,主要还是配置选项,需要我们手动更改。
2024-10-19 11:33:28 298
原创 RTMP 传输结构分析
•RTMP中时间戳的单位为毫秒(ms)•时间戳为相对于某个时间点的相对值•时间戳的长度为32bit,不考虑回滚的话,最大可表示49天17小时2分钟47.296秒•Timestamp delta单位也是毫秒,为相对于前一个时间戳的一个无符号整数;可能为24bit或32bit•RTMP Message的extended时间戳 4个字节•大端存储。
2024-10-17 14:03:44 858
原创 RTMP协议分析
RTMP协议是应⽤层协议,是要靠底层可靠的传输层协议(通常是TCP)来保证信息传输的可靠性的。在基于传输层协议的链接建⽴完成后,RTMP协议也要客户端和服务器通过“握⼿”来建⽴基于传输层链接之上的RTMP Connection链接,在Connection链接上会传输⼀些控制信息,如SetChunkSize,SetACKWindowSize。其中CreateStream命令会创建⼀个Stream链接,⽤于传输具体的⾳视频数据和控制这些信息传输的命令信息。
2024-10-17 14:03:14 1035
原创 RTP H264封包和解包分析
R: 1 bit保留位必须设置为0,接收者必须忽略该位。此处的Type就是NALU头中的Type,取1-23的那个值,表示 NAL单元荷载类型定义,
2024-10-10 14:38:33 1182
原创 RTSP 音视频play同步分析
当然,这只是少数例外。要实现RTP媒体间同步,需要借助于RTCP,在RTCP的SR包中,包含有对,音频帧RTP时间戳和视频帧RTP时间戳通过对,都可以准确定位到绝对时间轴NTP上,音频帧和视频帧的相对时间关系就可以确定下来 了。首先,这个时间戳就是一个值且必须满足大家都来使用这个值,用来反映某个数据块的产生(采集)时间点的, 后采集的数据块的时间戳肯定是大于先采集的数据块的。第二,在实时流传输中,数据采集后立刻传递到RTP 模块进行发送,那么,其实,数据块的采集时间戳就直接作为RTP包的时间戳。
2024-10-10 13:36:22 1351
原创 RTSP RTP RTCP SDP基础知识
实时流传输协议(RTSP:Real Time Streaming Protocol)是⼀种⽹络传输协议,旨在发送低延迟流。该协议由RealNetworks,Netscape和哥伦⽐亚⼤学的专家在1996年开发。它定义了应如何打包流中的数据以进⾏传输。RTSP 用于创建和控制流媒体服务器上的多媒体会话。比如多媒体流播放、暂停、快进和快退。RTSP 常用于视频会议、视频监控、远程教学和视频点播等场景。- RTP 负责传输多媒体数据(如音频和视频)。服务器默认端口号5004。
2024-10-09 17:46:59 1142
原创 ffplay播放器研究分析
PacketQueue设计思路:设计⼀个多线程安全的队列引⼊serial的概念,区别前后数据包是否连续,主要应⽤于seek操作。设计了两类特殊的packet——flush_pkt和nullpkt(类似⽤于多线程编程的事件模型——往队列中放⼊ flush事件、放⼊null事件),我们在⾳频输出、视频输出、播放控制等模块时也会继续对flush_pkt和 nullpkt的作⽤展开分析。创建视频图像缩放上下文的函数。第⼀参数可以传NULL,默认会开辟⼀块新的空间。
2024-09-24 18:02:44 1028
原创 ffplay播放器 暂停、逐帧、音量、快进快退seek功能分析
本文章由理论结合实践阅读ffplay播放器源代码,清晰的将ffplay各种复杂功能解剖分析。学习资料分享。
2024-09-24 10:00:00 1006
原创 ffplay音视频同步分析
double pts;// 当前帧(待播放)显示时间戳,播放后,当前帧变成上一帧//两时间差值,可以理解为持续时间// 最后一次更新的系统时钟// 时钟速度控制,用于控制播放速度int serial;int paused;// = 1 说明是暂停状态} Clock;audio:视频同步到⾳频。上⼀节中的A被触发,video输出需要作同步,同步的参考 (get_master_clock)是audclk.video:⾳频同步到视频。
2024-09-23 14:34:31 714
原创 深入理解音视频pts,dts,time_base以及时间数学公式
总结:ffmpeg提供了很多现成的api函数,我们在使用前需要知道它们之间的关系,不然在求学的道路上,很难快速学习。必须佩服开发人员对时间的理解,我们在求学也要多留意世界的奥妙,参悟宇宙法则,再结合实际进行创新。学习资料分享。
2024-09-23 14:23:17 1147
原创 ffmpeg H264编码实战
◼ 为了能够在最后熵编码的时候压缩率更高,对于送到熵编码(以行程编码为例)的“像素串”,包含的0越多,越能提高压缩率。为了达到这个目标:◼ 先通过帧内预测或者帧间预测去除空间冗余和时间冗余,从而得到一个像素值相比编码块小很多的残差块。◼ 然后再通过 DCT 变换将低频和高频信息分离开来得到变换块然后再对变换块的系数做量化。
2024-09-04 18:20:02 1430
原创 ffmpeg pcm aac音频编码
PCM(Pulse Code Modulation,脉冲编码调制)⾳频数据是未经压缩的⾳频采样数据裸流,它是由模拟信 号经过采样、量化、编码转换成的标准数字⾳频数据。描述PCM数据的6个参数:1. Sample Rate : 采样频率。8kHz(电话)、44.1kHz(CD)、48kHz(DVD)。2. Sample Size : 量化位数。通常该值为16-bit。3. Number of Channels : 通道个数。
2024-09-01 21:52:12 1412
原创 ⾳频重采样及基本概念
所谓的重采样,就是改变⾳频的采样率、sample format、声道数等参数,使之按照我们期望的参数输出。比如降低采样率 减少文件占用内存。
2024-09-01 18:22:59 1104
原创 音视频解码 AVIO内存输入模式
下列主要介绍使用avio内存输入模式,进行初始化,数据来源绑定以及读取数据。//1.自定义io 稍后必须用av_free()释放/**2.定义io上下文* 分配并初始化一个AVIOContext对象,用于缓冲式I/O操作。之后必须使用avio_context_free()函数释放该对象。* @param buffer 用于通过AVIOContext进行输入/输出操作的内存块。* @param buffer_size 缓冲区的大小对于性能非常重要。
2024-09-01 13:42:59 741
原创 ffmpeg 音视频解码
1.AVCodecParser:⽤于解析输⼊的数据流并把它分成⼀帧⼀帧的压缩编码数据。⽐较形象 的说法就是把⻓⻓的⼀段连续的数据“切割”成⼀段段的数据。2.FFmpeg提供了两组函数,分别⽤于编码和解码:解码:调⽤avcodec_receive_frame(),如果成功会返回⼀个包含未压缩数据的 AVFrame。编码:调⽤avcodec_receive_packet(),如果成功会返回⼀个包含压缩数据的 AVPacket。
2024-09-01 13:05:47 893
原创 flv格式分析与解复用
FLV(Flash Video)是Adobe公司推出的⼀种流媒体格式,由于其封装后的,⾮常适合于互联⽹上使⽤。⽬前主流的视频⽹站基本都⽀持FLV。采⽤FLV 格式封装的⽂件后缀为.flv。FLV封装格式是由⼀个⽂件头(file header)和 ⽂件体(file Body)组成。其中,FLV body由⼀ 对对的(Previous Tag Size字段 + tag)组成。Previous Tag Size字段 排列在Tag之前,占⽤4 个字节。
2024-08-23 14:32:58 1108
原创 AAC格式分析
AAC是编码格式,ADTS是一种容器格式,在处理AAC音频时需要注意两者的区别和联系。ADTS格式在每个AAC音频帧的开头添加了一些头部信息,如采样率、声道数等,用于指示这个音频帧的属性。这样可以方便接收方识别和解析音频数据。
2024-08-15 12:16:02 1153
原创 H264分析
GOP 指的就是两个I帧之间的间隔. ⽐较说GOP为120,如果是720 p60 的话,那就是2s⼀次I帧.在视频编码序列中,主要有三种编码帧:I帧、P帧、B帧,如下所示:1. I帧即Intra-coded picture(帧内编码图像帧),不参考其他图像帧,只利⽤本帧的信息进⾏编码。2. P帧即Predictive-codedPicture(预测编码图像帧),利⽤之前的I帧或P帧,采⽤运动预测的⽅式进⾏帧间预测编码。
2024-08-14 19:19:13 959
原创 opencv 编译和使用 报了“无法定位程序输入点xxx于动态链接库”的异常
在执行编译出来的exe时,报了“无法定位程序输入点xxxxxxxxxxxxx动态链接库”的异常。出现这个问题时,应该就是使用的libstdc+±6.dll版本不匹配所导致的。一套流程下来 编译成功,但是程序运行有问题。
2024-08-10 19:08:24 419
原创 git checout 失误后回溯
总结:主要还是记录一下git方法,由于是新手,有时候不知不觉的就把成品代码文件回溯到之前版本。理解:当前完成品代码 切换到上个版本了,完成品代码的信息不在git log内。有时候失误 git checkout xxx 源文件丢失怎么办?
2024-08-09 15:14:02 238
原创 windows环境编译ffmpeg +visual studio 2022
1.坑有点多,主要出现在路劲上。比如export LIB=$LIB";D:\msys64\usr\local\lib" 加入了也没什么用,应该是msys2子系统不能识别D:xxxx 使用/usr/local/lib这种方法就可以。2.在编译三方库时不是很顺利,CC=cl --toolchain=msvc 反正关于msvc编译器的命令,就有问题。
2024-08-08 15:24:49 974
原创 音视频开发 sdl库
◼ SDL_Window 代表了一个“窗口”◼ SDL_Renderer 代表了一个“渲染器”◼ SDL_Texture 代表了一个“纹理”◼ SDL_Rect 一个简单的矩形结构存储RGB和存储纹理的区别:比如一个从左到右由红色渐变到蓝色的矩形,用存储RGB的话就需要把矩形中每个点的具体颜色值存储下来;而纹理只是一些描述信息,比如记录了矩形的大小、起始颜色、终止颜色等信息,显卡可以通过这些信息推算出矩形块的详细信息。所以相对于存储RGB而已,存储纹理占用的内存要少的多理解:以一条美食街举例。
2024-08-05 20:52:48 426
原创 C++20 ranges
什么是 ranges?ranges 的核心概念ranges 的特点ranges 的常用算法 ranges 的应用场景 实践比较使用zip来快速生成map 总结:头文件为C++20引入了一个强大的范围编程框架,提供了丰富的概念、视图和适配器,使得代码更加简洁、表达力强和可组合。这极大地增强了C++标准库在处理序列数据方面的能力。目前还是草案阶段,许多编译器不支持
2024-08-02 10:32:04 441
原创 boost库 内存池
简单轻量:它是一个基础的内存管理工具,实现简单,开销较小。高效:通过维护内存块列表,可以快速分配和回收内存。可定制:提供了许多可配置的选项,如内存块大小、对齐方式等。可重用:可以被上层的内存池实现 (如) 重复利用。内存池管理Boost.Pool 提供了两种主要的内存池实现:和。它们都利用来管理内存块,提高内存利用率和缓存命中率。固定大小对象管理Boost.Pool 专注于管理固定大小的对象,这种设计能够提高内存管理的效率。它使用连续的内存块来存储这些对象,避免了频繁的new和。
2024-07-29 17:54:58 1131
原创 c17 新特性 字面量,变量,函数,隐藏转换,拷贝省略等
c17新特性引入了许多新的语法,这些语法特性更加清晰,不像传统语法,语义飘忽不定,比如‘a’你根本不知道是宽字符还是UTF-8 字符。以及测试i++ ++i,最后结果到底是多少。这种问题很大情况是根据编译器的优化进行猜测,不同环境,得出不同结果。而c17对这些问题给出完美的解决方案!官方给出的语法:普通字符字面量: UTF-8 字符字面量: UTF-16 字符字面量: UTF-32 字符字面量: 宽字符字面量: 普通多字符字面量: 宽字符多字符字面量: 普通字符字面量:UTF-8 字符字面量:UTF-16
2024-07-25 14:54:20 1076
原创 c17 新特性 字符串和数字转换 charconv
性能优化: 通过避免创建临时的对象,可以大幅提高数字和字符串之间转换的效率。出错处理: 这些函数返回一个由指针和错误代码组成的结构体,可以帮助开发者更好地处理转换过程中可能出现的错误。灵活性: 这些函数可以与各种数值类型和字符串表示一起使用,提高了代码的通用性和可复用性。总的来说,和是C++17中非常有价值的新特性,它们可以帮助开发者编写更高效、更安全的数字和字符串转换代码。对于需要频繁进行这种转换的应用程序来说,使用这些函数可以带来显著的性能优势。
2024-07-25 09:51:57 425
原创 c17新特性 文件操作 filesystem
学习和使用filesystem有利于我们开发出跨平台的应用,而且函数封装的很好,值得我们学习,以最少的时间,做出正确的效果。参考文献写的很详细,如果读取本文还有不懂得,可以进入文献,进一步的学习,开拓视野。
2024-07-24 17:32:57 5249
原创 C17 string_view引入
stringview 好处:可读性更强了,开发者不必理会字符串传递规则,直接使用就能写出高性能的代码,把工作重点放在业务上。`std::string_view`虽然有很多优点,但也存在一些潜在的缺点,需要开发者注意:1. 所有权问题:- `std::string_view`不拥有它所引用的字符串数据,因此如果原始字符串数据在`std::string_view`对象的生命周期结束前被销毁,就会出现悬垂引用的问题。开发者需要谨慎管理字符串数据的生命周期。
2024-07-24 11:25:57 922
原创 cpp17 新特性 结构化绑定声明 简化代码!
结构化绑定,可以简化代码的同时,可读性更强。而且语法越来越像脚本语言。不知道在增加代码可读性情况下,性能是否会受影响。有研究性能这方面的大佬可以留下关于性能的评论。
2024-07-23 15:07:31 224
空空如也
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关注的人