自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(119)
  • 资源 (1)
  • 收藏
  • 关注

转载 AVFrame存放一帧视频原始数据

ffmpeg

2022-06-26 08:21:03 816

转载 C++11:原子交换函数compare_exchange_strong

compare_exchange_strong:atomic库中的一个函数,入参是3个,expect,desire,memoryorder,意思是如果当前的变量this的值==expect值,则将this值改为desire,并返回true,否则,返回false,不进行修改,即进行一个读的操作。通常用于例如线程B等待线程A执行完毕,或者执行到某个步骤。此时线程B可以进行while等待,线程A在执行到对应步骤,将对应的原子变量置为expect值即可。类似于“接力运动”。这里由于会进行读写操作,所以,

2021-10-12 10:39:41 1044 1

转载 对 GetCursorPos()的 说明

GetCursor()的 用法 通常是CPoint cp;GetCursorPos(&cp);它获取的是 鼠标相对屏幕的左上角的距离,单位是像素。而对于一个窗口来说,它的消息响应函数的输入参数通常是相对于客户区左上角的距离。比如说OnLButtonUp(UINT nFlags, CPoint point)的 point参数,就是相对于客户区的左上角而言的。想要把从GetCursorPos()获得的坐标转化成相对于客户区的坐标,要调用ScreenToClient()函数。...

2021-09-26 18:06:42 475

转载 C system函数打开程序时路径问题

如果路径中包含空格,直接使用system函数打开程序,会找不到程序。解决方法是使用双引号包住路径。示例如下:system("\"C:/Program files (x86)/a.exe\"");

2021-09-22 13:49:06 876

转载 关于WM_NOTIFY的使用方法

关于WM_NOTIFY的使用方法hwnd:32位窗口句柄。窗口可以是任何类型屏幕对象,因为Win32能够维护大多数可视对象的句柄(窗口、对话框、按钮、编辑框等)。message:用于区别其他消息的常量值,这些常量可以是Windows单元中预定义的常量,也可以是自定义的常量。wParam:通常是一个与消息有关的常量值,也可能是窗口或控件的句柄。lParam:通常是一个指向内存中数据的指针。由于wParam、lParam和pointer都是32位的,因此,它们之间可以相互转换。WM_NULL = $0

2021-09-17 10:25:55 461

转载 C2252: 只能在命名空间范围内显式实例化模板

今天在搞毕设时,运行网上的一个SDK,出现如下的错误提示error C2252: 只能在命名空间范围内显式实例化模板网上查了下,是这个错误是由于vs2010全局命名空间中找不到要导出的STL类。修改很简单:将需要导出的STL类从自定义的类中移动到全局命名空间中。template class __declspec(dllexport) std::allocator<std::string>;template class __declspec(dllexport) std::vector&l

2021-08-04 11:32:27 489

转载 CentOS 7升级gcc版本

Centos 7默认gcc版本为4.8,有时需要更高版本的,这里以升级至8.3.1版本为例,分别执行下面三条命令即可,无需手动下载源码编译1、安装centos-release-sclsudo yum install centos-release-scl2、安装devtoolset,注意,如果想安装7.版本的,就改成devtoolset-7-gcc,以此类推sudo yum install devtoolset-8-gcc*3、激活对应的devtoolset,所以你可以一次安装多个版本的devt

2021-07-14 13:59:08 115

转载 Webrtc源码开发笔记1 —Webrtc视频编码打包流程模块图解

一、Channel相关模块Channel主要维护编解码,RTP/RTCP相关逻辑模块以及维护Transport模块发送等,其中编解码与RTP/RTCP相关处理逻辑主要在Call模块下创建的各种Stream中封装。目前Webrtc中有多种Channel,下面简单梳理一下Channel间关系,然后针对视频发送流程整理一下每层Channel中对应的主要功能。原文链接:https://blog.csdn.net/lidec/article/details/106717545?ops_request_misc=

2021-06-26 16:01:02 646

转载 WebRTC学习进阶之路 --- 十七、源码分析之WebRTC的数据流水线详解&模块机制核心ProcessThread与ProcessThreadImpl

WebRTC学习进阶之路系列总目录:https://blog.csdn.net/xiaomucgwlmx/article/details/103204274对于实时音视频应用来讲,媒体数据从采集到渲染,在数据流水线上依次完成一系列处理。流水线由不同的功能模块组成,彼此分工协作:数据采集模块负责从摄像头/麦克风采集音视频数据,编解码模块负责对数据进行编解码,RTP模块负责数据打包和解包。数据流水线上的数据处理速度是影响应用实时性的最重要因素。与此同时,从服务质量保证角度讲,应用需要知道数据流水线的运行状态,

