Android音视频录制(4)——变速录制

概述

在看本篇文章之前请务必先查看这面三篇文章:

第一篇:Android音视频录制概述
第二篇Android音视频录制(1)——Surface录制
第三篇Android音视频录制(2)——Buffer录制

视频变速是一个非常有趣的东西,在我们平时看电影的时候,导演对某些镜头进行快放(比如动作片的拳脚片段),某些镜头进行慢放(比如一些火山喷发之类的),从而造成非常震撼的影视效果。最近非常火的一些app,能让普通群众都能拍出很精彩的快速/慢速的视频,而很多人对这种视频效果都感觉很赞,下面我就来讲述下视频录制过程中如何变速录制。

下面我先说下视频变速的原理:快速录制就是“丢”帧,慢速录制就是“加”帧,但帧率都保持不变,变的是时长。比如我4秒的视频,帧率是20帧/秒,那一共是80帧,把每一帧都编码0,1,2…,78,79,假设我定义的快速即为2倍变速,即4秒最后变成2秒的视频,视频帧的变化就是丢弃掉一半的帧,只取0, 2, 4…76, 78合成2秒的视频,帧率依然是20帧/秒。慢速录制也以1/2速度为例,不过慢速录制相对复杂些,毕竟删除总是比创建容易,4秒的视频最终要变成8秒的视频,帧率不变,所以肯定要“加”帧,其实就是复制帧,依然是0,1,2…78,79的视频,对每一帧复制一遍,重新编码,最后编程0,0A,1,1A….78,78A,79,79A一共160帧的8秒视频。这其中最最核心的点在哪里?三个字:时间戳。快速录制的时候,你需要把正常第2n的时间戳设置为n, 慢速录制的时候,需要把时间戳为n的帧变成2n。当然,talk is cheap, show me the code。下面我们看看如何实现。

代码的实现也是分两部分,第一部分是,Surface变速录制,第二部分是,Buffer变速录制。快速变速以2倍速为例,慢速变速以1/2倍速为例

Surface变速录制

Android音视频录制(1)——Surface录制一文中并没有说到任何关于时间戳的代码,其实因为surface录制的时候egl默认给我们加上了时间戳,但是我们依然可以通过egl设置我们指定的时间戳,最终达到我们的目的。

首先定义几种模式:

public enum  Speed{
        NORMAL,//正常速度
        SLOW,//慢速:0.5倍速
        FAST//快速:2倍速
    }

然后在VideoSurfaceEncoder中加入几个变量:具体看注释

    private Speed mSpeed;//模式:快速/慢速/常速
    private int mFrameIndex = 0;//实际编码器渲染帧数
    private long mFirstTime;//第一帧渲染时间
    
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值