月度归档:2018年04月

HLS协议直播延时优化(35s到10S)

1、首先要了解HLS延时的机制,也就是为什么会延时,延时主要发生在什么地方。

HTTP Live Streaming 并不是一个真正实时的流媒体系统,这是因为对应于媒体分段的大小和持续时间有一定潜在的时间延时。在客户端,至少在一个分段媒体文件被完全下载后才能够开始播放,而通常要求下载完两个媒体文件之后才开始播放以保证不同分段音视频之间的无缝连接。此外,在客户端开始下载之前,必须等待服务器端的编码器和流分割器至少生成一个TS文件,这也会带来潜在的时延。服务器软件将接收到的流每缓存一定时间后包装为一个新的TS文件,然后更新m3u8文件。m3u8文件中只保留最新的几个片段的索引,以保证观众任何时候连接进来都会看到较新的内容,实现近似直播的效果。这种方式的理论最小延时为一个ts文件的时长,一般为2-3个ts文件的时长。

所以,hls的延时主要由以下三个部分组成:

(1)服务器端的编码器和流分割器生成TS文件的时间

(2)客户端下载TS文件的时间,而通常要求下载完两个TS媒体文件

(3)客户端解码并播放时间

这三个方面里面,前两个方面我们是可以控制调节的,对于第三个方面只能取决于客户端的性能。

2、具体优化方法

由于服务器端生成TS流段需要时间,那么我们可以调节每段TS文件的大小,让其小些,那么服务器生成它的速度就加快,时间缩短。这样一来,客户端下载第一段或者前两段的时间就会减少,延时就会降低。根据上述的方式可以更改HLS的分段大小,方法是修改nginx配置文件nginx.conf,默认情况下nginx.conf文件的hls配置部分如下:

复制代码
rtmp {
    server {
        listen 1935;
        chunk_size 4096;
        application live {
                live on;
        }
        hls on;
        hls_path /tmp/hls;
    }
}
复制代码

文件并没有设置HLS 分段长度,添加设置:

hls_fragment  1s; 

将每段的长度限定为1s,HLS官方推荐的是10s,但是在我这里10s延时太大。但是段的时长越短,服务器的负载越大,延时越少。对于这句话我不是十分理解,至少我并没有发现服务器负载增加。当每段的长度固定之后,播放列表的长度也会影响延时时间,而且会对再次播放时的开始时间产生影响,非首次播放时,客户端会在播放列表的开头开始播放,所以总的延时时间等于播放列表长度加上上述的延时时间。所以将播放列表长度不要设置太大:

hls_playlist_length 3s; 

这样设置完之后的配置文件RTMP模块配置部分为:

复制代码
rtmp {
    server {
        listen 1935;
        chunk_size 4096;
        application live {
                live on;
        }
        hls on;
        hls_path /tmp/hls;
        hls_fragment 1s;
        hls_playlist_length 3s;
    }
}
复制代码

配置完成后重新启动nginx,重新使用ffmpeg推流,结果延时时间降到7~8s。

优化前测试结果:26S


 

优化后VLC播放测试结果:11s


 

 

贵在坚持,相信自己.

安防摄像头海康、大华IpCamera RTSP地址和格式

海康:

rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/av_stream

说明:

  1. username: 用户名。例如admin。
  2. password: 密码。例如12345。
  3. ip: 为设备IP。例如 192.0.0.64。
  4. port: 端口号默认为554,若为默认可不填写。
  5. codec:有h264、MPEG-4、mpeg4这几种。
  6. channel: 通道号,起始为1。例如通道1,则为ch1。
  7. subtype: 码流类型,主码流为main,辅码流为sub。



例如,请求海康摄像机通道1的主码流,Url如下

主码流:

rtsp://admin:12345@192.0.0.64:554/h264/ch1/main/av_stream rtsp://admin:12345@192.0.0.64:554/MPEG-4/ch1/main/av_stream

子码流:

