音视频 tcp
fantasy_arch
这个作者很懒,什么都没留下…
展开
-
ffmpeg 解析媒体流时间戳回绕
一 拿flv/rtmp为例,时间戳用4字节表示,最大范围约是42亿。二 遇到问题,在rtmp推流过程中,有些服务器会在推流断开之后,hold住连接一段时间。这样一来就会存在续时间戳的问题,有的服务器没有管时间戳,直接透传的。这样一来就会有个问题,rtmp传输的时候,传输的是相对时间戳,回退的时间戳会被计算成负值。当然也有服务器通过发送绝对时间戳来避开这个问题。在实际项目中,遇到这样的问题,使用公司自研的rtmp服务器,偶尔会出现时间戳超过了32bit表示的最大范围,这就奇怪了。..原创 2021-03-24 23:22:00 · 1429 阅读 · 0 评论 -
引入ffmpeg编译错误taking address of temporary array
libavutil/error.h:120:95: 错误:taking address of temporary array av_make_error_string((char[AV_ERROR_MAX_STRING_SIZE]){0}, AV_ERROR_MAX_STRING_SIZE, errnum)这里使用了的临时变量作为返回值,因此报错。把这个宏定义改为一个函数,就可以避免这个报错inline char * av_err2str(int errnum){ cha...原创 2021-01-05 20:20:09 · 4517 阅读 · 2 评论 -
x264码率控制-帧duration计算
在编码器中,码率控制有两个重要的参数,1 时间基准 2 当前帧时间戳一 为什么需要这两个因为编码器的码率控制是以时间s为单位的,比如1000kbps,意思是1s有1000kbits的数据量,然后在编码器中并没有时间的概念,只有时间基准和时间戳,这两个合并可以计算出来时间,所以编码器的码率控制都是以这两个参数为基础计算出来的。时间基准:很多编码器设置的都是1/fps, 但是也有时候需要直接传入ms为单位的帧pts,这样的话,时间基准就需要设置为1/1000, 还有如果像ts/mp4格.原创 2020-11-23 17:53:52 · 1092 阅读 · 0 评论 -
bbr浅析
前面一节讲了tcp拥塞控制算法cubic,tcp拥塞控制的弊端,1 在窗口增长的时候,是盲目的,增长到一定值,然后回调到1,然后快速恢复到ssthresh水平,然后慢启动2 cubic发送数据包的时候,一次性发给路由器,容易造成路由器队列堆满,抖动的问题,rtt会抖动bbr 解决的问题1 带宽预测,预测方法很简单,从发出去当前这个分组,到收到这个分组的ack,期间又发出去了多少数据,认为是实际带宽值。2 统计最小rtt,最小rtt说明这个网络有这个传输能力。3 计算BDP = .原创 2020-05-09 17:01:24 · 1143 阅读 · 0 评论 -
TCP拥塞控制算法,以及长肥管道
linux内核里面拥塞控制算法比较多,目前大部分用的cubic算法。在内核里面代码是怎样实现的呢?static struct tcp_congestion_ops cubictcp __read_mostly = { .init = bictcp_init, 初始化 .ssthresh = bictcp_recalc_ssthresh, 更新tcp的ssthresh值 .cong_avoid = bictcp_cong_avoid, 重新...原创 2020-05-08 20:02:04 · 654 阅读 · 0 评论 -
tcp tw_cycle和tcp_timestamp
在TCP可选项字段中为TCP预留有时间戳功能1 TCP可选项格式kind(1字节) length(1字节) info tcp 选项格式1 tcp报文格式:由tcp 首部和tcp数据组成2 tcp首部:由20字节的固定长度和可变长字段组成3 tcp首部总长度:由tcp头中的数据偏移字段决定,该字段占4bit,取最大的1111时,也就是十进制15,tcp首部的偏移单位为4...原创 2019-05-06 20:42:39 · 474 阅读 · 0 评论 -
x264中的空闲帧,参考帧队列管理
先直接从更新参考帧的位置看起,这里的操作是最为复杂的地方static inline int reference_update( x264_t *h ){ if( !h->fdec->b_kept_as_ref )//如果帧不被当做参考帧 { if( h->i_thread_frames > 1 ) { ...原创 2018-11-28 16:11:13 · 1066 阅读 · 2 评论 -
hls多码率
一 单码率m3u8单码率只有一层播放切片列表文件,如下:#EXTM3U : 每个M3U文件第一行必须是这个tag。#EXTINF : 指定每个媒体段(ts)的持续时间,这个仅对其后面的URI有效,每两个媒体段URI间被这个tag分隔开,其格式如下:#EXTINF:,? : duration表示持续的时间(秒)”Durations MUST be integers if the prot原创 2018-03-22 09:02:47 · 2486 阅读 · 0 评论 -
nginx-rtmp内网回源架构
一 需求问题外网服务器接受客户端的hls回放请求,希望能通过外网服务器回源内网的录制机上的录像文件。二 问题点(1)内网录制机如何主动连接外网服务器(2)外网服务器如何标识和内网录制机的连接(3)连接断开后,如何找回 三 实现方案Hls回放请求响应流程(1) 内网录制机和CMS建立常连接(2) 外网CMS服务器接受客户端的hls回放请求(3)原创 2018-03-22 09:00:31 · 1076 阅读 · 0 评论 -
x264码率控制
一 码率控制性实际上h264标准并没有码率控制这一块内容,也就是说这个是x264自己实现的,和h264无关。当然我们自己也可以实现一种码率控制算法来控制编码码率。二 x264码率控制x264码率控制主要分为三种ABR = average bitrate平均码率,编码出来的视频码率在一个恒定值左右波动CRF=constant Rate Factor 缺省值23,恒定质量编原创 2018-03-19 20:55:41 · 574 阅读 · 0 评论 -
darwin服务器大量出现close_wait
一 我们先来复习一下tcp的11种状态机以及相应的应用层函数1 closed 已经完全关闭的状态2 listen 监听状态,一般指监听socket listen3 syn send 发送了syn 连接请求之后,还没有收到应答前。 connect4 syn recved,收到了syn数据包,但是还未回应syn + ack的时候 connect5 establish tcp三次握手完成之后6...原创 2017-12-10 02:17:45 · 328 阅读 · 0 评论 -
linux内核接收网络数据流程(四)
已经进行到这里,接下来需要讲的就是tcp的recv如何读取到内核的数据的了。一 先看看struct sock的缓存队列sk_receive_queue,这个队列就是内核的软中断上下文和进程空间的tcp_recvmsg(应用层调用tcp_recv)之间通信的队列。因此,我们只需要找到哪里写队列,哪里读队列的就好了。二 继续上一节的软中断上下文处理tcp_v4_rcv()//主要流程{//如果失败,直...原创 2017-10-31 19:34:59 · 629 阅读 · 0 评论 -
linux内核接收网络数据流程(一)
一 要实现一个高效的流媒体服务器,离不开一个高效的网络协议栈,目前流媒体服务器大多是基于tcp/udp的,我们可以从tcp/udp入手,逐渐深入,甚至开发自己的流媒体协议栈。二 tcp 的三个接收队列 1 prequeue在linux内核中,每一个网络数据包,都被切分为一个个的skb,这些skb先被内核接收,然后投递到对应的进程处理,进程把skb拷贝到本tcp连接的sk_receive_queu...原创 2017-10-26 11:09:29 · 988 阅读 · 0 评论 -
linux内核接收网络数据流程(三)
一 前面一节我们讲了skb通过事件通知到了软中断处理,最终调用deliver_skb分发出去skb,注意deliver_skb调用这里是一个循环,list_for_each_entry_rcu ,netfilter模块就是这里调用的,因此可以知道,抓包工具等对socket读写是没有影响的,这里浅拷贝了一份skb到netfilter模块当实参传递的。而读写socket是更上层的调用,不属于同一个模块...原创 2017-10-31 10:16:58 · 1236 阅读 · 0 评论 -
linux内核接收网络数据流程(二)
以DM9000网卡为例,剖析从网卡硬件中断开始,直到tcp、udp应用层读取到数据的过程一 DM9000网卡驱动(这里我们仅仅分析最主要的流程,具体驱动程序可以自行阅读)static struct platform_driver dm9000_driver = {.driver = {.name = "dm9000",.pm = &dm9000_drv_pm_ops,....原创 2017-10-30 19:51:48 · 611 阅读 · 0 评论