非16整数倍边长VP6的FLV的研究

看了Adobe的《SWF and FLV File Format Specification Version 9》中关于FLV中的VP6 包结构的说明

可以看到VP6包的第一个字节分别是高和宽的裁边数。vp6原始数据包是不包含这个信息的,但是它包含了长宽信息,这个信息必定是16的整数倍。而在avi中有avi的hader部分的长宽信息开控制视频最终呈现的效果,所以可以压出非16整数倍边长的VP6的avi并能正常显示。但是一旦这个avi封装到flv中就会发size变了,长宽都是16整数倍,并且多了一些难看的边,这是由于目前我们用的封装程序ffmpeg不支持写入裁边信息造成的。为了测试今天压了一个480*360的flv,然后手动修改了裁边信息~方法是用winhex打开ffmpeg封好的flv文件,批量替换HEX
0000001400为0000001408和0000002400为0000002408,前3bytes固定为0是flv的stramid,1代表keyframe2是interframe,4是vp6在flv中的codeid,08表示宽裁边为0高裁边为8(宽是裁右边高裁下边)。并且修改头部height后面的3bytes为407680,这个是360的double的16进制表示。然后再播放这个flv文件你会发现它完美的现实了480*360无任何杂边。见下图:

由此可见FLV中包含非16整数倍边长的VP6是可能的。只要将封装程序代码写正确了既可以实现,(用VP6帧的Packet中的长宽减去AVI header中的长宽放入FLV的VP6包的第一个字节)。

此条目发表在分类目录,贴了, 标签。将固定链接加入收藏夹。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据