rtsp://admin:12345@192.0.0.64/mpeg4/ch1/sub/av_stream
rtsp://admin:12345@192.0.0.64/h264/ch1/sub/av_stream

大华:

rtsp://username:password@ip:port/cam/realmonitor?channel=1&subtype=0

说明:

  1. username: 用户名。例如admin。
  2. password: 密码。例如admin。
  3. ip: 为设备IP。例如 10.7.8.122。
  4. port: 端口号默认为554,若为默认可不填写。
  5. channel: 通道号,起始为1。例如通道2,则为channel=2。
  6. subtype: 码流类型,主码流为0(即subtype=0),辅码流为1(即subtype=1)。

例如,请求某设备的通道2的辅码流,Url如下

rtsp://admin:admin@10.12.4.84:554/cam/realmonitor?channel=2&subtype=1

直播视频码流、码率、采样率、比特率、帧速率、分辨率、高清视频的概念

高清视频主要编码


 

480P格式:720×480 

720P格式:1280×720 【表现体育节目、快速运动的视频时,720P更明显】

1080P格式:1920×1080 【适合普通电视节目、电影等慢速运动的视频时,1080P更明显】

1、码流(码率)


 

       码流(Data Rate)是指视频文件在单位时间内使用的数据流量,也叫码率或码流率,通俗一点的理解就是取样率,是视频编码中画面质量控制中最重要的部分,一般我们用的单位是kb/s或者Mb/s。一般来说同样分辨率下,视频文件的码流越大,压缩比就越小,画面质量就越高。码流越大,说明单位时间内取样率越大,数据流,精度就越高,处理出来的文件就越接近原始文件,图像质量越好,画质越清晰,要求播放设备的解码能力也越高。

当然,码流越大,文件体积也越大,其计算公式是文件体积=时间X码率/8。例如,网络上常见的一部90分钟1Mbps码流的720P RMVB文件,其体积就=5400秒×1Mb/8=675MB。

通常来说,一个视频文件包括了画面及声音,例如一个RMVB的视频文件,里面包含了视频信息和音频信息,音频及视频都有各自不同的采样方式和比特率,也就是说,同一个视频文件音频和视频的比特率并不是一样的。而我们所说的一个视频文件码流率大小,一般是指视频文件中音频及视频信息码流率的总和。

以以国内最流行,大家最熟悉的RMVB视频文件为例,RMVB中的VB,指的是VBR,即Variable Bit Rate的缩写,中文含义是可变比特率,它表示RMVB采用的是动态编码的方式,把较高的采样率用于复杂的动态画面(歌舞、飞车、战争、动作等),而把较低的采样率用于静态画面,合理利用资源,达到画质与体积可兼得的效果。

码率和取样率最根本的差别就是码率是针对源文件来讲的。

 

2、采样率


 

采样率(也称为采样速度或者采样频率)定义了每秒从连续信号中提取并组成离散信号的采样个数,它用赫兹(Hz)来表示采样率是指将模拟信号转换成数字信号时的采样频率,也就是单位时间内采样多少点。一个采样点数据有多少个比特。比特率是指每秒传送的比特(bit)数。单位为 bps(Bit Per Second),比特率越高,传送的数据越大,音质越好.比特率 =采样率 x 采用位数 x声道数.

采样率类似于动态影像的帧数,比如电影的采样率是24赫兹,PAL制式的采样率是25赫兹,NTSC制式的采样率是30赫兹。当我们把采样到的一个个静止画面再以采样率同样的速度回放时,看到的就是连续的画面。同样的道理,把以44.1kHZ采样率记录的CD以同样的速率播放时,就能听到连续的声音。显然,这个采样率越高,听到的声音和看到的图像就越连贯。当然,人的听觉和视觉器官能分辨的采样率是有限的,基本上高于44.1kHZ采样的声音,绝大部分人已经觉察不到其中的分别了。

