音视频倒放方案

方案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为单位,解码这个GOP的第二个30帧(放在容器2中),存储40~69;然后倒放,直到一个GOP完全解码和播放完;

方案三看上去和方案一其实是一样的,只不过方案一是单次解码,为了限制内存会进行丢帧,但是方案3以多次解码保证了显示的完整性,同时又不会占用较大的内存;

 

posted on 2022-12-05 20:18  邗影  阅读(144)  评论(0编辑  收藏  举报

导航