热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

iOS直播(流媒体)基础原理篇

思维导图常用的名词:流媒体开发网络层(socket或st):负责传输;协议层(rtmp或hls):负责网络打包;封装层(flv、ts):负责编解码数据的封装编码层(h.264和a

思维导图

在这里插入图片描述


常用的名词:


  • 流媒体开发
    • 网络层(socket或st):负责传输;
    • 协议层(rtmp或hls):负责网络打包;
    • 封装层(flv、ts):负责编解码数据的封装
    • 编码层(h.264和aac):负责图像,音频压缩
  • 帧:每帧代表一幅静止的图像
    • I帧:(关键帧)保留一副完整的画面,解码时只需要本帧数据就可以完成(因为包含完整画面;
    • P帧:(差别帧)保留这一帧跟之前帧的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(P帧没有完整画面数据,只有与前一帧的画面差别的数据;
    • B帧:(双向差别帧)保留的是本帧与前后帧的差别,解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面.
  • GOP:(Group of Pictures)画面组,一个GOP就是一组连续的画面,每个画面都是一帧,一个GOP就是很多帧的集合
  • 码率:图片进行压缩后每秒显示的数据量
  • 帧率:每秒显示的图片数。影响画面流畅度,与画面流畅度成正比:帧率越大,画面越流畅;帧率越小,画面越有跳动感(由于人类眼睛的特殊生理结构,如果所看画面之帧率高于16的时候,就会认为是连贯的,此现象称之为视觉暂留。并且当帧速达到一定数值后,再增长的话,人眼也不容易察觉到有明显的流畅度提升了)。
  • 分辨率:(矩形)图片的长度和宽度,即图片的尺寸
  • 压缩前的每秒数据量:帧率X分辨率(单位应该是若干个字节)
    压缩比:压缩前的每秒数据量/码率 (对于同一个视频源并采用同一种视频编码算法,则压缩比越高,画面质量越差).
  • 视频文件格式:
    • 文件的后缀,比如.wmv,.mov,.mp4,.avi;
    • 主要用处,根据文件格式,系统会自动判断用什么软件打开,
    • 注意: 随意修改文件格式,对文件的本身不会造成太大的影响,比如把avi改成mp4,文件还是avi.
  • 视频封装格式
    • 一种储存视频信息的容器,流式封装可以有TS、FLV等,索引式的封装有MP4,MOV,AVI等;
    • 主要作用:一个视频文件往往会包含图像和音频,还有一些配置信息(如图像和音频的关联,如何解码它们等),这些内容需要按照一定的规则组织、封装起来.
    • 注意:会发现封装格式跟文件格式一样,因为一般视频文件格式的后缀名即采用相应的视频封装格式的名称, 所以视频文件格式就是视频封装格式
  • 视频封装格式和视频压缩编码标准
    • 就好像项目工程和编程语言,封装格式就是一个项目的工程,视频编码方式就是编程语言, 一个项目工程可以用不同语言开发

音视频采集


  • 视频、音频硬件设备
    • CCD:图像传感器: 用于图像采集和处理的过程,把图像转换成数字信号。拾音器:声音传感器: 用于声音采集和处理的过程,把声音转换成电信号
    • 音频采样数据:一般都是PCM格式
      • 原理:主要通过设备将环境中的模拟信号采集成 PCM 编码的原始数据,然后编码压缩成 MP3 等格式的数据分发出去。常见的音频压缩格式有:MP3,AAC,HE-AAC,Opus,FLAC,Vorbis (Ogg),Speex 和 AMR等
      • 技术难点:延时敏感、卡顿敏感、噪声消除(Denoise)、回声消除(AEC)、静音检测(VAD)和各种混音算法等
    • 音频采集主要的几个参数:
      • 采样率(samplerate):采样就是把模拟信号数字化的过程,采样频率越高,记录这一段音频信号所用的数就越大,同时音频质量也就越高;
      • 位宽:每一个采样点都需要用一个数值来表示大小,这个数值的数据类型大小可以是:4bit,8bit,16bit,32bit等等.位数也越多就表示越精细,声音质量自然就越好,而数据量也会成倍增加.我们在音频采集过程中一般使用的都是8bit或者16bit的;
      • 声道数:由于音频的采集和播放是可以叠加的.因此,可以从多个音频采集声音,并分别输出到不同的扬声器,故声道数一般表示声音录制的音源数量或会放时相应的扬声器数量.声音1和2分别称为单声道和双声道,是比较常见的声道
      • 音频帧:音频跟视频很不一样.视频每一帧就是一张图像,音频数据是流式的,本身没有明确的一帧帧的概念.在实际应用中,为了音频算法处理/传输的方便,一般约定俗称取2.5ms~60ms为单位的数据量为一帧音频.这个时间被称为”采样时间”.其长度没有特别的标准,它是根据编解码器和具体应用的需求来决定的.
      • 小结:可以我们可以计算一下音频帧的大小.假设某音频信号是采样率为8KHZ,双通道,位宽为16bit,20ms一帧,则一帧音频数据的大小为:size=8000216bit*0.02s=640byte
    • 视频采样数据::一般都是YUV,或RGB格式,采集到的原始音视频的体积是非常大的,需要经过压缩技术处理来提高传输效率;
      • 原理:主要由摄像头等设备拍摄成 YUV 编码的原始数据,然后经过编码压缩成 H.264 等格式的数据分发出去。常见的视频封装格式有:MP4、3GP、AVI、MKV、WMV、MPG、VOB、FLV、SWF、MOV、RMVB 和 WebM 等
      • 技术难点:设备兼容性差、延时敏感、卡顿敏感以及各种对图像的处理操作如美颜和水印等.
      • 视频采集的主要几个参数
      • 图像传输格式:通过影像传输格式(common intermediate Format)是影讯会议(video conference)中常用的影像传输格式化;
      • 图像格式:通常采用YUV格式存储原始数据信息,其中包含8位表示黑白图像灰度值,以及可由RGB三种色彩组合后成的彩色图像;
      • 传输通道:正常情况下视频的拍摄只需1路通道,随着VR和AR技术的日渐成熟,为了拍摄一个完整的360视频,可能需要通过不同角度拍摄,然后通过多通道传输后合成
      • 分辨率:随着设备屏幕尺寸的日益增多,视频采集过程中原始视频分辨率起着越来越重要的作用,后续处理环节中使用的所有视频分辨率的定义都以原始视频分辨率为基础.视频采集卡能支持的对大点阵反应了其分辨率的性能.
      • 采样频率:采样频率卡反映了采集卡处理图像的速度和能力.再进行高度图像采集时,需要注意采集卡的采样频率是否满足要求.采样率越高,图像质量越高,同时保存这些图像信息的数据量也越大.
  • CCD与CMOS之间的区别:
    • CCD是一种半导体器件,能够把光学影像转化为数字信号,CCD上植入的微小光敏物质称作像素(Pixel),一块CCD上包含的像素数越多,其提供的画面分辨率也就越高.CCD上有许多排列整齐的电容,能感应光线,并将影像转变成数字信号.
    • CMOS是互补金属氧化物半导体,是电压控制的一种放大器件,是组成CMOS数字集成电路的基本单元.
    • 性能区别
      • ISO感光度:由于CMOS每个像素由四个晶体管与一个感光二极管构成,还包含了放大器与数模转换电路,过多的额外设备缩小了单一像素感光区域的表面积,因此相同像素下,同样的尺寸,CMOS的感光度会低于CCD
      • 分辨率:由于CMOS传感器的每个像素都比CCD传感器复杂,其像素尺寸很难达到CCD传感器的水平,因此,当我们比较相同尺寸的CCD与CMOS时,CCD传感器的分辨率通常会优于CMOS传感器
      • 噪点:由于CMOS每个感光二极管都需搭配一个放大器,如果以百万像素计,那么就需要百万个以上的放大器,而放大器属于模拟电路,很难让每个放大器所得到的结果保持一致,因此与只有一个放大器放在芯片边缘的CCD传感器相比,CMOS传感器的噪点就会增加很多,影响图像品质
      • 耗电量:CMOS传感器的图像采集方式为主动式,感光二极管所产生的电荷会直接由旁边的电晶体做放大输出;而CCD传感器为被动式采集,必须外加电压让每个像素中的电荷移动至传输通道。而这外加电压通常需要12~18V,因此CCD还必须有更精密的电源线路设计和耐压强度,高驱动电压使CCD的耗电量远高于CMOS。CMOS的耗电量仅为CCD的1/8到1/10

视频处理


  • 视频处理原理
    • 因为视频最终也是通过GPU,一帧一帧渲染到屏幕上的,所以我们可以利用OpenGL ES,对视频帧进行各种加工,从而视频各种不同的效果
    • 作用:美颜算法,视频的模糊效果,水印,滤镜和可扩展处理都是在这个环节做的
  • 视频处理框架
    • GPUImage
      • GPUImage是一个基于OpenGL ES的一个强大的图像/视频处理框架,封装好了各种滤镜同时也可以编写自定义的滤镜,其本身内置了多达120多种常见的滤镜效果。
    • OpenGL
      • OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可)。OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库。
    • OpenGL ES
      • OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL三维图形 API 的子集,针对手机、PDA和游戏主机等嵌入式设备而设计。
  • 滤镜处理的原理
    • 就是把静态图片或者视频的每一帧进行图形变换再显示出来,它的本质就是像素点的坐标和颜色变化.

音视频编码压缩


  • 视频编码框架
    • FFmpeg:是一个跨平台的开源视频框架,能实现对音频进行重采样,转换采样格式,对视频、音频和字幕流等编码/解码,对视频进行封装/解封装,进行视频的一些后期处理,视频图像缩放,颜色空间转换,滤镜功能等等
    • X264:把视频原数据YUV编码压缩成H.264格式
    • VideoToolbox:苹果自带的视频硬解码和硬编码API
    • AudioToolbox:苹果自带的音频硬解码和硬编码API
  • 软编码和硬编码的区别?
    • 软编码:使用CPU进行编码;实现直接、简单,参数调整方便,升级易,但CPU负载重,性能较硬编码低,低码率下质量通常比硬编码要好一点。编码比硬编码要复杂一些.
    • 硬编码:使用非CPU进行编码,如显卡GPU、专用的DSP、FPGA、ASIC芯片等;性能高,低码率下通常质量低于硬编码器,但部分产品在GPU硬件平台移植了优秀的软编码算法(如X264)的,质量基本等同于软编码
    • 主要区别:软编码可以在运行时确定,修改;而硬编码是不能够改变的
    • 目前的主流GPU加速平台:Intel、AMD、NVIDIA
    • 目前主流的GPU平台开发框架:
      • CUDA:NVIDIA的封闭编程框架,通过框架可以调用GPU计算资源;
      • AMD APP:AMD为自己的GPU提出的一套通用并行编程框架,标准开放,通过在CPU、GPU同时支持OpenCL框架,进行计算力融合
      • OpenCL:开放计算语言,为异构平台编写程序的该框架,异构平台可包含CPU、GPU以及其他计算处理器,目标是使相同的运算能支持不同平台硬件加速.
      • Inel QuickSync:集成于Intel显卡中的专用视频编解码模块
  • 视频编码技术
    • 视频压缩编码标准:使用MPEG/H.264对视频编码或者视频解码
    • 视频编码的意义:原始视频数据存储空间大,一个 1080P 的 7 s 视频需要 817 MB,原始视频数据传输占用带宽大,10 Mbps 的带宽传输上述 7 s 视频需要 11 分钟,而经过 H.264 编码压缩之后,视频大小只有 708 k ,10 Mbps 的带宽仅仅需要 500 ms ,可以满足实时传输的需求,所以从视频采集传感器采集来的原始视频势必要经过视频编码(将视频像素数据压缩成为视频码流,从而降低视频的数据量。如果视频不经过压缩编码的话,体积通常是非常大的,一部电影可能就要上百G的空间).
    • 基本原理(为什么巨大的原始视频可以编码成很小的视频呢?这其中的技术是什么呢):
      • 空间冗余:图像相邻像素之间有较强的相关性;
      • 时间冗余:视频序列的相邻图像之间内容相似;
      • 编码冗余:不同像素值出现的概率不同;
      • 视觉冗余:人的视觉系统对某些细节不敏感;
      • 知识冗余:规律性的结构可由先验知识和背景知识得到.
    • 视频压缩的三种方式:
      • MPEG:一种视频压缩方式,它采用了帧间压缩,仅存储连续帧之间有差别的地方,从而达到较大的压缩比.
      • H.264/AVC:一种视频压缩方式,采用事先预测和与MPEG中的P-B帧一样的帧预测方法压缩,它可以根据需要产生适合网络情况传输的视频流,还有更高的压缩比,有更好的图象质量。
        • 注意1:如果是从单个画面清晰度比较,MPEG有优势;从动作连贯性上的清晰度,H.264有优势;
        • 注意2:由于264的算法更加复杂,程序实现烦琐,运行它需要更多的处理器和内存资源。因此,运行264对系统要求是比较高的;
        • 注意3:由于264的实现更加灵活,它把一些实现留给了厂商自己去实现,虽然这样给实现带来了很多好处,但是不同产品之间互通成了很大的问题,造成了通过A公司的编码器编出的数据,必须通过A公司的解码器去解这样尴尬的事情.
      • H.265/HEVC:一种视频压缩方式,基于H.264,保留原来的某些技术,同时对一些相关的技术加以改进,以改善码流,编码质量、延时和算法复杂度之间的关系,达到最优化设置。
        • H.265 是一种更为高效的编码标准,能够在同等画质效果下将内容的体积压缩得更小,传输时更快更省带宽.因为这里使用到的是I帧,P帧,B帧技术.
        • 帧内(Intraframe)压缩:当压缩一帧图像时,仅考虑本帧的数据而不考虑相邻帧之间的冗余信息,帧内一般采用有损压缩算法
        • 帧间(Interframe)压缩:时间压缩(Temporal compression),它通过比较时间轴上不同帧之间的数据进行压缩。帧间压缩一般是无损的
        • muxing(合成):将视频流、音频流甚至是字幕流封装到一个文件中(容器格式(FLV,TS)),作为一个信号进行传输
  • 音频编码技术
    • AAC、mp3:这些属于音频编码技术,压缩音频用
  • 码率控制
    • 常看见视频播放软件中的1024,720、高清、标清和流畅等,指的就是各种码率.
  • 视频封装格式
    • 名次解释:封装可以理解为采用哪种货车去运输,也就是媒体的容器.所谓容器,就是把编码器生成的多媒体内容(视频,音频,字幕,章节信息等)混合封装在一起的标准。容器使得不同多媒体内容同步播放变得很简单,而容器的另一个作用就是为多媒体内容提供索引,也就是说如果没有容器存在的话一部影片你只能从一开始看到最后,不能拖动进度条,而且如果你不自己去手动另外载入音频就没有声音
    • TS 是 一种流媒体封装格式,流媒体封装有一个好处,就是不需要加载索引再播放,大大减少了首次载入的延迟。如果片子比较长,mp4文件的索引相当大,影响用户体验。
    • 为什么要用TS? 这是因为两个TS片段可以无缝拼接,播放器能连续播放
    • FLV:是一种流媒体封装格式,由于它形成的文件极小、加载速度极快,使得网络观看视频文件成为可能。因此,FLV格式成为了当今主流视频格式
  • 常见的封装格式
    • AVI 格式(后缀为 .avi)
      • 优点:图像质量好;
      • 缺点:体积过于庞大,压缩标准不统一.最普通的现象就是高版本的window媒体播放器播放不了采用早起编码编辑的AVI格式视频,而低版本的window媒体播放器播放不了最新编码编辑的AVI格式视频.
    • DV-AVI 格式(后缀为 .avi)
    • QuickTime File Format 格式(后缀为 .mov)
      • 优点:具有较高的压缩比和比较完善的视频清晰度等特点,并可以保存alpha通道.
    • MPEG 格式(文件后缀可以是 .mpg .mpeg .mpe .dat .vob .asf .3gp .mp4等);
    • WMV 格式(后缀为.wmv .asf);
      • 优点:本地或者网络回放,丰富的流间关系以及扩展性等;
      • 缺点:WMV格式需要在网站上进行播放,需要安装Windows Media Player;
    • Real Video 格式(后缀为 .rm .rmvb);
    • Flash Video 格式(后缀为 .flv);
    • Matroska 格式(后缀为 .mkv);
    • MPEG2-TS 格式 (后缀为 .ts)
      • 目前,我们在流媒体传输.尤其是在直播中主要采用的就是FLV和MPEG2-TS格式,分别用于RTMP/HTTP-FLV和HLS协议.

推流


  • 数据传输框架
    • librtmp是用来传输RTMP协议格式的数据
  • 推送协议主要有三种:
    • RTSP(Real Time Streaming Protocol):实时流传送协议,是用来控制声音或影像的多媒体串流协议, 由Real Networks和Netscape共同提出的;
    • RTMP(Real Time Messaging Protocol):实时消息传送协议,是Adobe公司为Flash播放器和服务器之间音频、视频和数据传输 开发的开放协议;
    • HLS(HTTP Live Streaming):是苹果公司(Apple Inc.)实现的基于HTTP的流媒体传输协议;
  • 流媒体数据传输协议

  • RTMP是实时消息传输协议,Adobe Systems公司为Flash播放器和服务器之间音频、视频和数据传输开发的开放协议,因为是开放协议所以都可以使用了。
  • RTMP协议用于对象视频、音频的传输。这个协议建立在TCP协议或者轮询HTTP协议之上。
  • RTMP协议就像一个用来装数据包的容器,这些数据可以是FLV中的视音频数据。一个单一的连接可以通过不同的通道传输多路网络流,这些通道中的包都是按照固定大小的包传输的。chunk是消息包。
    • RTMP协议基于 TCP,是一种设计用来进行实时数据通信的网络协议,主要用来在 flash/AIR 平台和支持 RTMP 协议的流媒体/交互服务器之间进行音视频和数据通信。支持该协议的软件包括 Adobe Media Server/Ultrant Media Server/red5 等.
    • 它有三种变种:
      • RTMP工作在TCP之上的明文协议,使用端口1935;
      • RTMPT封装在HTTP请求之中,可穿越防火墙;
      • RTMPS类似RTMPT,但使用的是HTTPS连接;

  • RTMP 是目前主流的流媒体传输协议,广泛用于直播领域,可以说市面上绝大多数的直播产品都采用了这个协议。
  • RTMP协议就像一个用来装数据包的容器,这些数据可以是AMF格式的数据,也可以是FLV中的视/音频数据。一个单一的连接可以通过不同的通道传输多路网络流。这些通道中的包都是按照固定大小的包传输的。

  • 推流的一个整体流程;
    • 建立tcp连接
    • 建立rtmp连接,以及发送各种控制指令
    • 获取原始视频数据和音频数据
    • 对原始视频数据和音频数据进行压缩编码(实现音视频数据的编码,视频编码成h264,音频编码成aac)
    • 对编码后的视频数据和音频数据进行打包
    • 发送打包后的音频和视频数据

流媒体服务器处理


  • 常用服务器

  • CDN:(Content Delivery Network),即内容分发网络,将网站的内容发布到最接近用户的网络”边缘”,使用户可以就近取得所需的内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度.
  • CDN工作原理:比如请求流媒体数据(http请求)
    • 当用户点击网站页面上的内容URL,经过本地DNS系统解析,DNS系统会最终将域名的解析权交给CNAME指向的CDN专用DNS服务器;
    • CDN的DNS服务器将CDN的全局负载均衡设备IP地址返回用户;
    • 用户向CDN的全局负载均衡设备发起内容URL访问请求;
    • CDN全局负载均衡设备根据用户IP地址,以及用户请求的内容URL,选择一台用户所属区域的区域负载均衡设备,告诉用户向这台设备发起请求;
    • 区域负载均衡设备会为用户选择一台合适的缓存服务器提供服务,选择的依据包括:根据用户IP地址,判断哪一台服务器距用户最近;根据用户所请求的URL中携带的内容名称,判断哪一台服务器上有用户所需内容;查询各个服务器当前的负载情况,判断哪一台服务器尚有服务能力。基于以上这些条件的综合分析之后,区域负载均衡设备会向全局负载均衡设备返回一台缓存服务器的IP地址;
    • 全局负载均衡设备把服务器的IP地址返回给用户;
    • 用户向缓存服务器发起请求,缓存服务器响应用户请求,将用户所需内容传送到用户终端。如果这台缓存服务器上并没有用户想要的内容,而区域均衡设备依然将它分配给了用户,那么这台服务器就要向它的上一级缓存服务器请求内容,直至追溯到网站的源服务器将内容拉到本地;
    • DNS服务器根据用户IP地址,将域名解析成相应节点的缓存服务器IP地址,实现用户就近访问。使用CDN服务的网站,只需将其域名解析权交给CDN的GSLB设备,将需要分发的内容注入CDN,就可以实现网站内容加速。
  • 在流媒体上面的工作原理:
    • 上传流媒体数据到服务器(源站)
    • 源站存储流媒体数据
    • 客户端播放流媒体,向CDN请求编码后的流媒体数据
    • CDN的服务器响应请求,若节点上没有该流媒体数据存在,则向源站继续请求流媒体数据;若节点上已经缓存了该视频文件, 则跳到第6步。
    • 源站响应CDN的请求,将流媒体分发到相应的CDN节点上
    • CDN将流媒体数据发送到客户端
  • 回源:当有用户访问某一个URL的时候,如果被解析到的那个CDN节点没有缓存响应的内容,或者是缓存已经到期, 就会回源站去获取搜索。如果没有人访问,那么CDN节点不会主动去源站拿.
  • 带宽:在固定的时间可传输的数据总量, 比如64位、800MHz的前端总线,它的数据传输率就 等于64bit×800MHz÷8(Byte)=6.4GB/s ;
  • 负载均衡:由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助.通过某种负载分担技术,将外部发送来的请求均匀分配到对称结构中的某一台服务器上,而接收到请求的服务器独立地回应客户的请求.均衡负载能够平均分配客户请求到服务器列阵,籍此提供快速获取重要数据,解决大量并发访问服务问题. 这种群集技术可以用最少的投资获得接近于大型主机的性能。
  • QoS(带宽管理):限制每一个组群的带宽,让有限的带宽发挥最大的效用

拉流


  • 直播协议选择
    • 即时性要求较高或有互动需求的可以采用RTMP,RTSP;
    • 对于有回放或跨平台需求的,推荐使用HLS;
  • 直播协议对比 :
    在这里插入图片描述
    • HLS
      • 由Apple公司定义的用于实时流传输的协议,HLS基于HTTP协议实现,传输内容包括两部分,一是M3U8描述文件,二是TS媒体文件。可实现流媒体的直播和点播,主要应用在iOS系统。 HLS是以点播的技术方式来实现直播;
      • HLS是自适应码率流播,客户端会根据网络状况自动选择不同码率的视频流,条件允许的情况下使用高码率,网络繁忙的时候使用低码率,并且自动在二者间随意切换。这对移动设备网络状况不稳定的情况下保障流畅播放非常有帮助;
      • 实现方法:服务器端提供多码率视频流,并且在列表文件中注明,播放器根据播放进度和下载速度自动调整
      • HLS与RTMP对比:HLS主要是延时比较大,RTMP主要优势在于延时低
      • HLS协议的小切片方式会生成大量的文件,存储或处理这些文件会造成大量资源浪费
      • 相比使用RTSP协议的好处在于,一旦切分完成,之后的分发过程完全不需要额外使用任何专门软件,普通的网络服务器即可,大大降低了CDN边缘服务器的配置要求,可以使用任何现成的CDN,而一般服务器很少支持RTSP
      • HTTP-FLV是基于HTTP协议流式的传输媒体内容。相对于RTMP,HTTP更简单和广为人知,内容延迟同样可以做到1~3秒,打开速度更快,因为HTTP本身没有复杂的状态交互。所以从延迟角度来看,HTTP-FLV要优于RTMP
        • 特点:
        • 不是流媒体协议;
        • HTTP协议是共有协议,并有专门的机构进行维护;
        • HTTP协议没有特定的通道;
        • HTTP协议传输一般需要2~3个通道,命令和数据通道分离.
      • RTSP:实时流传输协议,定义了一对多应用程序如何有效地通过IP网络传送多媒体数据;
        • 特点:
        • 是流媒体协议;
        • RTSP协议是共有协议,并有专门的机构进行维护;
        • RTSP协议传输一般需要2~3个通道,命令和数据通道分离.
      • RTP:实时传输协议,RTP是建立在UDP协议上的,常与RTCP一起使用,其本身并没有提供按时发送机制或其它服务质量(QoS)保证,它依赖于低层服务去实现这一过程;
      • RTCP:RTP的配套协议,主要功能是为RTP所提供的服务质量(QoS)提供反馈,收集相关媒体连接的统计信息,例如传输字节数,传输分组数,丢失分组数,单向和双向网络延迟等等
      • RTMP协议:
        • 特点:
        • 是流媒体协议;
        • RTMP协议是Adobe的私有协议,未完全公开;
        • RTMP协议一般传输的是flv,f4v格式流;
        • RTMP一般在1个通道上传输命令和数据

音视频解码


  • 解封装
    • demuxing(分离):从视频流、音频流,字幕流合成的文件(容器格式(FLV,TS))中, 分解出视频、音频或字幕,各自进行解码;
  • 音频编码框架
    • fdk_aac:音频编码解码框架,PCM音频数据和AAC音频数据互转;
  • 解码介绍
    • 硬解码:用GPU来解码,减少CPU运算
      • 优点:播放流畅、低功耗,解码速度快
      • 缺点:兼容不好
    • 软解码:用CPU来解码
      • 优点:兼容好
      • 缺点:加大CPU负担,耗电增加、没有硬解码流畅,解码速度相对慢

播放


  • 一个典型的播放器可以分解成三部分UI、多媒体引擎和解码器:
    • 用户界面(UI):这是播放器最上层的部分.它通过三部分不同的功能特性定义了终端用户的观看体验:皮肤(播放器的外观设计),UI(所有可自定义的特性如播放列表和社交分享等)以及业务逻辑部分(特定的业务逻辑特性如广告,设备兼容性逻辑以及认证管理等)
    • 多媒体引擎:这里处理所有播放控制相关的逻辑,如描述文件的解析,视频片段的拉取,以及自适应码率规则的设定和切换等等
    • 解码器和DRM管理器:播放器最底层的部分是解码器和DRM管理器,这层的功能直接调用操作系统暴露出来的API,解码器的主要功能在于解码渲染视频内容,而DRM管理器则通过解密过程来控制是否有权播放
  • 用户界面(U)
    • UI层是播放器的最上层,它控制了你用户所能看到和交互的东西,同时也可以使用你自己的品牌来将其定制,为你的用户提供独特的用户体验。这一层最接近于我们说的前端开发部分。在UI内部,我们也包含了业务逻辑组件,这些组件构成了你播放体验的独特性,然终端用户没法直接和这部分功能进行交互.

  • UI用户的三大组件:
    • 皮肤—皮肤是对播放器视觉相关部分的统称:进度控条、按钮和动画图标等等
    • 逻辑—>U逻辑部分定义了播放过程中和用户交互方面所有可见的交互:播放列表、缩略图、播放频道的选择以及社交媒体分享等
    • 业务逻辑除了上面两部分可见的功能特性之外,还有一个不可见的部分,这部分构成了你业务的独特性:认证和支付、频道和播放列表的获取,以及广告等。这里也包含一些技术相关的东西,比如用于AB测试模块,以及和设备相关的配置这些配置用于在多种不同类型的设备之间选择多个不同的媒体引擎
  • 解码器和DRM管理器:
    • 解码器处理最底层播放相关的逻辑。它将不同封装格式的视频进行解包,并将其内容解码,然后将解码后的视频帧交给操作系统进行渲染,最终让终端用户看到

推荐阅读
  • 本文回顾了作者初次接触Unicode编码时的经历,并详细探讨了ASCII、ANSI、GB2312、UNICODE以及UTF-8和UTF-16编码的区别和应用场景。通过实例分析,帮助读者更好地理解和使用这些编码。 ... [详细]
  • 开发日志:高效图片压缩与上传技术解析 ... [详细]
  • 大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式
    大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • 在《Linux高性能服务器编程》一书中,第3.2节深入探讨了TCP报头的结构与功能。TCP报头是每个TCP数据段中不可或缺的部分,它不仅包含了源端口和目的端口的信息,还负责管理TCP连接的状态和控制。本节内容详尽地解析了TCP报头的各项字段及其作用,为读者提供了深入理解TCP协议的基础。 ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • 在使用 Qt 进行 YUV420 图像渲染时,由于 Qt 本身不支持直接绘制 YUV 数据,因此需要借助 QOpenGLWidget 和 OpenGL 技术来实现。通过继承 QOpenGLWidget 类并重写其绘图方法,可以利用 GPU 的高效渲染能力,实现高质量的 YUV420 图像显示。此外,这种方法还能显著提高图像处理的性能和流畅性。 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
author-avatar
甄之恋
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有