H.264 流
视频捕捉得到的图片压缩为H264流媒体,其包含很多 NAL Units
An H.264/MPEG-4 AVC-compliant bitstream consists of a sequence of Network Abstract Layer Units (NAL Units or NALUs). Examples of NALUs are Sequence Parameter
Set (SPS), Picture Parameter Set (PPS), Supplemental Enhancement Information (SEI), and slice. The SPS and PPS NALUs contain information for the correct decoding of a sequence of pictures. A SEI nalu contains information that is not needed by the decoding
process; it can be seen as embedded metadata. Pictures consist of one or more slices. Each slice contains a slice header and slice data.
SPS, PPS 说明视频信息的 NALu, 解码器要知道这些才能正确解码, 而每一个 Slice 是也一个 NALu
Slice
什么是 Slice是? 看下面的图就知道了,一个图片可能由多个 Slices 组成, H.264比 MPEG2支持更细的 slice
H.264的个帧可能有依赖关系,比如前后两帧,只有辆小"汽车”移动了一点,那个后一帧可只用一个size很小的slice 更新汽车移动的那一小片区域
如果后帧相对前帧有两个区域发生变化,那么需要用两个 slices才能更新当前画面
IDR
还有一种叫 IDR 的 NALu, 叫 i slice 要求完全重画帧,并且此 IDR 之前的帧都无效。这是因为用户要做 seek, 如果解码中后续帧依赖整个视频的第一帧,那们必须要从头计算才能生成当前的画面,这是不可能,所以IDR是频繁穿插在视频流的。
An IDR frame is a special type of I-frame in H.264. An IDR frame specifies that no frame after the IDR frame can reference any frame before it. This makes seeking the H.264 file easier and more responsive in the player.
不考略idr,得到的图片可能如下:
HTTP 网络视频播放
现在有了NALu, 可以直接用 Http 协议把 Http server 上的视频mp4文件,传输到browser中播放, 原理如下:
mp4 文件是一种包裹视频流的box, 其头部有 sample talbe (就是索引信息,内容是时间到文件位置的映射 )
browser中的播放器会缓冲索引文件,当用户 seek的时候,从索引文件中找到时间对应文件位置,而后用 http 协议访问,比如下面访问 mp4 文件位置 2556
http://pdl.googletv.cnbc.com/VCPS/Y2013/M09D12/3000198565/5ED2-KR-FBlock0912_H264_720x405_30p_1M.mp4 @2556
而后再读取 IDR重构画面
在播放过程中,不断 fetch 后续位置的数据,直到缓冲上限
ref:
http://multimedialab.elis.ugent.be/BFlavor/samples.html
http://www.tvro.com.tw/main5/maimtxt/H.264%E5%A0%B1%E5%B0%8E%EF%BC%8D%E5%B7%A5%E7%A0%94%E9%99%A2.htm