自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(34)
  • 收藏
  • 关注

原创 基于nginx-rtmp-module模块实现的HTTP-FLV直播模块nginx-http-flv-module(四)

nginx-http-flv-module 的两个更新记录。

2023-01-12 23:52:08 359

原创 nginx-rtmp-module 的缺陷分析(四)

Nginx一般情况下都是以多进程方式(一个 master 进程和多个 worker 进程)运行的,但是nginx-rtmp-module模块对多进程方式的支持很不成熟。前面的文章提到过以多进程方式运行 Nginx 时,由于nginx-rtmp-module 本身不支持 Vhost 功能,再加上它使用 Unix domain socket(没有端口信息)转发媒体流到其他的 worker 进程,导致其他的 worker 进程无法知道转发的媒体流需要匹配的是哪个 server 配置。Nginx 从...

2021-01-17 00:42:20 493

原创 在nginx-http-flv-module中支持H.265(HEVC)

众所周知,FLV规范不支持H.265,并且近年来各大浏览器都逐渐不支持Flash,Adobe也宣布到2020年底不再支持Flash。作为FLV相关技术的所有者,Adobe估计也没动力更新规范来支持H.265;外加H.265标准的一些专利所有者的授权方案被指抢钱,更加打击了很多软件厂商的积极性。从H.265标准出来没多久,就有人请求Adobe在FLV规范中加入对H.265的支持:https:...

2019-09-23 21:58:06 8297 6

原创 高性能流媒体服务器nginx-http-live-module

nginx-rtmp-module实现了开创性的工作,但是,实际上它的完成度并不高,缺少的功能和很多缺陷在前面的文章中已有提及。如果要在实际生产环境中使用,必须进行大量的修改。 nginx-http-flv-module部分解决了一些问题,由于我自身有些知识和测试环境所限,有些问题的解决周期很长甚至无法解决。不管怎样,nginx-http-flv-module能成...

2019-06-25 13:59:46 11095 4

原创 nginx-rtmp-module的缺陷分析(三)

VHOST(虚拟主机)就是一址多域的意思,主流的Web服务器都有这个功能,它解决了运行Web的主机在同一个IP地址情况下可以为不同域名的请求提供服务的问题。假设有两个域名A和B,在DNS上A和B都指向同一个A记录(IPv4)或者AAAA记录(IPv6),Web服务器通过不同的域名信息解析到不同的配置,从而为A和B提供不同的服务。Nginx根据请求的信息(端口,IP地址和域名)匹配到对应的配置的大概...

2019-05-11 22:42:03 2326

原创 nginx-rtmp-module的缺陷分析(二)

