如何实现播放器缩略图功能

发布时间 2023-05-04 15:09:25作者: 邗影

1 如果你的播放器有 SEEK 功能,有 getJPEG抓图 功能 就可以直接开发了

缩略图功能:

当鼠标悬停在某个位置,显示一下这个位置的播放画面;很多娱乐行业播放器都有此功能;

1 一路点播,或者直播(直播不能看后续缩略图)画面,播放状态

2另开一路,不要播放,只负责去存储器(远程服务器,NVR,本地文件。。。。)读固定位置的视频数据,也就是你鼠标悬停位置。当然前提是你的是视频码流建立了帧索引,这样seek才能找到悬停位置所在的GOP;【是否在开一路,依赖于你的播放器SEEK功能是否会立即跳转播放,就是说你调用seek,是否会影响原先正在播放的画面的进度】

3 可以选择显示粗略位置和精确位置的缩略图(粗略位置:悬停位置附近的I帧。精确位置:悬停位置对应的那帧数据【可能是P帧,B帧】);播放器解码后可以判断下该帧时间戳是不是SEEK的那个时间点(正负一帧的偏差);

4等拿到了SEEK的时间点的那帧数据,就是解码后的YUV,把这帧数据保存成JPEG供应用层显示即可,一般缩略图都是JPEG格式。因为缩略图比较小,所以拿到YUV后还要resize一下改一下分辨率;

5 如果想要缩略图直接显示在指针悬停位置,就直接吧YUV数据给应用层,应用层创建个临时的VIew去承接这个YUV进行显示,这个都有现成的函数;


关于SEEK功能

1 直播是没办法seek的,即便可以seek也只能向前SEEK,因为后边的画面内容是实时的,还没有发生,是不会有视频的;所以我们一般说的seek都是针对回放流,文件流;而不是实时流;

2 seek 跳转,需要的条件:有文件索引,如MP4前置索引,M3U8文件片段索引;本地文件的话,你需要提前遍历一遍文件,建立I帧索引【常规操作】;

3 有了视频帧索引之后,跳转就相当于去索引记录中寻找那个时间点对应的GOP,从那个GOP位置开始拉流,或者读文件;

4定位一般分为精确定位和粗略定位,就看你的播放器是从SEEK的那个时间点附近的I帧开始显示,还是解码到【定位的时间点的】那帧,开始显示;精确定位的大致实现方案就是先到seek的位置去找GOP,然后肯定从I帧开始读数据(一般的索引也是记录的I帧的位置),读数据解封装,解码,之后送渲染之前要注意,如果解码后的这帧画面还没到SEEK的那个时间点就不送显示,直接丢弃就好,直到解码输出你SEEK的那个时间点的帧数据YUV,再送去显示;【解码GOP需要I帧,但是渲染不需要I帧,渲染只需要YUV】;


关于抓图

1抓图一般可以从解码组件输出的位置上判断是否需要抓图,也就是直接取解码后的YUV,然后你可以利用一些开源code,把YUV转成BMP,JPEG,RGB等等;保存成图片;

2 抓图还可以从渲染组件的位置开始,因为渲染组件可以做叠图,立体显示,三维矫正,resize,MVP变换,叠字,YUV转RGB,还能拿GPU的数据,所以有些播放器做的抓图是从渲染模块抓的,可以抓一些合成图像;