2021-06-25 14:05:58 308

转载 C++11新特性之十一:emplace

emplace操作是C++11新特性,新引入的的三个成员emplace_front、emplace 和 emplace_back。这些操作构造而不是拷贝元素到容器中,这些操作分别对应push_front、insert 和push_back,允许我们将元素放在容器头部、一个指定的位置和容器尾部。两者的区别当调用insert时,是将对象传递给insert,对象被拷贝到容器中,而当我们使用emplace时,是将参数传递给构造函,emplace使用这些参数在容器管理的内存空间中直接构造元素。#ifndef T

2021-06-23 15:51:21 398

转载 FFMPEG之时间基

fps=29.97fps=29.97这是一个小数啊,我如果直接利用公式 frame number = time * fps 得到了也不是一个整数啊,而帧号应该是一个整数才对。首先,29.97f/s这个数是如何得到的?这起源于早期的NTSC电视制式,而现代的数字编码只是为了兼容而沿用了它的标准。其实在标准制定时,NTSC采用的是30f/s的帧率,只是后来为了消除由彩色信号及伴音信号所产生的图像干扰,每秒幀幅由30帧稍微下調至29.97帧,同時频率由15750Hz稍微下降至15734.26Hz。欲知详情,参

2021-06-21 11:05:39 468

转载 ffmpeg——avformat_new_stream创建流通道

一:介绍1.1 AVStream首先了解下 AVStream : http://ffmpeg.org/doxygen/3.1/structAVStream.htmlAVStream 即是流通道。例如我们将 H264 和 AAC 码流存储为MP4文件的时候,就需要在 MP4文件中增加两个流通道,一个存储Video:H264,一个存储Audio:AAC(假设H264和AAC只包含单个流通道)typedef struct AVStream { int index; /**< strea

2021-06-17 17:34:13 467

转载 webrtc-自定义视频流-实现篇(基于release-54)

我所使用的webrtc是release-54版本,后续我也看过release-56版本的代码,发现有许多的代码差别很大,所以如果版本不同很大可能无法直接使用代码,请注意。我所开发的webrtc是基于centos7进行开发的,所以如果我没有特意标注的情况下都指的是linux下的webrtc,看官请知悉。原文连接:https://blog.csdn.net/u013113491/article/details/80285342?ops_request_misc=%257B%2522request%255Fid

2021-06-04 15:29:23 819 1

转载 FFmpeg中av_opt_set()的使用

