精华内容
下载资源
问答
  • 组播测试软件

    2018-12-06 17:06:02
    简单好用的组播测试软件,可以在实验环境中使用,也可以直接在真实网络里测试,非常方便
  • IP组播介绍

    千次阅读 2010-03-29 21:50:00
    IP组播技术实现了IP网络中点到多点的高效数据传送,能够有效地节约网络带宽、降低网络负载。但是,在组播网络设计时仍应十分小心,以免引起网络性能恶化或由于不恰当地使用IP组播应用而过分地消耗网络带宽,使网络...

    IP组播技术实现了IP网络中点到多点的高效数据传送,能够有效地节约网络带宽、降低网络负载。但是,在组播网络设计时仍应十分小心,以免引起网络性能恶化或由于不恰当地使用IP组播应用而过分地消耗网络带宽,使网络发生故障。另外,随着 Internet迅猛发展,其网络规模越来越庞大,结构越来越复杂,仅仅依靠端到端的拥塞控制是不够的,网络必须参与资源的控制工作。目前IP组播拥塞控制策略是在路由器中采用包调度算法结合缓存管理技术,由此而产生了几种IP处理的方法。本文主要从IP组播流量管理和拥塞控制两方面进行了一些探讨。



    传统的IP通信是在一个源IP主机和一个目标IP主机之间(单播)或者一个源IP主机和网络中所有的IP主机之间(广播)进行的。现在要将信息发送给网络中的多个而非所有IP主机,如果采用传统的IP通信技术就有两种方法可以选择:要么采用广播方式,要么由源IP主机分别向网络中的多个目标IP主机单播发送IP包。广播方式不仅会将信息发送给不需要的IP主机而浪费带宽,也可能由于路由回环引起一场严重的广播风暴。单播方式由于IP包的重复发送而白白浪费掉大量带宽,同时也增加了服务器的负载。可见,传统的IP通信技术不能有效地解决单点发送多点接收的问题。而IP组播却很好地解决了这个问题。
    组播是指信源将信息发向所有网络节点的某个确定子集的点到多点的通信形式。IP组播是指在IP网络中数据包以尽力传送的形式发送到所有网络节点的某个确定子集,这个子集称为组播组。IP组播的基本思想是源IP主机只发送一份数据,一个或多个接收者可接收相同数据的拷贝。即允许源IP主机向网上所有IP主机的一部分(子集)发送IP分组,只有该子集内的主机(目标主机)可以接收该分组,而网络中其它IP主机不能收到该分组。这种逻辑上的子集(目标主机)就是组播组,用D类IP地址(224.0.0.0~239.255.255.255)来标识。
    IP组播技术有效地解决了单点发送多点接收、多点发送多点接收的问题,实现了IP网络中点到多点的高效数据传送。能够有效地节约网络带宽、降低网络负载。IP组播技术在实时数据传送、网络电视、多媒体会议、数据拷贝、游戏和仿真等诸多方面都得到了广泛的应用。
    一、流量管理
    带宽控制是网络设计的一个基本问题,也是进行网络设计时要考虑的第一个问题,对组播网络也是如此。
    随着网络技术的发展,多媒体应用的日益普及,对网络提出的带宽要求也是越来越高。在许多情况下,由于不正确的配置会造成带宽的大量浪费。虽然IP组播的使用是节省网络带宽的一个非常有效的方法,但是,在组播网络设计时仍应十分小心,以免引起网络性能恶化或由于不恰当地使用IP组播应用而过分地消耗网络带宽,使网络发生故障。
    下面讨论两种可以防止在组播网络上消耗过多带宽的技术。这两种方法是相辅相成的,它们可以被一起使用,以提供更好的组播流量管理。
    1、速率限制
    速率限制的主要实现方法是通过在特定接口上限制输入或输出组播信息流的带宽。这是一种具有相当强制性的方法。
    (1)接口速率限制
    一般来说,网络工程师并不知道网络中哪一个发送源将向组播组发送组播信息,因此速率限制的最普遍的应用是对一个接口上发送的所有组播信息设置一个绝对上限值。这个绝对上限值叫速率限制汇总。当使用这种形式的速率限制时,每当某个接口上发送组播信息时,就要将该接口上发送的所有组播信息流的速率汇总和上述的速率限制汇总相比较。如果信息流的速率汇总超过了速率限制汇总,则路由器就必须开始丢弃组播信息包,直到达到规定的速率为止。
    输入接口的配置与出接口的配置相同,路由器只需在接口上设置一个它可接收的最大速率。如果全部接收到的组播信息的速率汇总超过了设置的最大速率值,则路由器开始丢弃在输入接口上的组播信息,直到输入的组播数据流的速率达到规定的速率为止。
    (2)对单独组播流的速率限制
    有时以接口为基础的速率限制汇总并不能满足对网络带宽限制的要求,因为这种技术只设置了在一个接口上允许传送或是接收的组播信息速率的上限值。在某些情况下,需要对每个单独的组播信息流规定一个最大速率。这可以通过对组播转发表中的某一个组播转发项设置一个速率限制来实现这种对各个单独组播流的速率限制。
    当路由器发送和接收组播信息流时,将该组播信息流与相应的组播转发项上设置的速率限制值进行比较。如果组播信息流的速率小于配置的速率限制,则将正常转发和接收组播信息包;否则就丢弃该组播信息包。
    2、区域划分
    除速率限制外,另一种控制带宽的有效方法是使用区域划分和IP组播边界。其基本思想是将组播信息速率的限制进行层次划分。层次结构中的每一个等级定义了一个组播地址的范围,在该地址范围内发送的组播信息速率可达到该等级所规定的最大速率。例如,表4.1给出了一个简单的三层结构,它被用来将组播信息速率划分成三个区域,每个区域有一个对应的速率限制上限。
    使用这种区域结构就可以阻止高速组播信息传输出准备处理该速率的组播信息的区域,比如阻止高速组播信息离开校园网以免在广域网上传输。这就使得带宽高的网络可以处理高速率的组播信息流,而且将该信息流仅仅限制在该区域内,而不会被扩散至低带宽的网络中去。
    表1 简单的三层区域结构
    组范围 速率(Kbit/s)
    239.255.0.0/16 >256
    239.193.0.0/16 <=256
    224.0.1.0~238.255.255.255 <=128

    二、拥塞控制
    IP组播拥塞控制问题的重要性,随着IP组播日益广泛的应用需求而变得越来越迫切。TCP基于窗口的端到端的拥塞控制对于Internet的稳定性起到了关键性作用,但是随着Internet迅猛发展,其网络规模越来越庞大,结构越来越复杂,仅仅依靠端到端的拥塞控制是不够的,网络必须参与资源的控制工作。
    目前IP组播拥塞控制策略是在路由器中采用包调度算法结合缓存管理技术,由此而产生了几种IP处理的方法,如下所述:
    1、先进先出
    先进先出(FIFO)提供了基本的存储转发功能,也是目前Internet使用最广泛的一种方式,它在网络拥塞时存储分组,在拥塞解除时按分组到达顺序转发分组。它采用默认的排队方法,因此不需要配置。其缺点是不提供QoS功能,对突发数据流在传输时间要求严格时,应用程序会引起过多的延迟,并对突发性的、存在包丢失的连接公平性较差,对上层的TCP快速恢复的效率也较低。
    2、优先级排队算法
    优先级排队(PQ:Priority Queuing)算法是在禁止其它流量的前提下,授权一种类型的流量通过。使用优先级排队算法给路由接口上传输的数据分配优先级,当有空闲路由时,路由就来回扫描所有队列,将高优先队级列数据发出;只有当高优先级队列空了以后,才能为低优先级服务;如果优先级队列满,则扔掉数据包,路由器不处理。优先级排队算法适用于网络链路不断阻塞的情况。
    优先级排队算法的带宽分配独立于数据包大小。因此它在没有牺牲统计利用的情况下提供另外的公平性,与端到端的拥塞控制机制可以较好地协同,它的缺点在于实现起来很复杂,需要每个数据流的排队处理、流状态统计、数据包的分类以及包调度的额外开销等。
    3、定制排队
    定制排队是为允许具有不同最低带宽和延迟要求的应用程序共享网络而设计的。定制排队为不同的协议分配不同的队列空间,并以循环方式处理队列;为特定的协议分配较大的队列空间可以提高其优先级。定制排队比优先级更为公平。
    定制排队可以保证每一个特定的通信类型得到固定部分的可用带宽,同时在链路紧张的情况下,避免数据包企图占用超出预分配量限制的可能。
    4、加权公平排队
    加权公平排队(WFQ:Weighted Fair Queuing)用于减少延迟变化,为数据流提供可预测的吞吐量和响应时间。目标是为轻载网络用户和重载网络用户提供公平一致的服务,保证低权值的响应时间与高权值的响应时间一致。
    加权公平排队是一种基于数据流的排队算法,它能识别交互式应用的数据流,并将应用的数据流调度到队列前部,以减少响应时间。WFQ与定制排队和优先级排队不同,能自动适应不断变化的网络通信环境,几乎不需要人工配置。
    5、随机先期检测
    前面介绍的排队机制是基本的拥塞控制策略,尽管这些技术对控制拥塞是必需的,但它们对避免拥塞现象的发生都显得无能为力。
    随机先期检测(RED:Random Early Detection)监视网上各点的通信负载,如果拥塞增多,就随机丢弃一些分组;当源分布点检测到通信丢失,便降低传输速率。它可以在各连接之间获得较好的公平性,对突发业务适应性较强。
    6、加权随机先期检测
    加权随机先期检测(WRED:Weighted Random Early Detection)是将随机先期检测与优先级排队结合起来,这种结合为高优先级分组提供了优先通信处理能力。当某个接口开始出现拥塞时,它有选择地丢弃较低优先级的通信,而不是简单地随机丢弃分组。
    总之,在传统TCP拥塞控制中,结合IP层拥塞控制算法,将是完善Internet拥塞控制最有效的途径,但其发展还有待进一步研究。

    三、使用IP组播传输视频的一个实例
    我们使用如下方案:利用软件和服务器,在整个IP宽带网上叠加一个处理媒体流的叠加网,由叠加网实现点到多点组播、媒体流路由和多点注入等功能。即计算机配合专用软件组成服务器,实现实时控制。当然,传输方法的实现要能与目前的网络设施相兼容。
    以上方案实施过程中,计算机(服务器)时刻监控着系统,达到尽可能好的广播质量和高效率,绝不会发生如“广播风暴”等危险。
    根据以上要求我们设计了如下系统,它由四部分组成:视频发送、视频转发、视频接收、视频控制。
    1、视频发送
    视频发送为预制视频或者称为实时视频,它可以是独立的计算机,也可以与第一级“视频转发”单元共用一台计算机。具体地说,我们先将视频按MPEG-1编码技术进行实时视频压缩,此格式的数码率为1.5 Mbit/s,图像采用SIF格式(352×288),每秒30帧,2路立体声伴音。然后我们将压缩后的信号送到视频转发端。信号从视频发送连接到视频转发是点到点的传输(此单元属于IPv4的通信方式)。
    2、视频转发
    视频转发主要是将从视频发送端发送来的视频信号,通过IP网络转发给视频接收端或下一级的视频转发端。它是IP组播传输视频信号的核心,视频信号用IP组播方式转发,即对一组特定IP地址(同一类请求的用户)进行数据传送。视频转发,由转发计算机(服务器)完成。
    3、视频接收
    视频接收是用户的多媒体终端。要求用户的多媒体终端设备必须能支持IP组播。
    4、视频控制
    其主要功能是对转发站点进行控制,用来建立和管理转发站点上的IP组播数据组的传输。控制系统要能最大限度地满足完成指向需求用户的数据发送,同时密切注意视频传输的质量。具体地说就是要尽可能多地为同类请求用户发送数据,但要在允许的带宽范围之内。这个带宽是通过计算机实时控制的,计算机实时控制系统随时监控视频传输的质量,自动调整带宽;同时对网络其他各项参数也实现实时监控。
    此方案的关键技术是合理的视频转发,寻求最大的效率,又有满意的传输质量。此方案的实现,得益于计算机的实时控制技术。我们用此方法在100M Ethernet LAN网络实现实时网络IP组播视频传输的试播,传输MPEG-1视频信号(每个视频流带宽1.5 Mbps),视频信号传输效果良好,证明以上方案是可行的。
    转至:http://wjtao291.bokee.com/viewdiary.15157032.html

    展开全文
  • 一个基于UDP组播的简单网络教室演示,包括基本的多媒体传输。 仅适用于局域网。 实现的功能 支持基于UDP组播的基本多媒体传输,包括cam,屏幕共享,麦克风,立体声混音器等。 支持1080p @ 30Hz或720p @ 60Hz视频...
  • 此示例工程可以自动探测同一个网络内的海康IPC并显示出来,实现了ONVIF协议对接流程当中的设备搜索过程
  • 组播实现失败检测(心跳)

    千次阅读 2011-06-08 21:41:00
    要提一下的是组播IP地址,IP组播地址,或称为主机组地址,由D类IP地址标记。D类IP地址的最高四位为“1110”,起范围从224.0.0.0到 239.255.255.255。 接收步骤: 1.设置监听udp的端口,设置并加入组播组。 ...

    原理概述      

          在分布式服务中,存在多个节点,而我们不能保证这些节点时刻都能正常运转,所以我们需要实现一种机制来检测新解冻的加入和正在运行节点的崩溃。为了检测节点崩溃,一种常用的方法是心跳(heart beat)。即,我们通过定时地发送消息到其他节点,来告诉其他人自己还活着,而   一段时间没有接收到原本存在的节点的心跳消息,我们就认为这个节点崩溃了。通过这种方式,我们实现了失败检测。

          多播是的优势网络数据包的数量减至最低。组播技术是基于UDP,比TCP更加轻量级。在一下实现里,节点每1秒发送一次心跳信息,若3秒没有收到信息,则认为节点崩溃。

     

     

    实现细节

    1.组播实现

    参考了 http://ajava.org/code/Protocol/16181.html

    上面的实现算是比较清楚了,我只是分别将server和client写成了线程,一台主机上既要有发送消息的服务,也要有接收消息的服务,也就是说,所有机器上运行的程序全都是一样的,并没有特定的server节点。

    要提一下的是组播IP地址,IP组播地址,或称为主机组地址,由D类IP地址标记。D类IP地址的最高四位为“1110”,起范围从224.0.0.0到 239.255.255.255。

    接收步骤:

    1.设置监听udp的端口,设置并加入组播组。

    2.开始接收消息,receive()方法阻塞。

    发送步骤:

    1.生成要发送的数据

    2.设置好要发送的组和端口,发送。

    注意在同一个组里,组IP和接收端口都是相同的。

     

     

    2.定时器

    3秒进行一次扫描,将所有存在本地的节点信息扫描一遍。若在3秒内有收到心跳消息,则仅仅将其标记,若在3秒内没有收到消息,即标记还在,则认为该节点崩溃,从本地中删除该节点。

     

     

    3.Map和序列化

    在我的实现里,我用一个Map来保存组播消息和心跳标记这样一组键值对。心跳标记为boolean型,组播消息是自定义类MultiMsg。

    因为该类要能够在网络中传输,所以要将其类型转换为byte[],这个时候我们要用到序列化(Serializable),将一个类变为可序列化只要加上implements Serializable即可。然后我们通过一些输出转换,就可以将该类转换为byte[],这个比较简单,可以直接看我的实现。

    然而一般的序列化的类并不能满足map的操作,要将一个自定义类加入map中,则必须为该类实现equals和hashcode函数,以覆盖map中原有的函数。

     

     

    实现代码

    1.Send

     

    2.Listen

     

    3.MultiMsg

    展开全文
  • 因为,它是精确控制的,可以跳出这个以gop为单位的控制。 视频基本属性 帧率(frame rate) 帧指的是码中的单张画面,帧率指单位时间内码的帧数,单位fps(frame per second)。我们看到的视频是由一帧...

    直播协议

    RTMP(Real Time Messaging Protocol)

    简介

    Time Messaging Protocol,实时消息传送协议

    RTMP是Adobe公司为Flash播放器和服务器之间音频、视频和数据传输开发的开放协议。

    协议:长连接TCP

    原理:每个时刻的数据,收到后立即转发

    延迟:1~3秒

    优点

    • 实时性高:一般能做到3秒内。
    • 支持加密:rtmpe和rtmps为加密协议。
    • 稳定性高:在PC平台上flash播放的最稳定方式是rtmp,如果做CDN或者大中型集群分发,选择稳定性高的协议一定是必要的。
    • 一般主流编码器都支持该协议。

    缺点

    • 协议复杂:开发者写起来累,效率也不行。
    • Cache麻烦:流协议做缓存不方便。

    RTSP(Real Time Streaming Protocol)

    简介

    实时流协议(Real Time Streaming Protocol,RTSP)是一种网络应用协议,专为娱乐和通信系统的使用,以控制流媒体 服务器。该协议用于创建和控制终端之间的媒体会话。媒体服务器的客户端发布VCR命令,例如播放,录制和暂停,以便于实时控制从服务器到客户端(视频点播)或从客户端到服务器(语音录音)的媒体流。

    Time Streaming Protocol,实时流传输协议)

    优点

    ●  延迟低,一般都能够做到500ms。

    ●  带宽好,时效率高。

    ●  倍速播放,主要是回放的时候提供的功能。

    ●  控制精准,任意选择播放点。

    缺点

    ●  服务端实现复杂。

    ●  代理服务器弱:数量少,优化少。

    ●  无路由器防火墙穿透

    ●  管流分离:需要1-3个通道。

    HLS(HTTP Live Streaming)

    简介

    HTTP Live Streaming(缩写是HLS)是一个由苹果公司提出的基于HTTP流媒体网络传输协议。是苹果公司QuickTime XiPhone软件系统的一部分。它的工作原理是把整个流分成一个个小的基于HTTP的文件来下载,每次只下载一些。当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源,允许流媒体会话适应不同的数据速率。在开始一个流媒体会话时,客户端会下载一个包含元数据的extended M3U (m3u8) playlist文件,用于寻找可用的媒体流。

    协议:短链接HTTP

    原理:集合一段时间数据,生成ts切片文件,更新m3u8

    延迟:>10秒

    优点

    ●  性能好:和http一样。

    ●  穿墙:和http一样。

    ●  原生支持很好:iOS上支持完美,Android上支持差些。PC/flash上现在也有各种as插件支持HLS。

    缺点

    ●  实时性差:与ts切片长度有关,大约3个切片长度时间的延迟,基本上HLS的延迟在10秒以上。

    ●  文件碎片:若分发HLS,码流低,切片较小时,会导致太多的文件碎片

    流媒体服务器

    主要介绍

    1. NGINX-rtmp
    2. Node-media-server
    3. livego
    4. SRS

    NGINX-rtmp

    简介:基于NGINX的流媒体服务器

    支持协议:RTMP/HLS/MPEG-DASH

    支持平台:Linux/FreeBSD/MacOS/Windows

    官网:https://github.com/arut/nginx-rtmp-module

    如果是windows平台,可直接下载编译好的文件

    https://github.com/illuspas/nginx-rtmp-win32

    Node-media-server

    简介:A Node.js implementation of RTMP/HTTP-FLV/WS-FLV/HLS/DASH/MP4 Media Server

    支持协议:RTMP/HTTP-FLV/WS-FLV/HLS/DASH

    支持平台:Windows/Linux/Unix

    官网:https://github.com/illuspas/Node-Media-Server/

    一分钟部署一个流媒体服务

    https://github.com/illuspas/Node-Media-Server/wiki/%E4%B8%80%E5%88%86%E9%92%9F%E9%83%A8%E7%BD%B2%E4%B8%80%E4%B8%AA%E6%B5%81%E5%AA%92%E4%BD%93%E6%9C%8D%E5%8A%A1

    livego

    简介:纯 Go 写的直播服务器

    支持协议:RTMP/AMF/HLS/HTTP-FLV

    支持平台:Windows/Linux/MacOS

    官网:https://github.com/gwuhaolin/livego

    SRS

    简介:SRS定位是运营级的互联网直播服务器集群,追求更好的概念完整性和最简单实现的代码。

    支持协议:RTMP/RTSP/HSL/HTTP-FLV

    支持平台:Linux/MacOS

    官网:https://github.com/ossrs/srs

    这个功能比较强大,官网文档很详细,具体去官网看吧

    如果想在windows体验,可下载网友修改的版本

    https://github.com/illuspas/srs-win32

    导致延迟因素

    网络延时

    网络延时这里指的是从主播端采集,到观众端播放,之间的时间差。这里不考虑主播段采集对视频进行编码的时间,以及观众端观看对视频进行解码的时间,仅考虑网络传输中的延时。例如说下图中的网络延时:

    另外,数据传输过程中还涉及到逻辑上的交互,例如包的重传以及确认,以及缓存上的一些逻辑等,会在这个基础上又增加很多。

    那么来简单估算一下大概的网络延时。众所周知,光在真空中的速度约为300,000km/s,而在其他介质中光速会大大降低,所以在普通光纤中,工程上一般认为传输速度是200,000km/s。从现实上来说,可以参考如下:

    路线

    距离(km)

    往返时延(ms)

    北京到上海

    1,200

    12

    北京到纽约

    11,000

    110

    赤道周长

    40,000

    400

    所以说,在节点较少、网络情况较好的情况下,那么网络延时对应也是最小,加上一定的缓存,可以控制延时在1s~2s左右。但是节点多、网络差的情况下,网络延时会对应增大,经验来说延时可以达到15s以上。

    网络抖动

    网络抖动,是指数据包的到达顺序、间隔和发出时不一致。比如说,发送100个数据包,每个包间隔1s发出。结果第27个包在传输过程中遇到网络拥塞,造成包27不是紧跟着26到达的,而是延迟到87后面才达。在直播中,这种抖动的效果实际上跟丢包是一样的。因为你不能依照接收顺序把内容播放出来,否则会造成失真。

    网络抖动,会造成播放延时对应增大。如果网络中抖动较大,会造成播放卡顿等现象。

    如上图所示,主播端t3和t5发出的包,分别在t3'和t5'到达,但是中间延时增大,即发生了网络抖动。这样造成观众端观看视频的延时会不断增大。

    网络丢包

    CDN直播中用到的RTMP、HLS、HTTP FLV等协议都是在TCP的基础之上。TCP一个很重要的特性是可靠性,即不会发生数据丢失的问题。为了保证可靠性,TCP在传输过程中有3次握手,见下图。首先客户端会向服务端发送连接请求,服务端同意后,客户端会确认这次连接。这就是3次握手。接着,客户端就开始发送数据,每次发送一批数据,得到服务端的“收到”确认后,继续发送下一批。TCP为了保证传到,会有自动重传机制。如果传输中发生了丢包,没有收到对端发出的“收到”信号,那么就会自动重传丢失的包,一直到超时。

    由于互联网的网络状况是变化的,以及主播端的网络状况是无法控制的。所以当网络中丢包率开始升高时,重传会导致延时会不断增大,甚至导致不断尝试重连等情况,这样不能有效的缓存,严重情况下会导致观众端视频无法观看。

    RTMP累积延迟

    此延迟只发生在RTMP协议中

    RTMP有个弱点就是累积误差,原因是RTMP基于TCP,而TCP不会丢包,(可能丢包,但是利用TCP的重传机制避免)。

    所以当网络状态差时,服务器会将包缓存起来,导致累积的延迟;

    待网络状况好了,就一起发给客户端。

    这个的对策就是,当客户端的缓冲区很大,就断开重连。

    GOP-Cache

    图像群组Group opictures,GOP)

    原理比较复杂,这里就不班门弄斧了,具体可以Google

    RTMP延迟

    图片来自:https://www.processon.com/view/56ebb341e4b01c9aeb5f137f

    看完上图你大概就能明白了,rtmp的延迟是和gop挂钩的。

    那么,为什么rtsp延迟会比rtmp低呢?因为,它是精确控制的,可以跳出这个以gop组为单位的控制。

    视频基本属性

    帧率(frame rate)

    帧指的是码流中的单张画面,帧率指单位时间内码流的帧数,单位fps(frame per second)。我们看到的视频是由一帧帧的画面,也就是一张张的图片构成;如果一秒钟跑过去的图片有24张,帧率就是24帧/秒(fps);只有8张,帧率就是8帧/秒(fps);帧率越大,画面就越流畅,当然大到一定程度,也不需要过大了,一方面肉眼也看不出有毛区别,另一方面电脑吃不消啊!

     

    常见帧率

    电影:23.976fps

    电视(PAL):25fps

    电视(NTSC):29.97fps

    CRT显示器:60Hz-85Hz

    液晶显示器:60Hz-75Hz

    3D显示器: 120Hz

    分辨率(resolution)

    分辨率指的是画面的尺寸大小,分辨率越高,图像越大。

    一般的,在码率一定的情况下,分辨率越高,视频质量越差。

    分辨率有图像分辨率与显示分辨率两种,图像分辨率指图像的尺寸大小,显示分辨率指屏幕分辨率。

    对于视频而言,有一些固定尺寸的分辨率标准,如D1(720×576)、4CIF(704×576)、VGA(640×480)、SVGA(800×600)、VXGA(1600×1200)等,后来对于固定比例(16:9)的画面,分辨率的的表示方法为纵向高度加扫描方式,如720P(1280×720,逐行扫描)、1080P(1920×1080,逐行扫描)、1080I(1920×1080,隔行扫描),再到后面,使用横向像素描述,如2K(2048×1536或2560×1440或2560×1600)、4K(4096×2160或3840×2160)、8K(7680×4320)。

    码率(bit rate)

    码率即比特率,指单位时间内产生的数据位,单位bps(bit per second),1Mbps=1024kbps=1048576bps。一般的,分辨率一定的情况下,码率越高,视频质量越好。

    (*注意bps与B/s的区别,1B/s=8bps。)

    通常,720P的码流码率在2~4Mbps左右,1080P的码流码率在4~8Mbps左右,对于用户来说则是宽带要求,要看720P的视频需要至少2M的带宽,要看1080P的视频需要至少4M的带宽,当前国内的网络环境下,上下行速率不对等,如果主播要使用高清视频,还得确保主播上行带宽足够。

    编码方式

    平常我们总在想,如何让视频文件更小,让视频更清晰呢?答案就在码率上,对码率进行处理,就叫做编码方式,一般有CBR/ABR/VBR三种方式.

     

    CBR全称constant bitrate,意思是固定码率,就是在整个视频当中,码率固定不变;

    VBR全称Variable Bitrate,意为可变码率。其实在视频当中,画面内容越丰富,所需码率越高,成像质量也会越好,画面内容不怎么丰富的地方用高码率就是浪费,所以可变码率根据画面内容的丰富程度自动调节,保证成像质量的同时,让文件变得更小。所以要让视频文件更小,内容更清晰,采用VBR的编码方式,并设定科学的数值,就是解决问题的关键。

    ABR全称average bitrate ,意为平均码率,是一种介于CBR和VBR之间的折中方式。

    Codec 视频编码方式

    其中,MPEG-1的编码用于老VCD,MPEG-2的编码用于DVD,之后的MPEG-4被用于更多更广泛的平台,这里的MPEG-4就是传说中的MP4;

    另外呢,还有一个叫做国际电传视讯联盟(ITU)主导的另一套编码方式,称为H.26X系列,之后与MPEG合作弄出了H.264编码方式,成为如今最热门的编码方式。

    Container format视频封装格式

    参考:https://en.wikipedia.org/wiki/Comparison_of_video_container_formats

    主要封装格式一览

    名称

    推出机构

    流媒体

    支持的视频编码

    支持的音频编码

    目前使用领域

    AVI

    Microsoft Inc.

    不支持

    几乎所有格式

    几乎所有格式

    BT下载影视

    MP4

    MPEG

    支持

    MPEG-2, MPEG-4, H.264, H.263等

    AAC, MPEG-1 Layers I, II, III, AC-3等

    互联网视频网站

    TS

    MPEG

    支持

    MPEG-1, MPEG-2, MPEG-4, H.264

    MPEG-1 Layers I, II, III, AAC,

    IPTV,数字电视

    FLV

    Adobe Inc.

    支持

    Sorenson, VP6, H.264

    MP3, ADPCM, Linear PCM, AAC等

    互联网视频网站

    MKV

    CoreCodec Inc.

    支持

    几乎所有格式

    几乎所有格式

    互联网视频网站

    RMVB

    Real Networks Inc.

    支持

    RealVideo 8, 9, 10

    AAC, Cook Codec, RealAudio Lossless

    BT下载影视

     

    如何降低延迟时间

    参考:

    FFEMPEG方面

    wiki:StreamingGuide

    https://trac.ffmpeg.org/wiki/StreamingGuide

    Low-Latency Live Streaming your Desktop using ffmpeg

    http://fomori.org/blog/?p=1213

    ffmpeg的转码延时测试与设置优化

    https://blog.csdn.net/fireroll/article/details/51902018

    FFmpeg推流延迟10秒问题记录

    https://blog.csdn.net/vanjoge/article/details/79545490

    ffplay播放视频源延时的参数设置

    https://blog.csdn.net/cai6811376/article/details/52637158

    Web直播系列4——ffmpeg实时推流+nginx负载均衡降低直播延时_1

    https://blog.csdn.net/zzhang_12/article/details/79798027

    ffmpeg拉流rtmp音频实时数据有延时的解决方法

    https://blog.csdn.net/a1317338022/article/details/78226834

    如何实现1080P延迟低于500ms的实时超清直播传输技术

    http://windrunnerlihuan.com/2016/09/18/%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B01080P%E5%BB%B6%E8%BF%9F%E4%BD%8E%E4%BA%8E500ms%E7%9A%84%E5%AE%9E%E6%97%B6%E8%B6%85%E6%B8%85%E7%9B%B4%E6%92%AD%E4%BC%A0%E8%BE%93%E6%8A%80%E6%9C%AF/

    FFMPEG参数说明

    参考:

    https://blog.csdn.net/leixiaohua1020/article/details/12751349

    https://trac.ffmpeg.org/wiki/Encode/H.264

    主要参数

    • -i——设置输入档名。
    • -f——设置输出格式。
    • -y——若输出文件已存在时则覆盖文件。
    • -fs——超过指定的文件大小时则结束转换。
    • -t——指定输出文件的持续时间,以秒为单位。
    • -ss——从指定时间开始转换,以秒为单位。
    • -t从-ss时间开始转换(如-ss 00:00:01.00 -t 00:00:10.00即从00:00:01.00开始到00:00:11.00)。
    • -title——设置标题。
    • -timestamp——设置时间戳。
    • -vsync——增减Frame使影音同步。
    • -c——指定输出文件的编码。
    • -metadata——更改输出文件的元数据
    • -help——查看帮助信息。

    视频参数

    • -b:v——设置视频流量,默认为200Kbit/秒。(单位请引用下方注意事项
    • -r——设置帧率值,默认为25。
    • -s——设置画面的宽与高。
    • -aspect——设置画面的比例。
    • -vn——不处理视频,于仅针对声音做处理时使用。
    • -vcodec( -c:v )——设置视频视频编解码器,未设置时则使用与输入文件相同之编解码器。

    声音参数

    • -b:a——设置每Channel(最近的SVN版为所有Channel的总合)的流量。(单位请引用下方注意事项
    • -ar——设置采样率。
    • -ac——设置声音的Channel数。
    • -acodec ( -c:a ) ——设置声音编解码器,未设置时与视频相同,使用与输入文件相同之编解码器。
    • -an——不处理声音,于仅针对视频做处理时使用。
    • -vol——设置音量大小,256为标准音量。(要设置成两倍音量时则输入512,依此类推。)

    注意事项

    • 以-b:v及-b:a首选项流量时,根据使用的ffmpeg版本,须注意单位会有kbits/sec与bits/sec的不同。(可用ffmpeg -h显示说明来确认单位。)

    例如,单位为bits/sec的情况时,欲指定流量64kbps时需输入 -b:a 64k;单位为kbits/sec的情况时则需输入 -b:a 64。

    • 以-acodec及-vcodec所指定的编解码器名称,会根据使用的ffmpeg版本而有所不同。例如使用AAC编解码器时,会有输入aac与libfaac的情况。此外,编解码器有分为仅供解码时使用与仅供编码时使用,因此一定要利用ffmpeg -formats确认输入的编解码器是否能运作。

    直播中常见参数

    -preset

    按编码速度的内置参数,内置的编码设置有:

    1. ultrafast
    2. superfast
    3. veryfast
    4. faster
    5. fast
    6. medium
    7. slow
    8. slower
    9. veryslow
    10. placebo

    按快到慢排列,默认为medium级,当然越慢效果越好,但是体积会增大,一般最求高质量用veryslow就够了。

    -tune

    按不同的源或者不用的应用场景的内置参数

    1. film:电影、真人类型
    2. animation:动画
    3. grain:需要保留大量的grain时用
    4. stillimage:静态图像编码时使用
    5. psnr:为提高psnr做了优化的参数
    6. ssim:为提高ssim做了优化的参数
    7. fastdecode:可以快速解码的参数
    8. zerolatency:零延迟,用在需要非常低的延迟的情况下,比如电视电话会议的编码

    在命令行中输入:ffmpeg -h encoder=libx264

    参考:

    https://my.oschina.net/u/3733374/blog/1581609

    https://www.zhihu.com/question/23651189

    https://blog.csdn.net/leixiaohua1020/article/details/18893769

    https://sdk.cn/news/5556

     

    展开全文
  • 媒体解码及H.264编码推

    千次阅读 2020-05-08 20:36:39
    Opencv解析视频 像素格式转换 FFmpeg进行H.264编码 FFmpeg进行格式封装和推 这里我们使用了FFmpge的sdk和Opencv的sdk。为了方便测试,我们直接使用在线的rtsp网络。rtmp://live.hkstv.hk.lxdns.com/live/hks...

    简介

    • 相关理论
    • 程序流程
    • Opencv解析视频流
    • 像素格式转换
    • FFmpeg进行H.264编码
    • FFmpeg进行格式封装和推流

    这里我们使用了FFmpge的sdk和Opencv的sdk。为了方便测试,我们直接使用在线的rtsp网络流。rtmp://live.hkstv.hk.lxdns.com/live/hks这个是香港卫视的rtsp流,可以用vlc播放器测试是否可以播放。

    FFmpeg支持的像素格式

    1 所有的像素格式的名称都是以“AV_PIX_FMT_”开头
    2 像素格式名称后面有“P”的,代表是planar格式,否则就是packed格式。
    Planar格式不同的分量分别存储在不同的数组中,例如AV_PIX_FMT_YUV420P存储方式如下:

    • data[0]: Y1, Y2, Y3, Y4, Y5, Y6, Y7, Y8……
    • data[1]: U1, U2, U3, U4……
    • data[2]: V1, V2, V3, V4……
      Packed格式的数据都存储在同一个数组中,例如AV_PIX_FMT_RGB24存储方式如下:
      data[0]: R1, G1, B1, R2, G2, B2, R3, G3, B3, R4, G4, B4……

    3 像素格式名称后面有“BE”的,代表是Big Endian格式;名称后面有“LE”的,代表是Little Endian格式。

    封装相关类

    • AVFormatContext:统领全局的基本结构体。主要用于处理封装格式(FLV/MKV/RMVB等)。
    • AVIOContext:输入输出对应的结构体,用于输入输出(读写文件,RTMP协议等)。
    • AVStream,AVCodecContext:视音频流对应的结构体,用于视音频编解码。
    • AVFrame:存储非压缩的数据(视频对应RGB/YUV像素数据,音频对应PCM采样数据)
    • AVPacket:存储压缩数据(视频对应H.264等码流数据,音频对应AAC/MP3等码流数据)

    图像格式转换以及图像缩放

    sws_getContext
    初始化函数

    • int srcW,int srcH 为原始图像数据的高和宽;
    • int dstW,int dstH 为输出图像数据的高和宽;
    • enum AVPixelFormat srcFormat 为输入和输出图片数据的类型;eg:AV_PIX_FMT_YUV420、PAV_PIX_FMT_RGB24;
      int flags 为scale算法种类;eg:SWS_BICUBIC、SWS_BICUBLIN、SWS_POINT、SWS_SINC;
    • SwsFilter *srcFilter ,SwsFilter *dstFilter,const double *param 可以不用管,全为NULL即可
      sws_scale
      执行图像格式转换以及图像缩放
    • struct SwsContext *c 为sws_getContext函数返回的值;
    • const uint8_t *const srcSlice[],uint8_t *const dst[] 为输入输出图像数据各颜色通道的buffer指针数组;
    • const int srcStride[],const int dstStride[] 为输入输出图像数据各颜色通道每行存储的字节数数组;
    • int srcSliceY 为从输入图像数据的第多少列开始逐行扫描,通常设为0;
    • int srcSliceH 为需要扫描多少行,通常为输入图像数据的高度;
      sws_freeContext
      程序流程

    大体上分四个大步骤:

    1.各种初始化

    • Opencv读取视频流
    • 像素格式转换
    • FFmpeg进行H.264编码
    • FFmpeg进行视频格式封装。
    • FFmpeg进行推流

    接下来我们来细化流程。

    Opencv读取视频流

    打开并读取视频帧使用VideoCapture类。open来打开。打开完成后可获取相关的视频信息。如尺寸,fps等

    //获取视频帧的尺寸
    int inWidth = cam.get(CAP_PROP_FRAME_WIDTH);
    int inHeight = cam.get(CAP_PROP_FRAME_HEIGHT);
    int fps = cam.get(CAP_PROP_FPS);
    

    真正的读取视频帧可以使用read()方法。保存在Mat中。而read()中主要分两个步骤

    使用grab()方法解码视频帧
    注意解码的步骤不许要做,保证后面的数据能够正确解析
    使用retrieve将yuv转换为rgb数据
    这里的yuv和rgb都是未压缩的数据,得到的rgb数据就可以直接显示。

    像素格式转换

    初始化格式转换上下文

    vsc = sws_getCachedContext(vsc,
        inWidth, inHeight, AV_PIX_FMT_BGR24,     //源宽、高、像素格式
        inWidth, inHeight, AV_PIX_FMT_YUV420P,//目标宽、高、像素格式
        SWS_BICUBIC,  // 尺寸变化使用算法
        0, 0, 0
    );
    

    初始化存放YUV数据的AVFrame

    AVFrame *yuv = NULL;
    yuv = av_frame_alloc();
    yuv->format = AV_PIX_FMT_YUV420P;
    yuv->width = inWidth;
    yuv->height = inHeight;
    yuv->pts = 0;
    //分配yuv空间
    int ret = av_frame_get_buffer(yuv, 32);
    

    rgb转yuv,这里要注意rgb和yuv的存储格式。前面FFmpeg支持的像素格式有讲到

    ///rgb to yuv
    //输入的数据结构
    uint8_t *indata[AV_NUM_DATA_POINTERS] = { 0 };
    //indata[0] bgrbgrbgr
    //plane indata[0] bbbbb indata[1]ggggg indata[2]rrrrr 
    indata[0] = frame.data;
    int insize[AV_NUM_DATA_POINTERS] = { 0 };
    //一行(宽)数据的字节数
    insize[0] = frame.cols * frame.elemSize();
    int h = sws_scale(vsc, indata, insize, 0, frame.rows, //源数据
        yuv->data, yuv->linesize);
    

    FFmpeg进行H.264编码

    编码的方法就比较简单了,传入AVFrame。然后再用AVPacket去接收即可,这里还有一点要注意就是,pts的设置。

    ///h264编码
    yuv->pts = vpts;
    vpts++;
    ret = avcodec_send_frame(vc, yuv);
    if (ret != 0)
        continue;
    ret = avcodec_receive_packet(vc, &pack);
    

    FFmpeg进行视频格式封装和推流

    需要强调的就是pts,dts,和duration的转换。前面H.264编码的时候,我们已经设置了pts。但是输出的time_base不一致,所以需要进行转换

    //计算pts dts和duration。
    pack.pts = av_rescale_q(pack.pts, vc->time_base, vs->time_base);
    pack.dts = av_rescale_q(pack.dts, vc->time_base, vs->time_base);
    pack.duration = av_rescale_q(pack.duration, vc->time_base, vs->time_base);
    

    完整源码

    #include <opencv2/highgui.hpp>
    #include <iostream>
    extern "C"
    {
    #include <libswscale/swscale.h>
    #include <libavcodec/avcodec.h>
    #include <libavformat/avformat.h>
    }
    #pragma comment(lib, "swscale.lib")
    #pragma comment(lib, "avcodec.lib")
    #pragma comment(lib, "avutil.lib")
    #pragma comment(lib, "avformat.lib")
    #pragma comment(lib,"opencv_world320d.lib")
    using namespace std;
    using namespace cv;
    int main(int argc, char *argv[])
    {
        //原地址
        char *inUrl = "http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8";
        //nginx-rtmp 直播服务器rtmp推流URL
        char *outUrl = "rtmp://192.166.11.13/live";
        //注册所有的编解码器
        avcodec_register_all();
        //注册所有的封装器
        av_register_all();
        //注册所有网络协议
        avformat_network_init();
        VideoCapture cam;
        Mat frame;
        namedWindow("video");
        //像素格式转换上下文
        SwsContext *vsc = NULL;
        //输出的数据结构 存储非压缩的数据(视频对应RGB/YUV像素数据,音频对应PCM采样数据)
        AVFrame *yuv = NULL;
        //编码器上下文
        AVCodecContext *vc = NULL;
        //rtmp flv 封装器
        AVFormatContext *ic = NULL;
        try
        {   
            /// 1 使用opencv打开源视频流
            cam.open(inUrl);
            if (!cam.isOpened())
            {
                throw exception("cam open failed!");
            }
            cout << inUrl << " cam open success" << endl;
            //获取视频帧的尺寸
            int inWidth = cam.get(CAP_PROP_FRAME_WIDTH);
            int inHeight = cam.get(CAP_PROP_FRAME_HEIGHT);
            int fps = cam.get(CAP_PROP_FPS);
            ///2 初始化格式转换上下文
            vsc = sws_getCachedContext(vsc,
                inWidth, inHeight, AV_PIX_FMT_BGR24,     //源宽、高、像素格式
                inWidth, inHeight, AV_PIX_FMT_YUV420P,//目标宽、高、像素格式
                SWS_BICUBIC,  // 尺寸变化使用算法
                0, 0, 0
            );
            if (!vsc)
            {
                throw exception("sws_getCachedContext failed!");
            }
            ///3 初始化输出的数据结构。未压缩的数据
            yuv = av_frame_alloc();
            yuv->format = AV_PIX_FMT_YUV420P;
            yuv->width = inWidth;
            yuv->height = inHeight;
            yuv->pts = 0;
            //分配yuv空间
            int ret = av_frame_get_buffer(yuv, 32);
            if (ret != 0)
            {
                char buf[1024] = { 0 };
                av_strerror(ret, buf, sizeof(buf) - 1);
                throw exception(buf);
            }
            ///4 初始化编码上下文
            //a 找到编码器
            AVCodec *codec = avcodec_find_encoder(AV_CODEC_ID_H264);
            if (!codec)
            {
                throw exception("Can`t find h264 encoder!");
            }
            //b 创建编码器上下文
            vc = avcodec_alloc_context3(codec);
            if (!vc)
            {
                throw exception("avcodec_alloc_context3 failed!");
            }
            //c 配置编码器参数
            vc->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; //全局参数
            vc->codec_id = codec->id;
            vc->thread_count = 8;
            vc->bit_rate = 50 * 1024 * 8;//压缩后每秒视频的bit位大小 50kB
            vc->width = inWidth;
            vc->height = inHeight;
            vc->time_base = { 1,fps };
            vc->framerate = { fps,1 };
            //画面组的大小,多少帧一个关键帧
            vc->gop_size = 50;
            vc->max_b_frames = 0;
            vc->pix_fmt = AV_PIX_FMT_YUV420P;
            //d 打开编码器上下文
            ret = avcodec_open2(vc, 0, 0);
            if (ret != 0)
            {
                char buf[1024] = { 0 };
                av_strerror(ret, buf, sizeof(buf) - 1);
                throw exception(buf);
            }
            cout << "avcodec_open2 success!" << endl;
            ///5 输出封装器和视频流配置
            //a 创建输出封装器上下文
            ret = avformat_alloc_output_context2(&ic, 0, "flv", outUrl);
            if (ret != 0)
            {
                char buf[1024] = { 0 };
                av_strerror(ret, buf, sizeof(buf) - 1);
                throw exception(buf);
            }
            //b 添加视频流   视音频流对应的结构体,用于视音频编解码。
            AVStream *vs = avformat_new_stream(ic, NULL);
            if (!vs)
            {
                throw exception("avformat_new_stream failed");
            }
            //附加标志,这个一定要设置
            vs->codecpar->codec_tag = 0;
            //从编码器复制参数
            avcodec_parameters_from_context(vs->codecpar, vc);
            av_dump_format(ic, 0, outUrl, 1);
            ///打开rtmp 的网络输出IO  AVIOContext:输入输出对应的结构体,用于输入输出(读写文件,RTMP协议等)。
            ret = avio_open(&ic->pb, outUrl, AVIO_FLAG_WRITE);
            if (ret != 0)
            {
                char buf[1024] = { 0 };
                av_strerror(ret, buf, sizeof(buf) - 1);
                throw exception(buf);
            }
            //写入封装头
            ret = avformat_write_header(ic, NULL);
            if (ret != 0)
            {
                char buf[1024] = { 0 };
                av_strerror(ret, buf, sizeof(buf) - 1);
                throw exception(buf);
            }
            //存储压缩数据(视频对应H.264等码流数据,音频对应AAC/MP3等码流数据)
            AVPacket pack;
            memset(&pack, 0, sizeof(pack));
            int vpts = 0;
            for (;;)
            {
                ///读取rtsp视频帧,解码视频帧
                if (!cam.grab())
                {
                    continue;
                }
                ///yuv转换为rgb
                if (!cam.retrieve(frame))
                {
                    continue;
                }
                imshow("video", frame);
                waitKey(1);
                ///rgb to yuv
                //输入的数据结构
                uint8_t *indata[AV_NUM_DATA_POINTERS] = { 0 };
                //indata[0] bgrbgrbgr
                //plane indata[0] bbbbb indata[1]ggggg indata[2]rrrrr 
                indata[0] = frame.data;
                int insize[AV_NUM_DATA_POINTERS] = { 0 };
                //一行(宽)数据的字节数
                insize[0] = frame.cols * frame.elemSize();
                int h = sws_scale(vsc, indata, insize, 0, frame.rows, //源数据
                    yuv->data, yuv->linesize);
                if (h <= 0)
                {
                    continue;
                }
                //cout << h << " " << flush;
                ///h264编码
                yuv->pts = vpts;
                vpts++;
                ret = avcodec_send_frame(vc, yuv);
                if (ret != 0)
                    continue;
                ret = avcodec_receive_packet(vc, &pack);
                if (ret != 0 || pack.size > 0)
                {
                    //cout << "*" << pack.size << flush;
                }
                else
                {
                    continue;
                }
                //计算pts dts和duration。
                pack.pts = av_rescale_q(pack.pts, vc->time_base, vs->time_base);
                pack.dts = av_rescale_q(pack.dts, vc->time_base, vs->time_base);
                pack.duration = av_rescale_q(pack.duration, vc->time_base, vs->time_base);
                ret = av_interleaved_write_frame(ic, &pack);
                if (ret == 0)
                {
                    cout << "#" << flush;
                }
            }
        }
        catch (exception &ex)
        {
            if (cam.isOpened())
                cam.release();
            if (vsc)
            {
                sws_freeContext(vsc);
                vsc = NULL;
            }
            if (vc)
            {
                avio_closep(&ic->pb);
                avcodec_free_context(&vc);
            }
            cerr << ex.what() << endl;
        }
        getchar();
        return 0;
    }
    

    原创作者:eric__
    原文链接:https://www.jianshu.com/p/f83ef0a6f5cc
    在这里插入图片描述
    欢迎关注我的微信公众号「码农突围」,分享Python、Java、大数据、机器学习、人工智能等技术,关注码农技术提升•职场突围•思维跃迁,20万+码农成长充电第一站,陪有梦想的你一起成长

    展开全文
  • 网络媒体(三)————RTP

    千次阅读 2019-07-28 13:49:30
    1. 简介 实时传输协议(RTP)为数据提供了具有实时特征的端对端传送服务,如在组播或单播网络服务下的交互式视频音频或模拟数据...如果底层网络提供组播方式,那么 RTP 可以使用该组播表传输数据到多个目的地。 ...
  • 网络监听与扫描攻击

    2020-10-10 16:42:25
    Nmap 是一个免费开放的网络扫描和嗅探工具包,也叫网络映射器(Network Mapper)。 Nmap 工具可以用来扫描电脑上开放的端口,确定哪些服务运行在哪些端口,并且推断出计算机运行的操作系统。通过使用该工具,可以...
  • TCPIP协议详解卷一.pdf,非扫描版。没下载分了,否则会让大家0分下载的。 目录如下: 第1章概述 第2章链路层 第3章IP:网际协议 第4章ARP:地址解析协议 第5章RARP:逆地址解析协议 第6章ICMP:Internet控制报文协议...
  • 首先我们从扫描二维码Activity MipcaActivityCapture.java 类入手该类主要是调用相机预览拍照内容,处理扫描后的结果,扫码成功震动,及扫描音效等。   首先我们看关键模块,相机拍摄预览用到为View控件 ...
  • Android知识点大扫描

    千次阅读 2011-07-27 17:29:05
    Android知识点大扫描什么是3G3G,全称为3rd Generation,中文含义就是指第三代数字通信。所谓3G,是指将无线通信与国际互联网等多媒体通信结合的新一代移动通信系统。 3G只是一种通信技术标准,符合这个标准的技术有...
  • Android 基于Zxing的二维码扫描优化

    千次阅读 2018-10-26 11:19:02
    最近公司项目App中要集成二维码扫描来适应在户外工作的时候,对码头集装箱等上面贴的A4纸张打印的二维码进行识别, 一般App二维码集成后,能扫出来就不管了,但是我们在集成成功后,根据用户反馈,在户外的环境下,很多...
  • 广 级录像机采用分量视频信号(component video)的记录方式,分量视频指的是亮度Y,色差U和V分别是三路模拟信号,他们通过三路导线传送并记录在模拟磁带的三路磁迹上。分量视频由于其具有 很宽的频带,可以提供...
  • 跨平台的端口扫描工具:nmap

    千次阅读 2008-01-14 10:40:00
    跨平台的端口扫描工具:nmapnamp是一个跨平台的端口扫描工具,它提供给管理员扫描整个网络的能力,并发现网络的安全弱点所在.nmap的下载地址是:http://insecure.org/nmap/Nmap支持的四种最基本的扫描方式: 1.TCP ...
  • 媒体

    千次阅读 2013-08-01 22:06:04
    所谓媒体是指采用流式传输的方式在Internet播放的媒体格式。 媒体又叫流式媒体,它是指商家用一个视频传送服务器把节目当成数据包发出,传送到网络上。用户通过解压设备对这些数据进行解压后,节目就会像发送...
  • 类入手该类主要是调用相机预览拍照内容,处理扫描后的结果,扫码成功震动,及扫描音效等。   首先我们看关键模块,相机拍摄预览用到为View控件SurfaceView 改控件提供了一个专用绘图面,嵌入在视图层次结构中。你...
  • 直播基础知识入门

    千次阅读 2019-04-30 15:55:03
    发送端源源不断地采集音视频数据,经过编码、封包、推,在经过中继分发网络(CDN)进行扩散传播,播放端再源源不断地下载数据并按时序进行解码播放。如此就实现了“边生成、边传输、边消费”的直播过程。 延迟:...
  • rtmp直播协议介绍

    千次阅读 2015-02-12 10:21:30
    rtmp协议是adobe公司发明的直播协议,是目前主流的视频上传协议。 2.术语 AMF(Action Message Format)是在flash和flex中与远程服务端交换数据的一种格式。它是二进制格式,Flash应用与服务端或数据库通过RPC...
  • 网络扫描工具Nmap使用教程(1)

    万次阅读 2014-01-08 13:52:48
    Mapper") 是一个免费开源的网络探测和安全审计(安全/端口扫描器)工具。 能做什么:主机发现,端口扫描,服务和版本探测,OS版本探测 能做什么:Nmap先进和方式使用原始的IP数据包,能够:
  • 媒体传输协议介绍

    千次阅读 2016-07-01 18:39:12
    媒体传输协议介绍一、RTSP协议介绍什么是rtsp? RTSP协议以客户服务器方式工作,,如:暂停/继续、后退、前进等。它是一个多媒体播放控制协议,用来使用户在播放从因特网下载的实时数据时能够进行控制, 因此 ...
  • C++流行的开源框架和库

    千次阅读 2020-03-05 01:39:25
    生物信息,基因学和生物技术 libsequence:用于表示和分析群体遗传学数据的C++库。 官网 SeqAn:专注于生物数据序列分析的算法和数据结构。 官网 Vcflib:用于解析和处理VCF文件的C++库。 官网 Wham:...
  • 10.3 单播、组播和任一播头 91 10.4 从IPv4到IPv6的过渡 93 10.5 小结 94 第四部分 IP互联 第11章 IP网络中的路由 95 11.1 路由基本知识 95 11.1.1 静态路由 96 11.1.2 距离-向量路由 99 11.1.3 链路-状态路由 100 ...
  • 媒体的各种知识点

    千次阅读 2016-07-29 10:47:11
    一 从TS开始  最近开始学习数字电视机顶盒的开发,从MPEG-2到DVB,看着看着突然就出现了一大堆表格,什么PAT、PMT、CAT……如此多的表该怎样深入了解呢?  我们知道,数字电视机顶盒接收到的是一段段的码...
  • TS讲解--什么是ts

    万次阅读 2016-01-23 21:22:01
    一 从TS开始  数字电视机顶盒接收到的是一段段的码,我们称之为TS(Transport Stream,传输),每个TS都携带一些信息,如Video、Audio以及我们需要学习的PAT、PMT等信息。因此,我们首先需要了解TS是...
  • 原文链接 译文PDF   4:2:0隔行扫描:本质上的破坏    当我们写第一篇有关色度的文章的时候,我们注意到一个问题,但并没有写下来。这个问题就是,即使当视频内容正确地标识为隔行扫描...
  • 或 码率 ,单位是kbps(千位每秒) 百度百科的解析 : 视频码率就是数据传输时单位时间传送的数据位数,一般我们用的单位是kbps即千位每秒。 个人见解 :个人认为百度百科解析的很不清楚,怎么去理解数据传输时...
  • TS分析

    万次阅读 多人点赞 2013-12-26 17:07:51
    一 从TS开始  数字电视机顶盒接收到的是一段段的码,我们称之为TS(Transport Stream,传输),每个TS都携带一些信息,如Video、Audio以及我们需要学习的PAT、PMT等信息。因此,我们首先需要了解TS是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,964
精华内容 5,985
关键字:

组播流扫描