自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

万事亨通

好记性不如烂博客

  • 博客(114)
  • 收藏
  • 关注

原创 SDP协议基本分析(RTSP、WebRTC使用)

目录一、介绍二、标准 SDP 规范1. SDP 的格式2. SDP 的结构三、WebRTC 中的 SDP一、介绍SDP(Session Description Protocal)以文本描述各端(PC 端、Mac 端、Android 端、iOS 端等)的能力,这里的能力指的是各端所支持的:音频编解码器是什么,这些编解码器设定的参数是什么使用的传输协议是什么以及包括的音视频媒体是什么等等。例子:v=0o=‐ 3409821183230872764 2 IN IP4 127.0.0.1..

2021-12-23 14:08:37 3607

转载 通俗易懂:快速理解P2P技术中的NAT穿透原理

目录1、基础知识1.1、什么是NAT?1.2、为什么会有NAT?1.3、NAT有什么优缺点?2、NAT的实现方式2.1、静态NAT2.2、NAPT3、NAT的主要类型3.1、完全锥型NAT(Full Cone NAT,后面简称FC)3.2、受限锥型NAT(Restricted Cone NAT)3.3、端口受限型NAT(Port Restricted Cone NAT)3.4、对称型NAT(Symmetric NAT)3.5、小结6、NAT路由类型判断7、STUN协议介绍7.1、STUN基本介绍7.2、ST

2021-12-08 16:05:15 888

转载 P2P技术详解(四):P2P技术之STUN、TURN、ICE详解

目录1、内容概述2、STUN详解2.1 RFC3489/STUN2.1.1 报文结构2.1.2实现原理2.1.3STUN功能举例2.2 RFC5389/STUN2.2.1STUN用途2.2.2报文结构2.3 RFC5389与RFC3489的区别2.4 新特性介绍2.4.1指纹机制2.4.2通过DNS发现服务器机制2.4.3认证和消息完整性机制2.4.4备份服务器机制2.5 RFC5389与RFC3489的兼容2.5.1客户端处理的改变2.5.2服务器处理的改变3、TURN详解3.1 RFC5766/TURN

2021-12-08 15:32:33 944

转载 P2P技术详解(三):P2P中的NAT穿越(打洞)方案详解(进阶分析篇)

目录1、NAT和NAPT2、NAT带来的问题3、P2P通信穿越NAT的技术、方法4、NAT穿越技术1:应用层网关4.1、原理4.2、限制5、NAT穿越技术2:中间件技术5.1、原理5.2、限制6、NAT穿越技术3:打洞技术(Hole Punching)6.1、原理6.2、方法6.2.1NAT行为类型与侦测方法6.2.2NAT打洞过程7、NAT穿越技术4:Relay服务器中转技术7.1、UDP协议的Relay7.1.1方式一、Send and Data methods,具体交互过程如下:7.1.2方式二、ch

2021-12-08 14:53:51 2344

转载 P2P技术详解(二):P2P中的NAT穿越(打洞)方案详解

1、内容概述P2P即点对点通信,或称为对等联网,与传统的服务器客户端模式(如下图“P2P结构模型”所示)有着明显的区别,在即时通讯方案中应用广泛(比如IM应用中的实时音视频通信、实时文件传输甚至文字聊天等)。P2P可以是一种通信模式、一种逻辑网络模型、一种技术、甚至一种理念。在P2P网络中(如右图所示),所有通信节点的地位都是对等的,每个节点都扮演着客户机和服务器双重角色,节点之间通过直接通信实现文件信息、处理器运算能力、存储空间等资源的共享。P2P网络具有分散性、可扩展性、健壮性等特点,这使得P2P技

2021-12-08 13:40:40 1349

转载 P2P技术详解(一):NAT详解——详细原理、P2P简介

