HTTP流媒体播放技术发展以及nginx点播源站

  互联网多媒体内容传输从大方向上可以分为下载传输和流式传输,而流式传输又可以分为顺序流式传输和实时流式传输,换句话来说就是点播(Video on Demand)和直播(Live Streaming),顾名思义,前者的媒体内容是提前存储在服务器上供客户端请求播放,而后者是实时产生并分发给客户端播放。

  本文主要是基于HTTP的流媒体点播技术入门,讲述了一些基本的概念以及这一技术的变革演进。

  互联网上传播音视频内容最早从上世纪90年代开始,RTP等专有协议的提出就是定义音视频的包格式以获得更低的网络传递开销。不过现如今的互联网世界,CDN扮演着非常重要的角色,而绝大部分CDN厂商是不支持RTP等协议的。基于HTTP的流媒体点播技术则占据着主流,其有几点优势:1、防火墙友好;2、客户端控制媒体流的访问,服务端不需要为每一个客户端连接维护媒体session状态;3、采用标准的HTTP服务器即可,支撑大规模客户端访问不需要额外的服务器技术资源开销,最重要的就是CDN技术的良好支持优化。

  HTTP流媒体技术的变革大致经过了以下四个阶段:

  

  最初,我们只能先下载完整视频文件到本地磁盘后,然后才能播放观赏。这意味着你必须等待视频下载操作的完成,严格来讲,根据我们第一段的划分,这不能称作为流媒体传输,不过我们还是列出来,以作对比。

  

  在上面简单下载文件的基础上,一个明显的提升就是渐进式下载技术。这种情况下不需要完整下载视频文件,可以边下载边播放,这就要求视频的元数据信息得放在视频文件的开头。但是,我们只能在已经下载的那一部分自由拖拽播放,而未下载的部分是不能播放的。

  

  在渐进式下载的基础上,pseudo-streaming(伪流)出现了,其增强了seek播放功能,也就是支持直接切到未下载的地方进行观看,所以也可以称之为渐进式播放。

  

  其实,到pseudo-streaming 这一步,流媒体播放的技术已经很成熟了,而且目前绝大多数的视频网站都是这种技术,比如Youtube、优酷、腾讯视频等。如果,要在这个基础上再一步的优化,可以从哪些方面呢?比较容易想到的就是带宽优化,能够链路感知,这就是下面的自适应比特率流。其原理就是,同一视频内容会有不同的码率版本,客户端播放器会动态地根据网络质量切换请求带宽匹配的的视频片段。

  

  自适应码率流媒体技术,业内比较常见的实现是Apple的HTTP Live Streaming (HLS)以及Adobe的HTTP Dynamic Streaming (HDS),下图简单展示了HLS的文件结构,可以看到master playlist包含了两种不同码率的播放列表,当然如果你只有一种版本,那么就不需要master playlist了。基于HTTP的自适应码率流媒体是有国际标准的,那就是3GPP组织和MPEG小组所提出的MPEG-DASH(Dynamic Adaptive Streaming over HTTP)。

  

  最后,我们来说说一个简单的点播流媒体服务器是怎么工作的。

  目前,很常见的一种搭建方式就是基于nginx,而nginx本身对音视频媒体的处理就有一定的支持,官方就有flv和mp4的插件,即ngx_http_flv_module和ngx_http_mp4_module。前者支持以字节偏移的渐进式seek播放,后者支持以时间偏移的渐进式seek播放。

  要想达到这种渐进式播放的目的,大部分情况下,我们是要对服务端的媒体文件进行一定的处理的。首先播放之前,服务端需要先返回一定的视频元数据信息,其次我们需要知道媒体时间和媒体数据的映射关系。为什么呢?

  目前大部分的视频编码都采用H264标准,而H264的不同视频帧采用了不同的压缩编码方式,其中I帧的作用很大,其通常是每个 GOP(Group of Picture)的第一个帧,我们简单点说,I帧依靠自身就可以解码出完整图像,而其后面帧的解码则需要依赖I帧,这意味着什么?

  是的,这决定了我们在拖拽播放的时候,播放器会seek到最近的I帧处,所以有时候会有一个现象,就是你拖到一个精确的时间点,但是播放器却在另一个靠近的时间点开始播放,这就是因为那个时间点是I帧所在之处。

  播放器的seek播放通常是让用户选择时间偏移,而服务端最终对文件的请求处理只能是字节偏移,所以问题来了,我们要有一个时间偏移和字节偏移的映射表,严格一点说,是每一个I帧的时间偏移与字节偏移映射。

  问题又来了,这个映射是放在客户端还是服务端处理呢?当然是都可以。如果客户端发出字节偏移请求,那么服务端就很轻松,只需要提供HTTP range访问的功能,但是client端需要提前知道时间与字节的映射关系,比如flv格式的metadata就提供了这个信息,有的flv文件没有加入metadata,这时候就需要用相应的flv工具(比如flvmeta)去处理成这样的格式,这样客户端的播放器就可以直接发送字节偏移量了。MP4则不需要这么处理,因为MP4格式本身就要求带这样的信息,其记录metadata的Movie Box (moov)中的Media Information Box (minf)就存储了媒体时间和媒体数据的映射关系。如果客户端只发出时间请求,那么服务端就得将时间偏移请求转换为字节偏移请求,然后处理并响应请求。

  上面讲了这么多,那请问,在哪里可以买到牛逼的点播服务呢?

  网易视频云推出的一站式视频云点播平台,基于分布式处理集群和大规模分发系统资源,满足全终端设备的播放需求,为企业用户提供极速稳定的视频上传、存储、转码、播放和下载等云服务,欢迎试用购买。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
