方案1:
以一个GOP为单位
一个正放list,一个倒放list;
解码后存入倒放list(按正放顺序放置。当一个GOP解码完成,进行list逆置,并拷贝到正放list),一般list会有大小限制,解码到一定量进行隔帧丢YUV;大GOP可能会丢很多;要注意;
然后渲染线程读取正放list里的逆置数据;解码线程可以继续解码;数据的逆置和拷贝等时机要考虑清楚,避免出现卡顿;还要考虑大GOP的丢帧逻辑,list的大小等;
当然,不考虑内存,动态的保存整个GOP大小也是可以的,注意GOP与GOP切换之间的流畅性要考虑;
方案2:
适用于PC端,当进行倒放的时候,整个视频/(GOP)解码YUV,重新编码的时候强制编码成全I帧,倒放的时候一帧就是一个GOP;但是需要很大~~~~~的存储空间;
方案3:
一个固定大小的双端容器,只存储N帧;先进先出,容器每次都保存GOP最后N帧,然后倒放,直到这个GOP所有帧都被播放过;但是这样会导致如果GOP比较大,一个GOP会多次解码,不过缓冲是固定的;最好有两个容器轮流;比如:容器大小30帧,GOP大小100;顺序解码GOP第一次:容器存储了70~99;然后倒放;第二次还是解码这个GOP,存储40~69;然后倒放,直到一个GOP完全解码和播放完;
标签:方案,容器,解码,倒放,list,音视频,正放,GOP From: https://www.cnblogs.com/8335IT/p/16953351.html