FFmpeg 流媒体组成、媒体文件封装及传输协议

流媒体,从字面上理解就是像流一样的媒体,类比实际中就是类似水流、电流一样的概念。事实上,流媒体出现之前,网络上是不能播放电影,只能是通过下载文件到电脑上然后才可以观看,相信很多80、90后都去网吧下载过歌曲、电影。这也是迅雷等下载工具盛行的原因。

随着流媒体的出现,就可以资源就可以通过网络进行播放了。流媒体的最大的特点就是能够做到边下载边播放,而且不需要提前下载好,这样就极大地改变了用户体验,提高了实时性。那么流媒体又是怎样做到边下载边播放的呢?它的结构又是什么样的呢?下面我们来仔细的介绍。

流媒体系统的组成

一个完整的流媒体系统是由:信号采集、编码、传输、解码、输出,五部分组成的。

信号采集:流媒体系统主要是在计算机系统上进行处理的,流媒体中最主要的就是音频和视频,从物理角度说音频实际上是一种通过物理震动形成的机械波,音频采集就是将这种物理波转换成电信号进而转换成二进制的音频数据,一般采集得到的原始数据是PCM数据。那视频又是什么呢,视频实际上是顺序呈现出来的一幅幅连续的静止图像,换句话说视频实际上是有一幅幅静止的图像组成的,视频的采集就是连续不断地采集这些静止的图像的过程,这些一幅幅的图像一般被称为帧。图像的采集是对光信号的采集与转换,将光信号转为二进制的图像帧的过程,通常我们得到的原始图像的数据格式为YUV格式。

编码:编码是什么呢?至于为什么要编码,这个不用赘述,就是在不影响音视频品质的同时,尽可能的压缩音视频数据的大小,既能方便传输,又能方便保存。所以就希望在采集到原始的音视频二进制数据量尽量的变小,方便传输,同时又需要在解码的时候接近原始文件质量,所以编码又称为压缩编码。音视频的编码算法有很多种,而且很复杂,每一种算法的运行效率,压缩比,损失率都不一样。而原理都是一样的,比如常见的有帧内压缩和帧间压缩。

什么是帧内压缩呢,例如我们拍证件照的时候,背景是纯色人站在前面。这个场景,在编码的时候一副图像被分成很多小块(宏块),这样由于背景中会有很多相邻的小块都市相同颜色,周围的小块都是可以推断出来的,这样的就不需要单独编码了,这就属于帧内压缩,这种压缩是在一个帧内部进行的,跟其前后的图像没有关系。

什么是帧间压缩,如果一个视频中相邻的2幅图像,背景都是纯红色,背景中有一个球在图像1中的位置是A点,在图像2中的位置是B点,图像1和图像2叠在一起会发现他们除了球的位置不一样之外,其他的部分都是一样的,所以在编码图像2的时候完全可以只编码与图像1不同的部分就可以了。如果图像1 我们需要完全编码,图像1 被称为关键帧(I 帧),而图像2 在还原的时候需要参考图像1 ,所以称为参考帧(P帧)。如果没有关键帧,那么参考帧是无法还原的。同理,在编码的时候,一帧不仅可以参考上一帧,还可以参考下一帧(双向预测的帧间压缩)。这种当前帧的编码参考其相邻图像的算法就是帧间压缩算法。

传输:经过采集,编码我们现在已经获得了音视频数据帧,下面就要开始传输了。传输的过程就是将编码后的音视频数据通过网络传输到希望看到的人的设备上。传输过程中最重要的就是流媒体协议,为什么还需要流媒体协议?是因为在流媒体播放的时候还会有一些播放的逻辑(播放、暂停、跳转、停止、快进、快退)。另外在编码之后的数据从A传到B后,B端需要将编码后的数据还原成原始数据才能播放。还原的过程就是利用解码算法进行还原的。这个解码算法的信息就是在流媒体传输协议中的,除此之外还会有一些逻辑信息,比如视频的帧率,关键帧的间隔等等。总结一句就是,编码后的音视频数据通过网络传输的时候,接收端对数据的还原需要一些信息,并且需要支持一些播放场景的逻辑,这些都在流媒体协议中进行了描述。目前最流行的流媒体协议是RTMP,RTSP,MMS等。

