对于流媒体视频,有啥方法可以在其播放时准确跳转到某指定一帧

FLV流(注意此处不是FLV封装的文件,流是没有Index的)无法实现帧精确。H.264的TS流可以实现,但这个技术由于需要对GOP作分析,所以对机器性能要求还是很高的,并且目前国内甚至国外也没几家公司有实际产品(一般是用于视频编辑)。至于FLV文件,因为无论是广播电视还是电影或者其他场景,应该不会有人傻到用FLV作为素材格式。所以FLV文件能支持精确到帧也就没太大意义了。对于常见的播放器,比如网页上的等等,因为用户没这方面需求,加上用ffms编码FLV生成精确到帧的FLV文件需要花更长时间,因此一般都没这样弄,甚至在部分Flash播放器上连精确到秒都没办法做到。至于H.264流精确到帧原理,就像上面说的,是对以一个GOP为单位的IBP帧的分析,并且GOP越长,复杂程度越高。更多的东西我就没办法透露了,控标就靠它了。
■网友
视频的帧分为I帧、P帧、B帧(不一定全部种类齐全)I帧是完整的一个画面,P和B是向前或向后与I帧的差别数据,只有找回正确的I帧才能结合形成一个画面。 有些视频为保证质量,全部都使用I帧,这样要精确定位是没有问题的,但是FLV为了最大程度压缩视频,I帧的数量少、间隔大,再加上流文件本身没有一个INDEX作为索引,当你想定位的时侯,只能通过进度条的比例,找到最近的I帧,定位自然是不精确的。 如果在这种视频下,需要精确定位的话,其实可以通过同时分析隔近的P帧和B帧得出。但是这样的话,必须占用大量的资源,本地文件当然是没关系的,但是网络视频的话要把整个GOP长度的帧的数据下载完,对于网站来说,成本太高了。幸好用户这个需求还不强烈,所以就有了现在的结果。
■网友
FLV是容器,里面可以装VP6或者H264,精确定位与容器无关.如果是基于Flash做播放器,客户端无法实现精确定位,但是FMS有一个Enhanced Seeking支持在客户端请求时动态插入I帧以实现精确定位,第三方服务器实现里只有wowza支持该特性.其他所有第三方的实现均不提供该支持.如果是自己基于Dshow或者ffmpeg做播放器,收满一个GOP都塞进解码器,解码出图像之后,在render这边按照时间戳忽略掉指定时间戳之前的图像即可,不难实现.可以参考mpc-hc和vlc等开源项目.
■网友
【对于流媒体视频,有啥方法可以在其播放时准确跳转到某指定一帧】 视频帧在编码压缩之后,会分为 I 帧、P 帧、B帧,后两种的解码依赖于 I 帧(可以认为B、P帧里保存的仅仅是相邻 I 帧的差分)。
所以一般来说播放跳转时,都会落在指定时间附近的 I 帧上。否则,如果是落在 B 或 P 帧,就无法解码图像了。
要达成题主希望的帧级别的定位,其实也很简单,就是先落在时间较早的 I 帧上,然后一直解码解到指定帧,然后再开始播放。。。


    推荐阅读