nginx-rtmp-module使用指令push和pull来relay媒体流数据,以便分布式部署服务。当nginx-rtmp-module作为边缘服务器(一般不会向边缘服务器推流)时,使用pull从源服务器获取媒体流数据,俗称“回源”。先看原理图:注意:上图是单进程模式的pull回源图。可以看出,多个连接请求同一个媒体流(RTMP的URL格式为:rtmp://host[:port]/...

2019-04-24 16:18:52 3464 2

原创 nginx-rtmp-module的缺陷分析

Arut最初在开发nginx-rtmp-module的时候只实现了单进程模式,好处是架构简单,推送和播放,数据统计,流媒体控制等都在一个进程上完成。但是这显然浪费了Nginx多进程(在Linux和FreeBSD平台上每个进程都可以绑定一个CPU核心,以减少进程切换带来的开销)的处理能力。但是,如果开启多进程模式,推送和播放如果不在同一个进程上,会造成播放失败的问题:另外,请求数据统计信息也...

2019-04-14 11:41:35 3118 1

原创 基于nginx-rtmp-module模块实现的HTTP-FLV直播模块nginx-http-flv-module(三)

接上一篇《基于nginx-rtmp-module模块实现的HTTP-FLV直播模块nginx-http-flv-module(二)》内容。 项目地址:https://github.com/winshining/nginx-http-flv-module,欢迎大家下载测试,返回bug和提交PR。2018-10-28:现在nginx-htt-flv-module还...

2018-08-08 17:58:06 11078 21

原创 基于nginx-rtmp-module模块实现的HTTP-FLV直播模块nginx-http-flv-module(二)

由于《基于nginx-rtmp-module模块实现的HTTP-FLV直播模块nginx-http-flv-module(一)》内容已经很长,所以后续的更新将记录在这儿。非常感谢网友们的测试反馈和代码提交!项目地址:https://github.com/winshining/nginx-http-flv-module。有问题或者建议,可以加Q群:711969608详聊。目前已经有很多个...

2018-03-09 01:50:41 39376 39

原创 基于nginx-rtmp-module模块实现的HTTP-FLV直播模块nginx-http-flv-module(一)

本文后续的内容将在这里更新:《基于nginx-rtmp-module模块实现的HTTP-FLV直播模块nginx-http-flv-module(二)》。注意:下文的配置很多已经不能用了,因为现在的实现跟早期的实现相差有点大。而为了看到整个项目的变迁史,所以保留了下来,下文的更新中提到了为什么有些配置项不能再使用的原因。现在使用的配置可查找下文中的README.CN.md。另外,除非你...

2018-02-07 22:23:29 58628 95

转载 I帧,P帧和B帧以及DTS和PTS的关系

基本概念:I frame:帧内编码帧,又称intra picture,I 帧通常是每个 GOP(MPEG 所使用的一种视频压缩技术)的第一个帧,经过适度地压缩,做为随机访问的参考点,可以当成图象。I帧可以看成是一个图像经过压缩后的产物。P frame:前向预测编码帧,又称predictive-frame,通过充分将低于图像序列中前面已编码帧的时间冗余信息来压缩传输数据量的编码图像,

2017-05-19 18:52:01 645

转载 如何从海量日志中提取访问最多的10个IP

算法思想:分而治之+Hash 1、IP地址最多有2^32=4G种取值情况,所以不能完全加载到内存中处理; 2、可以考虑采用分而治之的思想,按照IP地址的Hash(IP) % 1024值,把海量IP日志分别存储到1024个小文件中,这样,每个小文件最多包含4MB个IP地址;这里解释一下为什么用Hash(IP) % 1024值,如果不用,而直接分类的话,可能会出现这样一种情况,就是有个IP在每个小文件

2017-05-19 15:22:17 4445

转载 SPS/PPS/IDR

H.264码流第一个 NALU 是 SPS(序列参数集Sequence Parameter Set)对应H264标准文档 7.3.2.1 序列参数集的语法进行解析H.264码流第二个 NALU 是 PPS(图像参数集Picture Parameter Set)对应H264标准文档 7.3.2.2 序列参数集的语法进行解析H.264码流第三个

2017-05-15 22:54:03 988

原创 支持POST方式的webbench

webbench是一款轻量级的web服务器压力测试工具,目前网上能找到的最新版本是webbench-1.5,原作者已经于2004年停止维护。        webbench采用一个父进程fork出多个子进程的方式对目标服务器器发起访问,指定时间超时后,将计算的结果汇总后发送给父进程。webbench-1.5只支持GET,HEAD,TRACE和OPTION方式的测试,我在webbench-1.5

2017-03-16 14:24:24 3872 1

原创 加载动态链接库的相关接口dlopen,dlsym和dlclose等

nginx从1.9.11开始,支持运行时动态加载模块了,浏览了下代码实现,在类unix系统上是用dlopen,dlsym和dlclose实现的。下面看看这几个函数的功能。  dlopen功能:打开一个动态链接库。包含头文件:#include 函数定义:void * dlopen(const char * pathname, int mode); 函数描述:

2017-03-14 16:55:36 928

原创 对nginx上传文件的第三方实现nginx-upload-module的修改

        nginx官方推荐的第三方上传模块nginx-upload-module在nginx-1.3.9后已经不能编译通过,究其原因是因为nginx-1.3.9废弃了ngx_http_request_body_t中的to_write成员指针。        github上有人解决了这个问题,参考https://github.com/vkholodkov/nginx-upload-mod...

2017-01-29 12:42:35 5229 19

转载 nginx变量机制

初识变量前面曾讲过nginx配置文件的解析过程,也就是nginx如何在启动的过程中对用户设定的配置文件进行解析,并将配置文件中的各个配置项与配置值转换为对应的nginx内部变量值,从而能让nginx按照用户预想的情况去运行。如果只是一些比较简单并且确定的功能配置需求,那么nginx用户能够很方便的做出相应的设定,比如用户想要设置工作进程数为2个,那么配置文件中这样写即可:worker_

2016-10-12 18:15:41 2130

原创 用Redis的set指令实现锁

本文参考了http://huoding.com/2015/09/14/463。        我们知道,现在的Redis实现加锁的方法比较简单,直接调用Redis的set指令:$redis->set($key, $random, array('nx', 'ex' => $expire));        就可以实现。其中$random是个随机值,nx表示如果Redis中不存在$key时,就

2016-06-25 11:01:25 9718 1

转载 数据库分库和分表

先mark,周末再整理:http://zhengdl126.iteye.com/blog/419850

2016-05-13 11:11:59 399

转载 如何判断链表中是否有环

1.如何判断链表是否有环?如果有两个头结点指针,一个走的快,一个走的慢,那么若干步以后,快的指针总会超过慢的指针一圈。2.如何计算环的长度?第一次相遇(超一圈)时开始计数,第二次相遇时停止计数。3.如何判断环的入口点:相遇点p到环入口的距离=头指针到环入口的距离,因此,分别从相遇点、头指针开始走,相遇的那个点就是环入口。为什么呢?需要一个简单的计算过程:(1)当fa

2016-04-04 22:32:56 478

转载 提高程序运行效率的10个简单方法

转载自:http://chuansong.me/n/1013527,有修改。    对于每一个程序员来说,程序的运行效率都是一个值得重视,并为之付出努力的问题。但是程序性能的优化也是一门复杂的学问,需要很多的知识,然而并不是每个程序员都具备这样的知识,而且论述如何优化程序提高程序运行效率的书籍也很少。但是这并不等于我们可以忽略程序的运行效率,下面就介绍一下本人积累的一些简单实用的提高程序运

2016-01-28 19:13:40 1908

原创 在一亿个数中查找最大的k个数(k << 1,000,000,000)

在一亿个整数中查找最大(小)的k个数(k         之前跟一同事说起互联网公司的面试题,他说一般思路是先排序,然后再处理数据肯定没错。是不是这样的呢?对于这个问题,我们想想如下的几个方法:        1.使用大多数情况下最快的排序方法—快速排序来解决可以吗?思路是将一亿个整数放到一个数组中,然后使用快速排序方法把最大的k个数放到数组的前k个空间里。但是,这个问题没有说(1)要排好

2015-12-23 22:24:14 3041

原创 C语言中的柔性数组

前段时间在阅读nginx的源代码时,碰到一个之前从未碰到的问题,nginx定义的hash表中的元素的结构体:typedef struct { void *value; u_short len; u_char name[1];} ngx_hash_elt_t;        暂且不论各个成员的含义

2015-12-18 11:52:31 464

原创 程序的一些小优化

跳槽后才真正接触了C++,之前囫囵吞枣看了些C++的书,但是发现真正在项目使用时,很多地方都有改进的地方。1.vector的resize:        场景是这样的,客户端向服务器发起查询符合某个条件的数据库记录的请求,服务器查询完后将记录返回给移动端。服务器查询到数据记录后,将记录放入vector中,最开始的做法是向一个vector对象不断push记录,由于测试的时候查询的记录数都

2015-12-15 17:43:58 415

原创 红黑树的C++实现(2)

因为红黑树首先是二叉所搜树,所以有了二叉搜索树的实现,我们就可以重用部分二叉搜索树的类的接口了,rbt.h:#ifndef __RBT_H__#define __RBT_H__#include "bst.h"template class CRedBlackTree : public CBinarySortTree{ public: CRedBlackTree(); ~

2015-11-27 15:27:47 498

原创 红黑树的C++实现(1)

三年前磕磕盼盼用C语言写过红黑树,这段时间用C++重写了红黑树,修复了之前代码中的一些错误。记得以前的博客里面就写过使用C++写红黑树更容易些,因为可以重用二叉搜索树的C++代码。照例,首先实现二叉搜索树,然后再实现红黑树。        首先,定义二叉树结点的类,btnode.h:#ifndef __BTNODE_H__#define __BTNODE_H__#include #i

2015-11-27 15:11:26 515

原创 open /dev/kvm: Permission denied的解决办法

一直使用Debian的虚拟机功能用的好好的,今天上午提示有软件更新,是libvirt相关的,知道是关于虚拟化的软件,习惯性地就更新了。下午有点东西需要写文档,由于LaTeX之类的编辑软件一直没时间学习,所以还是求助于Word,于是开virt-manager,点开虚拟的XP,结果出现:    ...open /dev/kvm: Permission denied...    昨晚没是用vir

2013-03-16 17:58:06 14019

转载 为什么有了wait函数族还需要SIGCHLD信号

首先,在谈这个问题时,先说说unix中僵尸进程的含义,APUE2中如下定义:In UNIX System terminology, a process that has terminated, but whose parent has not yet waited for it, is called a zombie.也就是说,但凡是父进程没有调用wait函数获得子进程终止状态的子进程

2013-03-15 17:12:39 897

转载 反向代理服务器的工作原理

最近有打算研读nginx源代码,看到网上介绍nginx可以作为一个反向代理服务器完成负载均衡。所以搜罗了一些关于反向代理服务器的内容,整理综合。一  概述        反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表

2013-02-21 10:42:54 277

转载 SHELL字符串处理技巧(${}、##、%%)

在SHELL编程中,经常要处理一些字符串变量。比如,计算长度啊、截取子串啊、字符替换啊等等,常常要用到awk、expr、sed、tr等命令。下面给大家介绍个简单的字符串处理方法,用不着嵌套复杂的子命令。${#VALUE}:计算VALUE字符串的字符数量。${VALUE%.*}或${VALUE%%.*}:删除VALUE字符串中以分隔符“.”匹配的左边字符,保留右边字符。${VALUE#*.}

2013-02-18 10:43:31 744

原创 红黑树原理和实现(2)

二 红黑树(Red-Black Tree)       在上一篇博客中已经比较完整地介绍了BST(Binary Search Tree)的基本性质和各种操作的代码实现,对BST有较深刻的理解后再理解RBT(Red-Black Tree)就不会很吃力了。       首先简单了解一下什么是RBT,来自百度百科:红黑树是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用

2013-02-02 23:32:08 521

原创 红黑树原理和实现(1)

曾经看Robert Love写的《Linux Kernel Development》第三版中曾提到过Linux内核的程序调度算法是用红黑树(Red-Black Tree,下文简称RBT)实现的,当时找了很多关于RBT的东西,包括博客,数据结构和算法书籍甚至动态图等。由于念书的时候念的不是计算机相关专业,没有数据结构特别是树的基础,根本看不懂。工作两年多之后,由于工作需要接触了nginx,其中的超时

2013-02-02 23:31:58 534

原创 C语言指针总结

话说学习和使用C语言也有几个年头了,可是对于它的指针着实是明白一阵糊涂一阵,今天把看到的一些指针的信息记录一下留个备案,不然以后又忘了。一 以下几个指针变量的定义有什么区别:const int *p; //(1)int const *p; //(2)int *const p; //(3)const int *const p; //(4)以前找工作的时候这题还真遇到过,不过工

2013-01-24 15:09:31 441 1

原创 工作中的一些小总结

2010-10-20 一语点醒梦中人    前几天在调试基于UDP协议传输数据的代码,卡了两天,死活不通。原意是使用UDP协议读取到特定的字节后改变缓冲区大小,再使用它去读取后边的数据,但是再读取数据时,读到的数据是这个特定的字节加后边的信息,不知道为什么会重复读取到这个特定的字节。后来一个同事问另一个同事,他说:使用UDP协议传输数据,每次的数据都是新的,这次传输的数据没读完,UDP包就

2013-01-24 14:55:57 378

空空如也

空空如也

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

TA关注的人

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