1. IPv4协议和NAT的由来今天,无数快乐的互联网用户在尽情享受Internet带来的乐趣。他们浏览新闻,搜索资料,下载软件,广交新朋,分享信息,甚至于足不出户获取一切日用所需。企业利用互联网发布信息,传递资料和订单,提供技术支持,完成日常办公。然而,Internet在给亿万用户带来便利的同时,自身却面临一个致命的问题:构建这个无所不能的Internet的基础IPv4协议已经不能再提供新的网络地址了。2011年2月3日中国农历新年, IANA对外宣布:IPv4地址空间最后5个地址块已经被分配给下属的

2021-12-06 13:58:30 3318

原创 RTSP协议基本分析

目录一、介绍二、RTSP与HTTP三、RTSP推流过程1、OPTION 查询服务器端可用方法2、ANNOUNCE 发送媒体描述信息3、SETUP建立RTSP会话一、介绍RTSP(Real-Time Stream Protocol )是一种基于文本的应用层协议,在语法及一些消息参数等方面,RTSP协议与HTTP协议类似。RTSP被用于建立的控制媒体流的传输,它为多媒体服务扮演“网络远程控制”的⻆色。尽管有时可以把RTSP控制信息和媒体数据流交织在一起传送,但一般情况RTSP本身并不用于转送媒体流数

2021-12-01 22:55:50 2819

原创 RTP协议基本分析(RTSP、WebRTC使用)

介绍:实时流传输协议(RTSP:Real Time Streaming Protocol)是一种网络传输协议,旨在发送低延迟流。该协议由RealNetworks,Netscape和哥伦比亚大学的专家在1996年开发。它定义了应如何打包流中的数据以进行传输。RTP:RTP协议原理,负责对流媒体数据进行封包并实现媒体流的实时传输,即它按照RTP数据包格式来封装流媒体数据,并利用与它绑定的协议进行数据包的传输。RTP可以基于UDP和TCP两种方式传输,两种方式大致是一样的,下面主要都是基于UDP的分

2021-11-20 21:31:38 5480

转载 RTMP代理的协议规范(RtmpProxy)

RtmpProxy关于RTMP代理的协议规范。RTMP是字节协议,第一个包是c0,1个字节,一般是03表示是明文的RTMP。所以如果需要做RTMP代理,如果直接转发RTMP客户端的消息,是没法传递额外的信息的,譬如HTTP代理在Header中传递的X-Real-IP,即客户端的IP,就没法给RTMP的后端了。因此,RTMP的Proxy协议必须使用私有协议,c0的意义必须改写了,譬如另外一个值表示是代理,后面跟随了一些协议信息,这个协议就是RTMP Proxy协议。Protocol使用网络字节序,bi

2021-11-08 23:09:55 514

原创 srs rtmp从监听到接收到新连接的过程分析

:分析srs从启动开始的main入口开始。分析rtmp监听端口,然后到接收到新rtmp连接的过程分析。一、流程图二、代码分析1、srs_main_server.cpp:main()2、srs_main_server.cpp:do_main()3、srs_main_server.cpp:run()4、srs_main_server.cpp:run_master()5、srs_app_server.cpp: SrsServer::initialize_st()6、srs_serv

2021-11-07 23:03:24 2637

转载 使用FD_CLOEXEC实现close-on-exec,关闭子进程无用文件描述符

我们经常会碰到需要fork子进程的情况,而且子进程很可能会继续exec新的程序。这就不得不提到子进程中无用文件描述符的问题!fork函数的使用本不是这里讨论的话题,但必须提一下的是:子进程以写时复制(COW,Copy-On-Write)方式获得父进程的数据空间、堆和栈副本,这其中也包括文件描述符。刚刚fork成功时,父子进程中相同的文件描述符指向系统文件表中的同一项(这也意味着他们共享同一文件偏移量)。接着,一般我们会调用exec执行另一个程序,此时会用全新的程序替换子进程的正文,数据,堆和栈等。此时

2021-11-06 21:34:33 246

原创 srs配置文件分析

