仿剪映播放器、剪辑视频、预览条、快速精准抽帧(附源码)
共 1637字,需浏览 4分钟
·
2022-06-26 07:04
给大家分享一下知识星球里面小伙伴的项目实践,高仿剪映快速抽帧、精准显示功能,而且还有源码给出!
关于实现思路,之前也在公众号里面给大家分享过:
有兴趣有时间的,也可以按照思路自己动手实践一下,以下是特意邀请作者写的分享,欢迎交流讨论!
由于本人想学习音视频相关的东西,所以找了剪映作为借鉴,通过仿照剪映的功能学习音视频相关的东西,所以有了这个项目。
暂时这个项目只有仿照剪映编辑的预览条快速抽帧、精准显示,以及播放器的播放和随预览条的滚动逐帧预览。
本项目的抽帧显示速度和剪映还有一定的差距,但是和快影的抽帧速度差不多了。
本项目主要有三块:
第一部分是使用的 meitu 开源的 timeLine,也就是预览条的UI。
第二部分是视频播放器,使用 FFmpeg 写的一个简单的播放器,将与数据交给 Java 层的 OpenGL 去渲染显示。
第三部分是预览条的解码抽帧,也是通过 FFmpeg 去解码,然后结合 UI 去处理解码的时机,显示,缓存等问题。
项目地址,欢迎 star :
https://github.com/Destroyer716/FFmpegVideoRange2
开局一张图
这是剪映的预览条抽帧效果
这是快手的快影预览抽帧效果
下面两个动图是本项目的预览抽帧效果
大概的思路
某位大佬曾经分析过类似剪映预览条抽帧的思路:
1.每一个要显示的帧的时间是确定的,因为间隔是固定的。
2.既然要显示的帧的时间是确定的,那么在实际要显示的时候,可以根据要即将要解码的帧与当 前已解码的帧是否在同一个GOP,如果在同一个GOP,那么就通过顺序解码的方式。如果不在同一个GOP,那么就要先seek,再顺序解码到需要的帧。
3.因为预览条上面显示的每一帧的实际宽高都非常小,所以可以将bitmap压缩到很小,大概10kb以内,这样就可以充分利用缓存,提前解码放入缓存,加快显示的速度。这里不仅可以用内存缓存,还可以用磁盘缓存,已经解码的可以存到磁盘,下次就可以直接拿。
4.充分利用多解码器解码,或者多线程解码。
5.解析nal header 获取 nal_ref_idc 语法元素的值,如果为0,则可以丢弃不解码,因为2bit的nal_ref_idc,标识NALU的重要性,值越大,重要性越高。当解码器处理不过来时,可以丢掉重要性为0的。
forbidden_zero_bit | nal_ref_idc | nal_unit_type |
---|---|---|
1 bit | 2 bit | 5 bit |
以上就是大致的一个思路,本项目也基本使用的是这个思路,稍有不同的是,第3点,本项目只用了磁盘缓存,并且没有使用提前解码的方式,而是通过获取当前显示再屏幕上的item,所属的时间范围,只解码这个范围内的部分(剪映基本也是这么处理的)。
同时本项目会在拿到需要处理的视频,初始化后,将当前视频所有I帧的时间节点获取出来,以便在后面判断是需要顺序解码,还是需要seek。
这里就没有贴代码了,重点在思路,想看代码和效果的可以去github下载下来,跑一跑。
本项目仅仅一个demo,没有做兼容,没有做架构,所以不能直接用于正式项目,然后也希望找一些同好们,一起学习交流。
最后欢迎大家加入 音视频开发进阶 知识星球 ,这里有知识干货、编程答疑、开发教程,还有很多精彩分享。
更多内容可以在星球菜单中找到,随着时间推移,干货也会越来越多!!!
给出 10元 优惠券,涨价在即,目前还是白菜价,基本上提几个问题就回本,投资自己就是最好的投资!!!
加我微信 ezglumes ,拉你进技术交流群
推荐阅读:
觉得不错,点个在看呗~