解码:经过编码压缩的音视频数据必须还原成原始数据才能播放显示,这个还原的过程就是解码的过程。

输出:输出的过程就是播放的过程,与采集的时候一样,实际上个这是将采集的原始音视频数据经过模块转换为物理信号,视频信号通过显示器显示出来,音频信号通过音箱播放出来。

媒体文件封装

上面讨论的是媒体的流式播放,其实这个流式主要是指传输是流动的,而且视频帧可以边传输,边解码播放的。如果希望将播放的内容保存到磁盘上,就必须要有一种文件格式来组织这些数据,以一定的结构来保存这些音视频数据。为什么不直接将网络传输过来的内容直接写到一个文件中保存呢,如果直接将所有传输过来的数据不加任何结构组织直接保存的话,那么在播放的时候如何播放?如何知道这些二进制数据哪些是音频哪些是视频,如何知道每一帧音视频数据在文件中的边界,如何知道该音视频的内容是通过什么编码算法编码的,如何知道播放一帧数据之后再隔多长时间播放下一帧数据,如果像有的电影文件需要多种字幕又如何组织。所以这就必须要有一种文件格式能够组织这些音视频数据并且附加这些播放必须的信息在文件中。这就是媒体文件的封装。现存有很多种媒体文件,有的是某个公司的专利,有的是国际标准,例如MP4,MP3,AVI,RMVB等等。所以如果要保存这些流媒体数据到文件中,则必须通过一定的文件封装格式将这些音视频数据保存在具有一定格式的媒体文件中。

传输协议

目前使用最多的流媒体传输协议是RTMP和RTSP。当前比较流行的互联网直播都是通过RTMP和RTSP 协议进行传输的。另外,苹果推出的HLS 是针对跨平台的浏览器进行直播的。

需要指出的是,在与苹果的HLS争夺市场的过程中,同时出现了多种类似的技术,都是用的HTTP协议,一般我们称为HTTP渐进式下载。例如微软的Live Smooth Streaming 中文名称为直播平滑流,这种技术需要微软IIS7及以上版本的web服务器和Silverlight客户端支持。另外一种是开源的技术好像并不是某个公司出品,叫Http Pseudo-Streaming 中文名是伪流。目前只看到一个基于Apache服务器的插件H264 Streaming Module for Apache,客户端貌似也是使用Flash Player。还有一种叫HTTP Dynamic Streaming 中文称做HTTP动态流,是Adobe公司的技术方案,其服务端需要Flash Media Server支持,客户端则是Flash Player。其实现在的Flash Media Server 也已经支持HLS了。苹果的HLS就不说了现在很多服务器以及开源代码都支持HLS,客户端呢只要支持HTML5的浏览器基本也都支持HLS,现在的HLS已经是主流。最后要说的是新出现的一种技术标准,MPEG-DASH目的为了统一这些技术方案,还在标准化中,如果真的标准化,也有可能取代HLS,毕竟HLS还没有称为正式标准,只是苹果公司提交了个草案。

RTMP协议的发展得益于flash播放器的广泛传播,而RTSP协议则得益于其协议的开源。本系列要讲解的crtmpserver就是基于RTMP协议的开源流媒体服务器,开发语言为C++。等同的产品还有Red5 语言为Java也是开源。另外一个比较有影响力是wowza属于闭源产品。此外RTMPDump项目是用的比较多的RTMP客户端开源项目,其中的librtmp库使用的很广泛,C语言编写。另外OpenRTMFP是基于p2p技术的RTMP。

作者:倪尛

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(1)

相关推荐

发表回复

登录后才能评论