而声音的位数就相当于画面的颜色数,表示每个取样的数据量,当然数据量越大,回放的声音越准确,不至于把开水壶的叫声和火车的鸣笛混淆。同样的道理,对于画面来说就是更清晰和准确,不至于把血和西红柿酱混淆。不过受人的器官的机能限制,16位的声音和24位的画面基本已经是普通人类的极限了,更高位数就只能靠仪器才能分辨出来了。比如电话就是3kHZ取样的7位声音,而CD是44.1kHZ取样的16位声音,所以CD就比电话更清楚。

当你理解了以上这两个概念,比特率就很容易理解了。以电话为例,每秒3000次取样,每个取样是7比特,那么电话的比特率是21000。 而CD是每秒 44100次取样,两个声道,每个取样是13位PCM编码,所以CD的比特率是44100*2*13=1146600,也就是说CD每秒的数据量大约是 144KB,而一张CD的容量是74分等于4440秒,就是639360KB=640MB。

码率和取样率最根本的差别就是码率是针对源文件来讲的。

  

3、比特率


 

 比特率是指每秒传送的比特(bit)数。单位为bps(Bit Per Second),比特率越高,传送的数据越大。在视频领域,比特率常翻译为码率 !!!

比特率表示经过编码(压缩)后的音、视频数据每秒钟需要用多少个比特来表示,而比特就是二进制里面最小的单位,要么是0,要么是1。比特率与音、视频压缩的关系,简单的说就是比特率越高,音、视频的质量就越好,但编码后的文件就越大;如果比特率越少则情况刚好相反。

比特率是指将数字声音、视频由模拟格式转化成数字格式的采样率,采样率越高,还原后的音质、画质就越好。

 

4、常见编码模式:


 

VBR(Variable Bitrate)动态比特率 也就是没有固定的比特率,压缩软件在压缩时根据音频数据即时确定使用什么比特率,这是以质量为前提兼顾文件大小的方式,推荐编码模式;

ABR(Average Bitrate)平均比特率 是VBR的一种插值参数。LAME针对CBR不佳的文件体积比和VBR生成文件大小不定的特点独创了这种编码模式。ABR在指定的文件大小内,以每50帧(30帧约1秒)为一段,低频和不敏感频率使用相对低的流量,高频和大动态表现时使用高流量,可以做为VBR和CBR的一种折衷选择。

CBR(Constant Bitrate),常数比特率 指文件从头到尾都是一种位速率。相对于VBR和ABR来讲,它压缩出来的文件体积很大,而且音质相对于VBR和ABR不会有明显的提高。

 

5、帧速率



帧速率也称为FPS(Frames PerSecond)的缩写——帧/秒。

是指每秒钟刷新的图片的帧数,也可以理解为图形处理器每秒钟能够刷新几次。越高的帧速率可以得到更流畅、更逼真的动画。每秒钟帧数(FPS)越多,所显示的动作就会越流畅。(PS:英雄联盟中的,Ping值越低越好,FPS值越高越好,O(∩_∩)O哈哈~)

影响FPS值的主要因素就是显卡,一款好的独立显卡会对FPS的提升有着很大的作用。如果FPS值过低可以尝试通过调节一些游戏或者电脑参数来缓解如:降低游戏分辨率、开启垂直同步等等

 

6、分辨率


 

就是帧大小每一帧就是一副图像。

640*480分辨率的视频,建议视频的码速率设置在700以上,音频采样率44100就行了

一个音频编码率为128Kbps,视频编码率为800Kbps的文件,其总编码率为928Kbps,意思是经过编码后的数据每秒钟需要用928K比特来表示。

计算输出文件大小公式:(音频编码率(KBit为单位)/8 +视频编码率(KBit为单位)/8)×影片总长度(秒为单位)=文件大小(MB为单位)

7、高清视频


 

目前的720P以及1080P采用了很多种编码,例如主流的MPEG2,VC-1以及H.264,还有Divx以及Xvid,至于封装格式更多到令人发指,ts、mkv、wmv以及蓝光专用等等。

