首页 > 编程语言 >仿剪映播放器、剪辑视频、预览条、快速精准抽帧(附源码)

仿剪映播放器、剪辑视频、预览条、快速精准抽帧(附源码)

时间:2022-12-20 22:31:32浏览次数:67  
标签:缓存 预览 项目 解码 抽帧 源码 剪映


给大家分享一下里面小伙伴的项目实践,高仿剪映快速抽帧、精准显示功能,而且还有源码给出!

关于实现思路,之前也在公众号里面给大家分享过:

​干货 | 快速抽取缩略图是怎么练成的?​

有兴趣有时间的,也可以按照思路自己动手实践一下,以下是特意邀请作者写的分享,欢迎交流讨论!

由于本人想学习音视频相关的东西,所以找了剪映作为借鉴,通过仿照剪映的功能学习音视频相关的东西,所以有了这个项目。

暂时这个项目只有仿照剪映编辑的预览条快速抽帧精准显示,以及播放器的播放和随预览条的滚动逐帧预览

本项目的抽帧显示速度和剪映还有一定的差距,但是和快影的抽帧速度差不多了。

本项目主要有三块:

第一部分是使用的 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,没有做兼容,没有做架构,所以不能直接用于正式项目,然后也希望找一些同好们,一起学习交流。



标签:缓存,预览,项目,解码,抽帧,源码,剪映
From: https://blog.51cto.com/u_12127193/5956940

相关文章

  • 企业电子投票系统(论文+PPT+源码)
    设计题目 企业电子投票系统摘要目录​​第​​1部分概述1​第​​2部分 分析部分2​​2​​.1.功能需求2​第​​3部分 系统设计3​​3​​.1.功能模块设计3​​3​​.2.数......
  • 固定资产管理系统(论文+PPT+源码)
    固定资产管理系统摘要随着计算机信息技术的发展以及对资产、设备的管理科学化、合理化的高要求,利用计算机实现设备及资产的信息化管理已经显得非常重要。固定资产管理系统......
  • 企业车辆管理系统(论文+源码)
    毕业设计(论文)资料设计(论文)题目:企业车辆管理系统摘要随着经济的日益增长,车辆作为最重要的交通工具,在企事业单位中得以普及,单位的车辆数目已经远远不止简单的几辆,与此同......
  • 用Java EE技术实现产品售后服务系统(论文+PPT+源码)
    目录摘要1Abstract11引言52.1系统需求分析72.2可行性分析82.3本系统采用的关键技术93系统概要设计124系统详细设计144.1后台数据库设计144.2系统E-R图184.3.2数......
  • Spring源码编译
    资料参考地址1:Spring源码编译准备环境配置JDK8(与Spring5的兼容性最好)spring:5.2.0release下载Spring源码直接去官方的github库下载,https://github.com/spring......
  • Qt下MQTT模块的导入(源码直接导入)适用Windows和Linux系统
    Qt下MQTT模块的导入(源码直接导入)适用Windows和Linux系统​​0.环境​​​​1.MQTT源码下载(也可以去官网下载)​​​​2.MQTT源码解压成功复制src/mqtt文件夹到工程中​......
  • QtMqtt 源码编译设置KeepAlive后ping包超时错误不返回问题修复(QMQTT::MqttNoPingResp
    调用setKeepAlive()设置心跳包后,心跳可以正常收发此时断开网络出现如下情况明显出现还未超时就重启了超时定时器,查看源码如下:voidQMQTT::ClientPrivate::onTimerPingReq......
  • Scrapy-redis 源码分析 及 框架使用
     From:​​https://cuiqingcai.com/6058.html​​Scrapy-redisgithub:​​https://github.com/rmax/scrapy-redis​​​scrapy-redis分布式爬虫框集群版Scrapy-Redis:​​......
  • Scrapy源码阅读分析_1_整体框架和流程介绍
     Scrapygithub下载地址:​​https://github.com/scrapy/scrapy​​  介绍 Scrapy是一个基于Python编写的一个开源爬虫框架,它可以帮你快速、简单的方式构建爬虫,并从网站......
  • 微服务11:熔断、降级的Hystrix实现(附源码)
    微服务1:微服务及其演进史微服务2:微服务全景架构微服务3:微服务拆分策略微服务4:服务注册与发现微服务5:服务注册与发现(实践篇)微服务6:通信之网关微服务7:通信之RPC微服务......