AS3解析FLV格式和视频相关问题总结

为什么要解析FLV格式

在直播项目里面遇到需要统计flash视频帧间隔时长,首帧,GOP,等关键数据的时候,不可避免的需要对flv文件进行解析。

名词定义

  • 首帧:是指用户看到第一个视频帧。
  • 首帧时长:是指用户打开网页到看到第一个视频帧。
  • I帧:视频关键帧,包含全部的图形信息。
  • P帧:视频间隔帧,是根据P帧前面的P帧或者I帧diff出来的帧。数据量比I帧小。
  • GOP:Group of picture(图像组),指两个I帧之间的距离

FLV文件格式的定义

FLV格式定义:FLV是一种容器格式,它支持的音频编码有 linear PCM、ADPCM、MP3、Nellymoser、G711 A-law PCM、G711 mu-law PCM、AAC、Speex等,支持的视频编码有H264、On2 VP6、Sorenson Spark等。

使用OSMF解析FLV格式

地址: https://sourceforge.net/adobe/osmf/home/Home/

使用OSFM的org.osmf.net.httpstreaming.flv.FLVParser类

var flvParse = new FLVParser();
flvParse.parse(inBytes, true, function(currentTag:FLVTag):Boolean 
{
    switch (currentTag.tagType) 
    {
        case FLVTag.TAG_TYPE_VIDEO:
        {
            // 视频帧,可以通过FLVTagVideo的frameType来判断是不是I帧来计算GOP
            // 统计帧间隔
            break;
        }
        case FLVTag.TAG_TYPE_AUDIO:
        {
            // 音频帧
            break;
        }
        default :
        {
            // script帧
            break;
        }
    }
    return true;
});

视频播放质量监控

关键数据:首帧、掉帧率、flashBuffer长度 首帧直接关系到用户的体验,最好能做到秒开。 掉帧率可以体现出用户观看视频时的卡顿情况。 flashBuffer长度可以一定程度上体现用户延时状况。

经过反复试验发现bufferTime增大会一定程度上减小掉帧率。但是会增大FlashBuffer长度,也就是会增大延时。同时也会增大首帧时长。目前在线课堂的bufferTime值为1S。

再说说掉帧,就目前所知掉帧和bufferTime、浏览器、flv文件视频帧时间戳等都有一定关系。 浏览器方面Chrome掉帧比IE要高。视频帧时间戳均匀可以减少掉帧。

直播中常见的问题

[有声音没画面]

原因:当用户进入后必须等到一个I帧才能解开。P帧需要参考前置帧。视频直播的过程中用户是随机进入的,那么用户收到的第一个帧就有可能是P帧也有可能是I帧,如果用户刚好很走运接到的第一个帧就是I帧那么他就是秒开。

解决方案:我们前面说了用户接到的第一个帧就是I帧那么就是秒开。怎么才能让用户接到的第一个帧就是I帧呢?有两种方案

缓存I帧(或者叫缓存GOP):

服务端缓存上一个I帧到用户进入时刻的所有帧,一次丢给客户端。这时客户端就会秒开客户端为了减少和源头的延迟,通常会做加速播放。比如斗鱼、映客就是采用这种方案。

优点:技术实现相对简单,可以实现秒开。

缺点:当用户频繁进出房间,会造成服务端大量的带宽开销。

动态编码I帧:

服务端没个把直播过程中的视频解码,动态编码。

如图:假设我们的GOP是5,实际使用的时候大概是40或者更高(我们的GOP大概是200我会乱说) 服务器为I帧和P帧间的每一个P帧开一个独立编码序列。代价就是当GOP是40的时候就要有40个编码序列。

优点:可以节省服务端带宽资源 缺点:就是比较消耗CPU资源。

[有画面没声音]

这个可能性比较小,原因通常是上行没有声音。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小白课代表

Autodesk Navisworks 2016 安装教程。

Autodesk Navisworks软件能够将AutoCAD和Revit®系列等应用创建的设计数据,与来自其它设计工具的几何图形和信息相结合,将其作为整体的三...

573
来自专栏嵌入式程序猿

那些一看就懂的MQX实时操作系统高级培训

经过了MQX入门,进阶培训,是不是想在提升一下逼格,在掌握一些技能呢,今天我们就来看看小猿带给你的精彩高级培训。 Modbus 通信 众所周知,Modbus通信...

2675
来自专栏携程技术中心

RN沙龙 | 那些携程火车票业务在RN实践中踩过的坑

姚瑞琼,前端程序媛一枚。2014年毕业后加入携程火车票事业部,今年年初起至今,主要负责React Native方案在火车票业务线的实践,先后参与并负责汽车票RN...

4229
来自专栏小白课代表

Autodesk Navisworks 2015 安装教程。

Autodesk Navisworks软件能够将AutoCAD和Revit®系列等应用创建的设计数据,与来自其它设计工具的几何图形和信息相结合,将其作为整体的三...

612
来自专栏木子昭的博客

chrome小众插件 一键查找姊妹网站 SimilarSites

当你浏览一个很棒的站点的时候, 或许你会想到, 和它"差不多"的站点有哪些, 尤其是针对一些资源站点, 这个站点没有, 而它同类的站点"往往有"! 这里推荐一...

872
来自专栏BestSDK

一文看懂 iOS 11所有新功能:文件管理器、多任务处理、全新文件 App等

全新文件 App 通过这个App,可以把各类文件汇集在一起,浏览、搜索和整理文件。用户最近使用过的各种文件都会在一个专属的位置,以方便查看。除了 iPad 上的...

2988
来自专栏Python小屋

手把手教你使用Python+scrapy爬取山东各城市天气预报

1、在命令提示符环境使用pip install scrapy命令安装Python扩展库scrapy,详见Python使用Scrapy爬虫框架爬取天涯社区小说“大...

1043
来自专栏Rainbond开源「容器云平台」

搬运向 | 浅析serverless架构与实践

2485
来自专栏腾讯大讲堂的专栏

朋友圈遇到乱码后怎么办

最近,在朋友圈里,经常会看到这样的乱码,举个例子: මම ඔබට කියන්න අවශ්ය, මම ඔයාට ආදරෙයි ไม่ว่าจะเกิดอะไรขึ...

1689
来自专栏Netkiller

以太坊·单机多实例演示

摘要: 这是一篇演示如何使用一台服务器,运行多个以太坊客户端,并且将节点互联,完成两个节点之间的转账操作。

5597

扫码关注云+社区