配置文件中的每一项都是一个SrsConfDirective对象。例子:vhost1、 整个vhost 是一个SrsConfDirective对象。1.1、名字:std::string name = vhost1.2、参数:std::vectorstd::string args第0个值 = defaultVhost1.3、子SrsConfDirective:后面整个{}内表示vhost 这个SrsConfDirective还有包含一个数组的SrsConfDirective。(std::vect.

2021-11-02 23:13:08 1498

转载 如何获取ubuntu源码包里面的源码进行编译

如何获取ubuntu源码包里面的源码进行编译1、在获取源码包之前,确保在软件源配置文件/etc/apt/sources.list中添加了deb-src项2、使用如下命令获取xxx源码包的详细信息: sudo apt-cache showsrc xxx 这用来查询当前镜像站点中是否有该源码包。3、源码包中通常包含3个文件,分别以dsc,orig.tar.gz和diff.gz为后缀名。 sudo apt-get source xxx 命令来获取源码包,它会将源码包下载到用户当前目

2021-08-20 21:41:00 1015

转载 fsync与fflush的关系和区别

read/write/fsync与fread/fwrite/fflush的关系和区别read/write/fsync:linux底层操作;内核调用, 涉及到进程上下文的切换,即用户态到核心态的转换,这是个比较消耗性能的操作。fread/fwrite/fflush:c语言标准规定的io流操作,建立在read/write/fsync之上在用户层, 又增加了一层缓冲机制,用于减少内核调用次数,但是增加了一次内存拷贝。两者之间的关系,见下图:补充:对于输入设备,调用fsync/fflush将清空

2021-08-03 22:43:35 2963

转载 缓冲文件系统(fopen/fread/fwrite)和非缓冲文件系统(open/read/write)

open:系统调用,返回的是文件描述符,即文件句柄,是文件在文件描述副表里的索引。fopen:C语言库函数,返回的是一个指向文件结构的指针。fopen是ANSI C标准中的C语言库函数,在不同的操作系统中应该调用不同的内核API,UNIX环境下,fopen是对open的封装。文件描述符是UNIX/Linux下的一个概念,Linux环境下,一切设备皆是文件,一切设备皆是以文件的形式进行操作,如网络套接字、硬件设备等。设备文件不可以当成流式文件来处理,因此,只能使用open,而fopen只是用来操纵正规文

2021-08-03 22:35:11 2294

转载 read/fread write/fwrite 的区别

fread就是通过read来实现的,fread是C语言的库,而read是系统调用。差别在read每次读的数据是调用者要求的大小,比如调用者要求读取10个字节数据,read就会从内核缓冲区(操作系统开辟的一段空间用来存储磁盘上的数据)读10个字节数据到数组中,所以每次调用read会涉及到用户态与內核态之间的切换从而损耗一定的性能。而fread不一样,为了加快读的速度,fread每次都会从内核缓冲区读比要求更多的数据,然后放到应用进程缓冲区(首地址存在FILE结构体中),这样下次再读数据只需要到应用进程缓冲区

2021-08-03 22:31:01 570

原创 ffmpeg 使用ffplay 进行 hls 拉流 分析 1

ffmpeg 使用 ffplay 进行 hls 拉流 分析(未完)流程图:

2021-07-11 21:53:34 1015

转载 零拷贝、mmap、sendfile

目录零拷贝mmapsendFile总结零拷贝要了解零拷贝,首先得先了解一下传统 IO 的执行流程,这里举个例子,通过传统的 IO 进行网络传输来传输一个文件。先上一张图,这张图就代表了传统 IO 传输文件的流程。读取文件的时候,会从用户态切换为内核态,同时基于 DMA 引擎将磁盘文件拷贝到内核缓冲区。看到这里,可能你就已经懵逼了,什么是用户态和内核态,什么是 DMA 拷贝,我用大白话解释一下首先用户态其实就是 CPU 在执行你的代码,而内核态呢,其实就是你没有那个权限去操作硬件,所以只能交给系

2021-05-27 22:46:45 210

转载 RAID磁盘阵列

目录综述1、RAID02、RAID13、RAID54、RAID65、RAID10综述在单机时代,采用单块磁盘进行数据存储和读写的方式,由于寻址和读写的时间消耗,导致I/O性能非常低,且存储容量还会受到限制。另外,单块磁盘极其容易出现物理故障,经常导致数据的丢失。因此大家就在想,有没有一种办法将多块独立的磁盘结合在一起组成一个技术方案,来提高数据的可靠性和I/O性能呢。在这种情况下,RAID技术就应运而生了。一、RAID 是什么?RAID ( Redundant Array of Independe

2021-05-26 23:02:53 151

原创 hls协议分析

1、简介1.1、 综述作为 Apple 提出的一种基于 HTTP 的协议,HLS(HTTP Live Streaming)用于解决实时音视频流的传输。尤其是在移动端,由于 iOS /H5 不支持 flash,使得 HLS 成了移动端实时视频流传输的首选。HLS经常用在直播领域,一些国内的直播云通常用 HLS 拉流(将视频流从服务器拉到客户端)。 HLS 值得诟病之处就是其延迟严重,延迟通常在 10-30s 之间。HLS(HTTP Live Streaming) 把整个流分成一个个小的基于 HTT

2021-05-21 23:02:38 1308 3

原创 librtmp分析(接收数据包处理)

RTMP详细分析(三次握手)RTMP详细分析(Message 消息,Chunk分块)librtmp分析(发送数据包处理)rtmp协议中的message的接收涉及有message 组合多个chunk、相对时间戳计算绝对值。分析一下librtmp库中的int RTMP_SendPacket(RTMP *r, RTMPPacket *packet, int queue)函数可以更好的理解。目录1、刚开始接收一个字节的判断Basic Header占用多少个字节,获取fmt、csid。2、申请用来保存上一次

2021-05-13 23:11:27 360

原创 librtmp分析(发送数据包处理)

rtmp协议中的message的发送涉及有message 分chunk、base header长度的变化、message header长度的变化,只查看文档比较难理解,分析一下librtmp库中的int RTMP_SendPacket(RTMP *r, RTMPPacket *packet, int queue)函数可以更好的理解。目录注意:Packet 内部分配的注意事项1、申请用于保存上一次发送的packet的信息的空间。2、根据判断message header的长度的标识m_headerType,再

2021-05-09 22:13:01 385

原创 使用sshfs挂载linux远程服务器目录到windows

目录下载winfsp 和 sshfs-win使用方式1、添加连接2、连接3、其他操作修改:删除:下载winfsp 和 sshfs-win前往 github 对应项目的 release 中下载最新版本:sshfs-win:https://github.com/billziss-gh/sshfs-win/releaseswinfsp:https://github.com/billziss-gh/winfsp/releasesSSHFS-Win Manager:https://github.com/ev

2021-05-01 11:27:58 771

转载 linux文件存储、inode、硬链接、软链接

文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 sector组成一个block。文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的

2021-04-28 21:26:20 132

原创 rtmp协议分析(Message 消息,Chunk分块)

RTMP详细分析(三次握手)目录1、Message(消息)2、Chunking(Message 分块)2.1、 Basic Header(基本的头信息)2.1.1、Basic Header为1个字节时2.1.2、Basic Header为2个字节时2.1.3、Basic Header为3个字节时2.2、Message Header(消息的头信息)2.2.1、Type(fmt) = 0:占用11个字节2.2.2、Type(fmt) = 1:占用7个字节2.2.3、Type(fmt) = 2:占用3个字节2.

2021-04-24 16:42:34 2117 1

转载 关于Makefile,Makefile.in,Makefile.am,Configure功能及相互关系的问题

makefile写法在 Unix 上写程式的人大概都碰过 Makefile,尤其是用 C 来开发程式的人。用 make来开发和编译程式的确很方便,可是要写出一个 Makefile就不简单了。偏偏介绍 Makefile 的文件不多,GNU Make 那份印出来要几百页的文件,光看完 Overview 就快阵亡了,难怪许多 人闻 Unix 色变。本文将介绍如何利用 GNU Autoconf 及 Automake 这两套软体来协助我们『自动』产生 Makefile 档,并且让开发出来的软体可以像 Apache

2021-04-23 08:17:17 1189

原创 rtmp协议分析(三次握手)

RTMP协议是Real Time Message Protocol(实时信息传输协议)的缩写,它是由Adobe公司提出的一种应用层的协议,用来解决多媒体数据传输流的多路复用(Multiplexing)和分包(packetizing)的问题。随着VR技术的发展,视频直播等领域逐渐活跃起来,RTMP作为业内广泛使用的协议也重新被相关开发者重视起来。目录1、介绍:2.1、握手:2.2、握手过程:3.1 、C0和S0格式(简单握手):3.2 、C1和S1格式(简单握手):3.3 、C2和S2格式(简单握手)

2021-04-22 21:38:28 1001

原创 搭建srs服务器(rtmp)

配置srs服务器(rtmp)目录:1、下载srs源码(从码云上):2、 切换到srs.oschina:3、 这里使用3.0版本:4、 切换到trunk:5、 编译:6、 启动:7、查看日志输出:8、使用ffmpeg 推流:9、使用ffplay拉流:srs(Simple Realtime Server)是一个简单高效的实时视频服务器,支持RTMP/WebRTC/HLS/HTTP-FLV/SRT/GB28181/RTSP。1、下载srs源码(从码云上):git clone https://gitee.c

2021-04-17 12:14:04 1333

原创 ijkplayer 消息循环处理过程分析

ijkplayer 消息循环处理过程分析简介一、消息队列初始化1、 initWithContentURLString函数2、 ijkmp_ios_create函数3、 ijkmp_create函数二、消息队列的消息循环处理函数启动1、prepareToPlay函数2、ijkmp_prepare_async函数3、ijkmp_prepare_async_l函数4、ijkmp_msg_loop函数三、消息循环处理1、 media_player_msg_loop消息循环函数2、 ijkmp_get_msg函数3、

2021-03-03 08:53:32 388

原创 ffplay分析 (seek操作处理)

《ffplay的数据结构分析》《ffplay分析(从启动到读取线程的操作)》《ffplay分析(视频解码线程的操作)》《ffplay分析(音频解码线程的操作)》《ffplay 分析(音频从Frame(解码后)队列取数据到SDL输出)》《ffplay分析 (视频从Frame(解码后)队列取数据到SDL输出)》《ffplay分析 (音视频同步:主时钟为音频)》《ffplay分析 (暂停 / 播放处理)》《ffplay源码(版本:ffmpeg-4.2.1)》ffplay分析 (seek操作处理)

2021-02-04 17:06:55 1353 2

原创 ffplay分析 (暂停 / 播放处理)

《ffplay的数据结构分析》《ffplay分析(从启动到读取线程的操作)》《ffplay分析(视频解码线程的操作)》《ffplay分析(音频解码线程的操作)》《ffplay 分析(音频从Frame(解码后)队列取数据到SDL输出)》《ffplay分析 (视频从Frame(解码后)队列取数据到SDL输出)》《ffplay分析 (音视频同步:主时钟为音频)》《ffplay源码(版本:ffmpeg-4.2.1)》ffplay分析 (暂停 / 播放处理)一、分析:1、refresh_loop_wa

2021-02-03 10:20:08 755 1

原创 ffplay分析 (视频从Frame(解码后)队列取数据到SDL输出)

《ffplay的数据结构分析》《ffplay分析(从启动到读取线程的操作)》《ffplay分析(视频解码线程的操作)》《ffplay分析(音频解码线程的操作)》《ffplay 分析(音频从Frame(解码后)队列取数据到SDL输出)》《ffplay源码(版本:ffmpeg-4.2.1)》一、分析:1、main():在main()函数开始时有创建SDL窗口的处理2、read_thread():开启读取线程后,在read_thread()读取数据线程中设置视频流时调用set_default_w

2021-01-28 16:20:36 378 1

原创 ffplay 分析(音频从Frame(解码后)队列取数据到SDL输出)

《ffplay的数据结构分析》《ffplay分析(从启动到读取线程的操作)》《ffplay分析(视频解码线程的操作)》《ffplay分析(音频解码线程的操作)》《ffplay源码(版本:ffmpeg-4.2.1)》ffplay 分析(音频从Frame(解码后)队列取数据到SDL输出)一、分析:1、audio_open():设置期望使用到SDL的音频参数2、audio_open():使用期望的音频打开SDL设备3、audio_open():判断打开SDL设备后参数的变化4、audio_open():

2021-01-24 18:56:07 378 2

原创 ffplay分析(音频解码线程的操作)

《ffplay的数据结构分析》《ffplay分析(从启动到读取线程的操作)》《ffplay分析(视频解码线程的操作)》《ffplay源码(版本:ffmpeg-4.2.1)》ffplay分析(音频解码线程的操作)一、分析:1、stream_component_open():开启音频解码线程audio_thread()2、audio_thread():解码前分配AVframe工作3、audio_thread():调用decoder_decode_frame()获取解码后的一帧数据4、audio_thr

2021-01-22 23:21:59 399

原创 ffplay源码(版本:ffmpeg-4.2.1)

ffplay源码(版本:ffmpeg-4.2.1)/* * Copyright (c) 2003 Fabrice Bellard * * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the

2021-01-22 23:19:34 1360

原创 ffplay分析(视频解码线程的操作)

《ffplay的数据结构分析》《ffplay分析(从启动到读取线程的操作)》ffplay分析(视频解码线程的操作)一、分析:1、stream_component_open():开启视频解码线程video_thread()2、video_thread():初始化timebase和framerate操作3、video_thread():调用get_video_frame()得到解码完成的一帧数据4、get_video_frame():调用decoder_decode_frame()得到解码后一帧数据5、de

2021-01-22 16:46:23 1414 3

原创 ffplay分析(从启动到读取数据线程插入到字幕、音频、视频解码前的队列操作)

ffplay从启动到读取线程的操作分析一、分析:1、main():初始化ffmpeg2、main():ffplay 命令行参数的解析处理3、main():SDL初始化4、main():解码器的冲刷Packet初始化5、main():SDL创建窗口6、main():打开各种流并且启动读取数据线程7、stream_open():分配VideoState保存文件名8、stream_open():初始化Frame队列(解码后)/Packet队列(解码前),初始化用于控制读取线程休眠的条件变量9、stream_ope

2021-01-21 17:17:39 2654 2

原创 C++11 右值引用与常量左值引用保存临时变量(函数返回值)的底层分析

右值引用保存临时变量(函数返回值)的问题结论:无论是用右值引用还是普通变量保存返回值,最终在函数返回时都是通过eax保存的。区别在于:1、普通变量:就直接将eax赋值给普通变量2、右值引用:就将eax的值放到另一个位置(临时变量),然后再将这个位置的地址赋值到右值引用上。(所以函数返回值的临时变量不是一直存在的,要看返回时用什么类型的变量来接收)...

2021-01-20 11:23:47 1581

原创 C++11 std::shared_ptr的std::move()移动语义底层分析

std::shared_ptr的std::move()移动语义底层分析执行std::move()之前:执行std::move()之后:结论:sizeof(std::shared_ptr) = 8字节pss1 : 0x0028fea8pss2 : 0x0028fea0观察执行std::move前,pss1 : 0x0028fea8 开始的8个字节的值,然后执行后 pss1 : 0x0028fea8开始的8个字节的值复制到 pss2 : 0x0028fea0 后,清零pss1 : 0x0

2021-01-19 19:59:44 4493

原创 ffplay的数据结构分析

ffplay的数据结构分析struct VideoState(ffplay中最大的一个封装结构,所有信息被包含在内)struct Clock(时间封装)struct MyAVPacketList(解码前数据,PacketQueue的一个节点)struct PacketQueue(解码前的Packet队列)struct Frame(解码后数据,FrameQueue队列的元素)struct FrameQueue(解码后的Frame队列)struct AudioParams(音频参数)struct Decoder

2021-01-19 15:31:13 602 1

空空如也

空空如也

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

TA关注的人

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