720和1080代表视频流的分辨率,前者1280*720,后者1920*1080,不同的编码需要不同的系统资源,大概可以认为是H.264>VC-1>MPEG2。

VC-1是最后被认可的高清编码格式,不过因为有微软的后台,所以这种编码格式不能小窥。相对于MPEG2,VC-1的压缩比更高,但相对于H.264而言,编码解码的计算则要稍小一些,目前来看,VC-1可能是一个比较好的平衡,辅以微软的支持,应该是一只不可忽视的力量。一般来说,VC-1多为 “.wmv”后缀,但这都不是绝对的,具体的编码格式还是要通过软件来查询。

总的来说,从压缩比上来看,H.264的压缩比率更高一些,也就是同样的视频,通过H.264编码算法压出来的视频容量要比VC-1的更小,但是VC-1 格式的视频在解码计算方面则更小一些,一般通过高性能的CPU就可以很流畅的观看高清视频。相信这也是目前NVIDIA Geforce 8系列显卡不能完全解码VC-1视频的主要原因。

PS&TS是两种视频或影片封装格式,常用于高清片。扩展名分别为VOB/EVO和TS等;其文件编码一般用MPEG2/VC-1/H.264

高清,英文为“High Definition”,即指“高分辨率”。 高清电视(HDTV),是由美国电影电视工程师协会确定的高清晰度电视标准格式。现在的大屏幕液晶电视机,一般都支持1080i和720P,而一些俗称的“全高清”(Full HD),则是指支持1080P输出的电视机。

 

目前的高清视频编码格式主要有H.264、VC-1、MPEG-2、MPEG-4、DivX、XviD、WMA-HD以及X264。事实上,现在网络上流传的高清视频主要以两类文件的方式存在:一类是经过MPEG-2标准压缩,以tp和ts为后缀的视频流文件;一类是经过WMV-HD(Windows Media Video HighDefinition)标准压缩过的wmv文件,还有少数文件后缀为avi或mpg,其性质与wmv是一样的。真正效果好的高清视频更多地以H.264与VC-1这两种主流的编码格式流传。

 

 

一般来说,H.264格式以“.avi”、“.mkv”以及“.ts”封装比较常见。

Linux升级最新OpenSSH,Dropbear临时替换SSH

OpenSSH是一款开源的安全远程控制工具,也是Linux系统中最常用的服务之一,近年来频繁爆出高危漏洞,深受各大企业关注。掌握升级OpenSSH或许是每位运维人员必经的成长阶段,今天给大家分享一下从系统默认OpenSSH
5.3p1升级至最新版本OpenSSH 7.6p1的方法,希望能帮助刚入门的Linux运维朋友们。https://matt.ucc.asn.au/dropbear/dropbear.html

 实验环境

实验平台:VMware虚拟机

操作系统:CentOS 6.5

旧版OpenSSH:5.3p1

旧版OpenSSL:1.0.1e

新版OpenSSH:7.6p1

新版OpenSSL:1.0.2n

Dropbear:2017.75

 服务端篇

第一步 准备工作

禁用SElinux

  1. [root@Wanghualang ~]# setenforce 0  
  2. [root@Wanghualang ~]# sed -ri ‘s#^(SELINUX=).*#\1disabled#g’ /etc/selinux/config  

禁用防火墙

  1. [root@Wanghualang ~]# service iptables stop  
  2. [root@Wanghualang ~]# service ip6tables stop  
  3. [root@Wanghualang ~]# chkconfig iptables off        
  4. [root@Wanghualang ~]# chkconfig ip6tables off  

安装常用软件

  1. [root@Wanghualang ~]# yum -y install wget vim  

第二步 安装远程工具

建议先临时使用其他远程工具,以防升级Openssh失败导致无法远程服务器。一般情况下,可以临时启动Telnet,若企业严禁使用Telnet,则可以Dropbear替代,两种远程工具二选一即可。

安装Telnet

  1. [root@Wanghualang ~]# yum -y install telnet-server