在使用FFmpeg库进行编码的时候,由于需要设置AVCodecContext的参数值,需要使用到av_opt_set()这个函数,该函数被声明在libavutil\opt.h中,用来设置AVOption。这个函数的兄弟成员有:int av_opt_set (void *obj, const char *name, const char *val, int search_flags);int av_opt_set_int (void *obj, const char *name,

2021-05-08 16:53:44 2291

转载 Libevent源码分析-----多线程、锁、条件变量(一)如evthread_use_windows_threads

Libevent提供给用户的可见多线程API都在thread.h文件中。在这个文件提供的API并不多。基本上都是一些定制函数,像前面几篇博文说到的,可以为Libevent定制用户自己的多线程函数。

2021-03-09 16:07:44 207

转载 sscanf 与 sscanf_s的区别

众所周知,使用C语言读取文本,比C++的文件流快的多,而C语言格式化读取最常用、功能最强大的函数是:sscanf。关于sscanf函数的用法,有一篇文章讲解的很详细、很透彻,大家可以查看链接:https://www.jb51.net/article/90495.htm本文主要讲一下与sscanf_s的区别:在vs2010以上平台编写代码时,总是提示sscanf函数不安全,有的时候还会报错,这时候就需要使用sscanf_s函数。如果是进行格式化读取字符串的话,就可能会报错,我就遇到这个问题,耗费了大半

2021-03-03 10:11:05 849 1

原创 strstrip

strstrip函数去掉字符串的开始和结尾的制表符,空格,回车。

2021-03-03 09:26:50 540

转载 windows 创建子进程

windows下想要创建一个子进程不如linux的fork函数来得方便,通过CreateProcess函数创建一个新的进程,函数的定义如下:BOOL CreateProcess( LPCTSTR lpApplicationName, // 应用程序名称 LPTSTR lpCommandLine, // 命令行字符串 LPSECURITY_ATTRIBUTES lpProcessAttributes, // 进程的安全属性 LPSECURITY_ATTRIBUTES lpThreadAttribut

2021-02-25 10:21:38 1503

转载 StartServiceCtrlDispatcher函数

将服务进程的主线程连接到服务控制管理器,这使得线程成为调用进程的服务控制调度程序线程。语法BOOL WINAPI StartServiceCtrlDispatcher( _In_ const SERVICE_TABLE_ENTRY * lpServiceTable);参数lpServiceTable [in]指向SERVICE_TABLE_ENTRY结构数组的指针,该结构包含可在调用进程中执行的每个服务的一个条目。表中最后一个条目的成员必须具有NULL值才能指定表的结尾。返回值如果函数

2021-02-23 15:01:01 541

转载 YUV I420裁剪

废话不对说哈,直接上代码:static void Cut_I420(uint8_t* Src, int x, int y, int srcWidth, int srcHeight, uint8_t* Dst, int desWidth, int desHeight)//图片按位置裁剪 { //得到B图像所在A的坐标 int nIndex = 0; int BPosX = x;//列 int BPosY = y;//行 for (int i = 0; i < desHeigh

2021-01-21 16:27:46 212

转载 创建线程后马上CloseHandle(threadhandle)起什么作用

HANDLE threadhandle = CreateThread(NULL, 0, RecvThreadProc, NULL, NULL, NULL);CloseHandle(threadhandle);不明白为什么创建线程后,要马上把线程的句柄关闭,这样做的目的是什么?这样做会杀掉线程吗?解答:创建线程后返回了线程句柄,新创建的线程内核对象的使用计数是2,一个是线程本身,一个是创建线程的线程,创建线程的线程closehandle后,新的线程的内核对象使用计数为1,当这个新线程结束运行后内核

2021-01-20 11:35:06 271

转载 WebRTC源码分析-线程基础之线程管理

WebRTC源码分析-线程基础之线程管理

2021-01-06 16:31:29 125

转载 WebRTC视频JitterBuffer详解

WebRTC视频JitterBuffer详解1 WebRTC版本2 概要3 JitterBuffer结构和基本流程4 帧完整性 - PacketBuffer4.1 包缓存4.2 帧的开始和结束4.3 插入RTP数据包 - PacketBuffer::InsertPacket4.4 处理RTP填充包 - PacketBuffer::PaddingReceived4.5 丢包检测 - PacketBuffer::UpdateMissingPackets4.6 连续包检测 - PacketBu

2021-01-05 17:41:47 745

转载 Linux下执行xclock命令不能显示时钟图形

在Linux下安装Oracle数据库时,需要用到图形化界面。可以使用xclock命令测试,是否能正常显示图形化安装界面。xclock不能显示时钟vncserver如果报错 command not found,则a.yum install tigervnc-serverb.然后再设置密码c.执行 vncserver2.根据vncserver执行的结果执行以下操作a.export DISPLAY=local:0.0b.echo $DISPLAYc.xhost +d.xclock3.如

2020-12-31 11:04:07 1829

转载 Linux 开机Started Update UTMP

本人使用的opensuse的的gnome桌面,突然有一天发现开机卡死,一开始没觉得什么,当我重启了好几次,终于承认了是系统出问题了。系统在最后提示开始更新有关系统运行级别更改的UTMPsudo yum remove gnome-core gnome-shell gnome-sessionsudo yum install gnome-core gnome-shell gnome-session...

2020-12-22 23:06:54 2338

转载 Centos 进入recovery模式,单用户模式

1、重启服务器,在选择内核界面使用上下箭头移动2、选择内核并按“e”3、找到下面这行4、修改这里要删除掉rhgb quiet,如下图5、使用“ctrl + x” 来重启服务器就可以了,重启后就会进入到recovery模式6、退出单用户命令exec /sbin/init...

2020-12-22 22:54:58 1957

转载 AVFormatContext 结构体分析

这个结构体描述了一个媒体文件或媒体流的构成和基本信息。这是FFMpeg中最为基本的一个结构,是其他所有结构的根,是一个多媒体文件或流的根本抽象。AVFormatContext 是一个结构体  //用于日志记录和avoptions类的引用。由avformat_alloc_context () 赋值。导出(de)muxer私有选项(如果存在的话)  const AVClass *av_class;//输入容器的格式,只有在解封装的时候,由avformat_open_input() 函数赋值  ff_c

2020-12-20 17:21:48 303

转载 int av_image_get_buffer_size(enum AVPixelFormat pix_fmt, int width, int height, int align)

一、int av_image_get_buffer_size(enum AVPixelFormat pix_fmt, int width, int height, int align)函数的作用是通过指定像素格式、图像宽、图像高来计算所需的内存大小重点说明一个参数align:此参数是设定内存对齐的对齐数,也就是按多大的字节进行内存对齐。比如设置为1,表示按1字节对齐,那么得到的结果就是与实际的内存大小一样。再比如设置为4,表示按4字节对齐。也就是内存的起始地址必须是4的整倍数。二、av_image_a

2020-12-20 15:55:25 1178

转载 TCP/UDP报文的最大负载和报文的最小长度

以太网最大传输单元(MTU)以太网的最大数据帧1518Bytes,以太网的帧头14Bytes,帧尾校验4Bytes以太网最大传输单元(MTU):1518B - 14B - 4B = 1500Bytes以太网最小MTU是576BytesInternet上的标准MTU值为576字节TCP数据包每次能够传输的最大量(MSS)MSS就是TCP数据包每次能够传输的最大量。为了达到最佳的传输效能,TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的,默认是536Bytes。发送大于M

2020-11-28 19:07:04 3210 1

转载 TCP粘包,UDP不存在粘包问题

在socket网络程序中,TCP和UDP分别是面向连接和非面向连接的。因此TCP的socket编程,收发两端(客户端和服务器端)都要有一一成对的socket,因此发送端为了将多个发往接收端的包,更有效的发到对方,使用了优化方法(Nagle算法),将多次间隔较小且数据量小的数据,合并成一个大的数据块,然后进行封包。这样接收端就难于分辨出来了,必须提供科学的拆包机制。对于UDP,不会使用块的合并优化算法,这样实际上目前认为,是由于UDP支持的是一对多的模式,所以接收端的skbuff(套接字缓冲区)采用了链式结构

2020-11-28 13:45:06 233

转载 理解画面卡顿,花屏,音视频同步等

很多刚接触ffmpeg的人,遇到推流时画面卡顿,就会头疼,为什么卡,是不是我音视频没同步啊,代码哪里出问题等等。所以我们一定要理解卡顿是什么原因造成的,要理解什么情况下才需要做音视频同步,什么时候需要控制推流速度,理解花屏是什么原因引起的,更远一点,什么时候用队列,什么时候用多线程。一、首先要明白一个很重要的一点,音视频同步是播放端在处理的逻辑。你做的是什么,你是做推流,还是在做播放器。你做推流端只需要保证pts,dts正确,播放器就能音视频同步。音视频同步可以看ffplay.c的实现方式。二、播放

2020-09-27 23:19:59 1200 2

转载 I帧 B帧 p帧 IDR帧的区别

IDR(Instantaneous Decoding Refresh)–即时解码刷新。I帧:帧内编码帧是一种自带全部信息的独立帧,无需参考其它图像便可独立进行解码,视频序列中的第一个帧始终都是I帧。I和IDR帧都是使用帧内预测的。它们都是同一个东西而已,在编码和解码中为了方便,要首个I帧和其他I帧区别开,所以才把第一个首个I帧叫IDR,这样就方便控制编码和解码流程。IDR帧的作用是立刻刷新,使错误不致传播,从IDR帧开始,重新算一个新的序列开始编码。而I帧不具有随机访问的能力,这个功能是由IDR承担。D

2020-09-27 22:27:31 530

转载 MFC学习(四)消息机制

1消息机制的要点:消息队列:先进先出消息循环:通过循环while,不断的从消息队列中取得队首消息,并分发消息。消息处理:根据不同的消息类型做不同的处理事件:事件响应函数2 消息机制tWinMain{// 注册窗口类if(!AppRegisterClass(hInstance)) // hInstance 是应用程序句柄,把这个和winproc注册上。{return (FALSE);}// 初始化应用程序窗口if (!InitInstance (hInstance, nCmdS

2020-09-27 10:36:32 258

转载 QT面试题

1、QT信号的优缺点QT信号槽机制的引用精简了程序员的代码量QT的信号可以对应多个槽(但他们的调用顺序随机),也可以多个槽映射一个信号QT的信号槽的建立和解除绑定十分自由信号槽童真正的回调函数相比时间的损耗还是很大的,所以在嵌入式实时系统中应当慎用信号槽的参数限定很多,例如不能带模板类参数,不能出现宏定义等等2、6. 描述过程,如歌实现一个自定义按钮,使其在光标进入,按下,离开三种状态下显示不同的图片。创建一个类,让其从QPushButton类派生,重写这类中的事件处理器函数ente

2020-09-26 20:26:15 3516

转载 服务器端编程心得(二)—— Reactor模式

书上是这么介绍Reactor模式的:按照这个思路,我写个简单的练习:/** *@desc: 用reactor模式练习服务器程序,main.cpp *@author: zhangyl *@date: 2016.11.23 */ #include <iostream>#include <string.h>#include <sys/types.h>#include <sys/socket.h>#include <netin

2020-09-20 21:52:02 173

转载 服务器端编程心得(一)—— 主线程与工作线程的分工

服务器端为了能流畅处理多个客户端链接,一般在某个线程A里面accept新的客户端连接并生成新连接的socket fd,然后将这些新连接的socketfd给另外开的数个工作线程B1、B2、B3、B4,这些工作线程处理这些新连接上的网络IO事件(即收发数据),同时,还处理系统中的另外一些事务。这里我们将线程A称为主线程,B1、B2、B3、B4等称为工作线程。工作线程的代码框架一般如下:while (!m_bQuit){ epoll_or_select_func(); handle_io_

2020-09-20 21:29:29 197

转载 MP4文件格式解析

目前MP4的概念被炒得很火,也很乱。最开始MP4指的是音频(MP3的升级版),即MPEG-2 AAC标准。随后MP4概念被转移到视频上,对应的是MPEG-4标准。而现在我们流行的叫法,多半是指能播放MPEG-4标准编码格式视频的播放器。但是这篇文章介绍的内容跟上面这些都无关,我们要讨论的是MP4文件封装格式,对应的标准为ISO/IEC 14496-12,即信息技术 视听对象编码的第12部分:ISO 基本媒体文件格式(Information technology Coding of audio-visual

2020-09-20 19:40:31 751

转载 RTP

1、RTP 分析(1)IP是属于网络层部分的,UDP和RTP都是属于传输层部分的。(2)RTP首部V:RTP协议的版本号,占2位,当前协议版本号为2P:填充标志,占1位,如果P=1,则在该报文的尾部填充一个或多个额外的八位组,它们不是有效载荷的一部分。X:扩展标志,占1位,如果X=1,则在RTP报头后跟有一个扩展报头CC:CSRC计数器,占4位,指示CSRC 标识符的个数(作用信源CSRC计数器)M: 标记,占1位,不同的有效载荷有不同的含义,对于视频,标记一帧的结束;对于音频,标记会话的

2020-09-19 21:11:31 236

转载 RTSP/RTP/RTCP之间的关系

一、RTSP/RTP/RTCPRTSP发起/终结流媒体之后,再通过RTP协议传输流媒体数据 ,RTCP对RTP进行控制,同步。既然叫协议就要满足各自的标准,比如各自协议里面的头、参数、步骤(比如RTP步骤包含tcp/udp协议),每一层都有自己的封装,然后发送出去,接收方按照各自协议解析出来RTSP:实时流协议(Real Time Streaming Protocol,RTSP)RTSP的请求主要有DESCRIBE,SETUP,PLAY,PAUSE,TEARDOWN,OPTIONS等,顾名思义

2020-09-19 18:09:24 572

转载 rtmp官方协议详解

标准规范学习:rtmp消息结构,包括几个部分:时戳:4 byte,单位毫秒。超过最大值后会翻转。长度:消息负载的长度。类型ID:Type Id 一部分ID范围用于rtmp的控制信令。还有一部分可以供上层使用,rtmp只是透传。这样可以方便的在rtmp上进行扩展。消息流ID:Message Stream ID,用于区分不同流的消息。两个ID的区别:Message stream:传输消息的逻辑通道。Message stream ID:每个消息都有一个流id,用于指明属于哪个流。Chunk:是

2020-09-18 18:04:11 511

webrtc源码第4部分

webrtc源码第4部分

2024-02-19

webrtc源码第1部分

webrtc源码第1部分

2024-02-19

webrtc源码第6部分

webrtc源码第6部分

2024-02-19

webrtc源码第5部分

webrtc源码第5部分

2024-02-19

webrtc源码第2部分

webrtc源码第2部分

2024-02-19

webrtc源码第3部分

webrtc源码第3部分

2024-02-19

jitterbuffer

jitterbuffer

2022-07-17

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除