1. http-flv是什么
http-flv是以http为传输协议,flv媒体格式为内容的方式实时下载flv音视频帧。为什么选择flv格式而非mp4?原因是mp4必须要有moov box或者moof box才能播放,而moov box和moof box 中主要存储的是帧的索引,在实时直播过程中所有未产生的帧都是无法预测的,所以moov和moof都不能提前生成,也就很难做到实时的效果。当然moof box有点特殊,可以重复出现,这样就能每隔几帧就生产一个moof box下发给客户端,也是可以做到直播效果的,这种方式被人们广泛称为http-fmp4,DASH协议就是是利用moof实现的。
flv文件不同之处在于,播放器只要获取到其中的metadata、avc-header、aac-header后就可以顺序播放接下来的所有帧。所以服务器只需要在客户端连接的时候顺序发送metadata、avc-header\aac-header后连续不断地发送音视频帧播放器就会不停接收并且播放flv内容了。
sequenceDiagram
播放器->>服务器: http://ip/app/stream.flv
服务器->>播放器: 返回flv-header
服务器->>播放器: 返回metadata
服务器->>播放器: 返回avc-header
服务器->>播放器: 返回aac-header
服务器->>播放器: 返回video-frame
服务器->>播放器: 返回audio-frame
服务器->>播放器: ...
服务器->>播放器: ...
服务器->>播放器: ...
具体涉及到的flv-header、metadata、avc-header\aac-header是什么这里不做讨论,感兴趣的朋友可以搜索一下“video_file_format_spec_v10”
2. http是如何下发flv数据的
上面说到的下发过程是基于http下载进行的,但是一般http下载的时候都会在http头中添加content-length参数,该参数是为了告诉客户端需要接收多少字节的数据。但是作为直播,我们是无法预知要传输多长数据的,所以content-length参数一定不能出现,只要没有这个参数,客户端就会一直接收服务器发送的数据直到tcp连接断开。
既然没有了content-length,是不是就意味着直接下发原始flv流就行了呢?答案是否定的,因为在没有content-length的情况下大部分客户端都希望服务器支持chunked编码,把需要发送的数据打包成一段一段的数据。具体chunked编码是怎么回事网上有很多文章做详细介绍,这里就不再累述。以上所提到的所有内容都在easydss服务器上做了完整的支持。
更多开源流媒体技术,请关注我们的微信:EasyDarwin