设置允许root用户登录

  1. [root@Wanghualang ~]# mv /etc/securetty /etc/securetty.bak  

修改配置文件,把默认的disable=yes,修改为disable=no

  1. [root@Wanghualang ~]# vim /etc/xinetd.d/telnet  

启动Telnet

  1. [root@Wanghualang ~]# service xinetd start  

安装Dropbear

  1. [root@Wanghualang ~]# yum -y install gcc zlib-devel  
  2. [root@Wanghualang ~]# cd /usr/local/src/  
  3. [root@Wanghualang src]# wget –no-check-certificate https://dropbear.nl/mirror/dropbear-2017.75.tar.bz2  
  4. [root@Wanghualang src]# tar xjf dropbear-2017.75.tar.bz2  
  5. [root@Wanghualang src]# cd dropbear-2017.75  
  6. [root@Wanghualang dropbear-2017.75]# ./configure  
  7. [root@Wanghualang dropbear-2017.75]# make  
  8. [root@Wanghualang dropbear-2017.75]# make install  

生成证书

  1. [root@Wanghualang ~]# mkdir /etc/dropbear  
  2. [root@Wanghualang ~]# /usr/local/bin/dropbearkey -t dss -f /etc/dropbear/dropbear_dss_host_key  
  3. [root@Wanghualang ~]# /usr/local/bin/dropbearkey -t rsa -s 4096 -f /etc/dropbear/dropbear_rsa_host_key  

启动Dropbear,监听16888端口,使用Telnet或者Dropbear远程登录到服务器后,接下来正式开始升级Openssh。

  1. [root@Wanghualang ~]# /usr/local/sbin/dropbear -p 16888  

第三步 备份旧程序

备份Openssh、库文件

  1. [root@Wanghualang ~]# service sshd stop  
  2. [root@Wanghualang ~]# rpm -ql `rpm -qa |egrep openss[hl]` > Wanghualang.txt  
  3. [root@Wanghualang ~]# tar czf OpensshBak.tar.gz -T Wanghualang.txt  
  4. [root@Wanghualang ~]# tar czf LibBak.tar.gz /lib /lib64  

第四步 卸载旧程序

在卸载OpenSSL后,Yum、Wget等等命令将无法正常使用,所以卸载之前,建议把相关开发包、源码包提前准备好。

  1. [root@Wanghualang ~]# yum -y install gcc zlib-devel pam-devel  
  2. [root@Wanghualang ~]# cd /usr/local/src/      
  3. [root@Wanghualang src]# wget –no-check-certificate https://openbsd.hk/pub/OpenBSD/OpenSSH/portable/openssh-7.6p1.tar.gz  
  4. [root@Wanghualang src]# wget –no-check-certificate https://www.openssl.org/source/openssl-1.0.2n.tar.gz  

卸载OpenSSL、Openssh

  1. [root@Wanghualang ~]# rpm -e `rpm -qa | grep openssl` –nodeps  –allmatches  
  2. [root@Wanghualang ~]# rpm -e `rpm -qa | grep openssh` –nodeps  –allmatches  

第五步 安装新程序

安装OpenSSL

  1. [root@Wanghualang ~]# cd /usr/local/src/      
  2. [root@Wanghualang src]# tar xzf openssl-1.0.2n.tar.gz  
  3. [root@Wanghualang src]# cd openssl-1.0.2n  
  4. [root@Wanghualang openssl-1.0.2n]# ./config -fPIC –prefix=/usr enable-shared      
  5. [root@Wanghualang openssl-1.0.2n]# make      
  6. [root@Wanghualang openssl-1.0.2n]# make install     

查看OpenSSL版本

  1. [root@Wanghualang ~]# openssl version -a  

建立软链接,Yum、Wget等命令便可正常使用。

  1. [root@Wanghualang ~]# ln -s /usr/lib64/libssl.so.1.0.0 /usr/lib64/libssl.so.10      
  2. [root@Wanghualang ~]# ln -s /usr/lib64/libcrypto.so.1.0.0 /usr/lib64/libcrypto.so.10  