您好,感谢您的提问。下面是我对您问题的回答: 要在Windows系统下搭建流媒体服务,需要使用FFmpeg、live555和NGINX三个工具。其中FFmpeg是用于将视频文件转码为流媒体格式,live555是用于将转码后的流媒体数据发送到NGINX服务器,NGINX则是用于提供HTTP协议的流媒体服务。 具体的操作步骤如下: 1. 安装FFmpeg 首先需要从官网下载FFmpeg的Windows二进制版本,并将其解压到某个目录下。然后使用命令行工具进入到该目录,执行以下命令来测试FFmpeg是否安装成功: ``` ffmpeg -version ``` 如果输出了FFmpeg的版本信息,则表示安装成功。 2. 将视频文件转码为流媒体格式 使用FFmpeg将视频文件转码为流媒体格式,例如MP4或FLV等。具体的命令如下: ``` ffmpeg -i input.mp4 -c copy -f flv rtmp://localhost:1935/live/stream ``` 其中,input.mp4是要转码的视频文件,-c copy表示直接将视频流拷贝到输出文件中,-f flv表示输出格式为FLV,rtmp://localhost:1935/live/stream是NGINX服务器的RTMP地址。 3. 安装live555 live555是用于将转码后的流媒体数据发送到NGINX服务器的工具。需要从官网下载Windows版的live555,并将其解压到某个目录下。 4. 配置NGINXNGINX的配置文件中添加以下内容: ``` rtmp { server { listen 1935; application live { live on; } } } ``` 其中,listen 1935表示监听1935端口,application live表示将流媒体数据发送到名为live的应用中,live on表示开启直播功能。 5. 启动live555和NGINX 使用命令行工具进入到live555的目录下,执行以下命令启动live555: ``` live555MediaServer.exe ``` 然后进入到NGINX的目录下,执行以下命令启动NGINX: ``` nginx.exe ``` 6. 观看视频 使用VLC等流媒体播放器,输入以下URL来观看视频: ``` rtmp://localhost:1935/live/stream ``` 其中,localhost表示NGINX服务器所在的主机名或IP地址,1935是RTMP协议的默认端口号,live是应用名称,stream是流名称,即视频文件名。 希望我的回答对您有所帮助。如果还有其他问题,请随时向我提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值