安装OpenSSH

  1. [root@Wanghualang ~]# cd /usr/local/src/         
  2. [root@Wanghualang src]# tar xzf openssh-7.6p1.tar.gz       
  3. [root@Wanghualang src]# cd openssh-7.6p1      
  4. [root@Wanghualang openssh-7.6p1]# ./configure –prefix=/usr –sysconfdir=/etc/ssh –with-pam –with-zlib –with-md5-passwords      
  5. [root@Wanghualang openssh-7.6p1]# make      
  6. [root@Wanghualang openssh-7.6p1]# make install   

查看OpenSSH版本

  1. [root@Wanghualang ~]# ssh -V  
  2. OpenSSH_7.6p1, OpenSSL 1.0.2n  7 Dec 2017  

设置开机启动

  1. [root@Wanghualang ~]# cp -rf /usr/local/src/openssh-7.6p1/contrib/redhat/sshd.init /etc/init.d/sshd  
  2. [root@Wanghualang ~]# chmod +x /etc/init.d/sshd  
  3. [root@Wanghualang ~]# chkconfig –add sshd  

启动OpenSSH

默认情况下,新版的OpenSSH禁止使用root用户登录,为方便测试,现解除这个限制。

  1. [root@Wanghualang ~]# sed -i ‘s/#PermitRootLogin prohibit-password/PermitRootLogin yes/’ /etc/ssh/sshd_config  
  2. [root@Wanghualang ~]# service sshd start  

第六步 卸载其他远程工具

确认新版OpenSSH正常使用后,可以考虑卸载Telnet、Dropbear。

卸载Telnet

  1. [root@Wanghualang ~]# yum -y remove telnet-server  

卸载Dropbear

查询进程号

  1. [root@Wanghualang ~]# ps aux | grep dropbear  

结束进程

  1. [root@Wanghualang ~]# kill -9 进程号  

删除程序

  1. [root@Wanghualang ~]# find / -name dropbear* | xargs rm -rf 

1.1.1.1开放DNS好不好用?

1.1.1.1开放DNS好不好用?用服务器测试,电信联通ping延时100以上延时,域名解析300多毫秒,海外测试延时都50毫秒,明显适合海外使用的DNS,不适合国内使用的开发DNS。

1)服务器测试一下,用ucloud服务器测试执行,v.qq.com访问海外服务器了。

# time dig @1.1.1.1 v.qq.com

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6_8.4 <<>> @1.1.1.1 v.qq.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46940
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;v.qq.com.                      IN      A

;; ANSWER SECTION:
v.qq.com.               600     IN      CNAME   v.qq.com.edgekey.net.
v.qq.com.edgekey.net.   1361    IN      CNAME   e5956.f.akamaiedge.net.
e5956.f.akamaiedge.net. 17      IN      A       104.65.9.248

;; Query time: 387 msec
;; SERVER: 1.1.1.1#53(1.1.1.1)
;; WHEN: Tue Apr  3 16:44:35 2018
;; MSG SIZE  rcvd: 109

real    0m0.392s
user    0m0.001s
sys     0m0.005s

2)汕头电信服务器测试

time dig @1.1.1.1 v.qq.com

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.62.rc1.el6_9.2 <<>> @1.1.1.1 v.qq.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 56452
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;v.qq.com.                      IN      A

;; ANSWER SECTION:
v.qq.com.               600     IN      CNAME   v.qq.com.edgekey.net.
v.qq.com.edgekey.net.   1403    IN      CNAME   e5956.f.akamaiedge.net.
e5956.f.akamaiedge.net. 14      IN      A       104.65.9.248

;; Query time: 388 msec
;; SERVER: 1.1.1.1#53(1.1.1.1)
;; WHEN: Tue Apr  3 16:43:53 2018
;; MSG SIZE  rcvd: 109

real    0m0.397s
user    0m0.005s
sys     0m0.004s