基本原理

变速播放的实现原理很简单。抛开音频回放暂不考虑,只有视频的情况下,变速播放就是改变了视频回放的播放帧率。如果帧率是 30fps,我们以 200% 的速度播放,那么等于是把帧率提升到了 60fps。帧率提升意味着,帧时间间距缩短,33.3ms 缩短为 16.6ms。因此如果要加速播放,就要求 cpu 有足够强大的解码能力,否则是没法做到的。而如果是减速播放,则可以减轻 cpu 的负担。

音频回放如何实现变速处理呢?原理就是音频重采样。举例说明,44100Hz 采样率的音频,每秒钟有 44100 个采样点,如果我们要加速为 200% 播放,怎么做到?最简单的方法,将解码出来的音频数据,均匀的扔掉一部分即可。解码出来 44100 个采样点,本来可以播放 1s 的时长,我扔掉一半,那么我们就只剩下 22050 个采样点,仍然按照 44100 的采样率去播放,那么我们就只能播放 0.5s 的时长,这样音频的播放速率就变为了 200%。用专业的数据讲,这个叫做音频的重采样滤波。

如果原始采样率为 44100Hz,播放速度为 speed,那么重采样的采样率计算公式为:

newsamprate = 44100 * 100.0 / speed;

我们以 newsamprate 的采样率对解码出来的原始音频进行重采样,然后仍然以固定的 44100Hz 的速率去回放音频,就实现了音频的变速播放。音频的重采样,我们借助 ffmpeg 的 libswresample 即可实现。除了改变视频帧率,和音频重采样,还需要处理的是变速播放后的音视频同步。

变速播放的应用

最直接的应用就是视频的慢放快放,另外还可用于保证播放的流畅性。低端设备上 cpu 处理能力弱,解码速度跟不上,我们在播放视频的时候,会明显感觉图像卡顿,声音不连续。这时如果我们能够降低播放速度,比如降速为 80% 播放,也许就能流畅的播放。之前 wince 上有一个名为 tcpmp 的播放器就是通过自动降速播放来达到流畅的播放体验的。变速播放还可用于做 cpu 性能测试,tcpmp 播放器就有这样的功能,通过加速播放视频,来测试 cpu 的解码能力,看最高能达到多快的加速播放速度。

参考文章:https://github.com/rockcarry/ffplayer/wiki/

9.ffplayer 原理、架构及代码分析——变速播放的实现相关推荐

  1. 音频变速变调原理及 soundtouch 代码分析

    音频变速变调原理及 soundtouch 代码分析 作者:floer rivor 2021 年 4 月 30 日 本文字数:5066 字 阅读完需:约 17 分钟 概述 音频变速变调在不同的场景可以分 ...

  2. 8.ffplayer 原理、架构及代码分析——包队列 pktqueue

    包队列的作用 包队列的作用是用于缓存解复用 (demux) 阶段出来的音视频的 packet,并将音视频 packet 分发给对应的音视频解码线程. 我们前面已经知道,为了有效利用 cpu 资源,保证 ...

  3. linux drm 架构及linux drm 架构 之代码分析

    转自: http://manpages.ubuntu.com/manpages/utopic/man7/drm-kms.7.html 根据自己的理解来转述一下: 摘要: DRM 是linux 下的图形 ...

  4. linux ecc校验原理,Nand ECC校验和纠错原理及ECC代码分析

    校验码生成算法的C语言实现 在Linux内核中ECC校验算法所在的文件为drivers/mtd/nand/nand_ecc.c,其实现有新.旧两种,在2.6.27及更早的内核中使用的程序,从2.6.2 ...

  5. OpenStack 虚拟机冷/热迁移的实现原理与代码分析

    目录 文章目录 目录 前文列表 冷迁移代码分析(基于 Newton) Nova 冷迁移实现原理 热迁移代码分析 Nova 热迁移实现原理 向 libvirtd 发出 Live Migration 指令 ...

  6. 2021SC@SDUSC山东大学软件学院软件工程应用与实践--Ebiten代码分析 源码分析(三)

    2021SC@SDUSC 目录 一.概述 二.代码分析 1.Update() 2.Draw() 3.Layout() 一.概述 本文将介绍ebiten在RunGame函数中逐帧执行的Update()方 ...

  7. ijkplayer-音视频变速播放实现

    本文主要分析变速播放框架实现细节,不分析sonic以及soundtouch变速算法.在我的sonic变速变调原理一文中会详细讲解基于基音周期来实现变速变调的原理 1.变速入口分析 从jni层的_set ...

  8. 音频变速播放原理分析及实现方案

    [时间:2019-05] [状态:Open] [关键词:音频,audio,倍速,变速,变调,soundtouch,sonic] 音频变调变速原理分析 先来一段语音处理的理论: 变速变调可分为:变速不变 ...

  9. TrueCrypt 6.2a原理及代码分析

    TrueCrypt 6.2a原理及代码分析 3 comments 25th Apr 10 rafa 1 项目物理布局 Project     |____ Boot /* MBR部分的代码 */     ...

最新文章

  1. poco vs Boost
  2. 本科发表6篇SCI论文,获多个荣誉,他刚入学就享受研究生待遇!
  3. 【CV秋季划】模型优化很重要,如何循序渐进地学习好?
  4. Java动态代理详解(Proxy+InvocationHandler)
  5. 教你如何阅读Oracle数据库官方文档
  6. python求偏度系数_用 Python 讲解偏度和峰度
  7. [转]Win7 系统安装VS2008没反应 点击安装一闪就没有反应 .
  8. java jna调用dll文件_关于java jna调用dll的问题
  9. android提示程序正在执行,Android中获取正在运行的进程(一)
  10. 前端文件path路由:基于base引用
  11. eclipse 装配server时找不到tomcat
  12. php curl iis,解决IIS运行PHP出现Call to undefined function curl_init()的问题
  13. 号称有效期至2017年的 ESET Nod32 “付费”许可证,只要能用一年就行了
  14. google license key格式不对
  15. 云计算业务优势扩大,阿里云业务持续高速增长
  16. mysql deadlock found_MySQL遇到Deadlock found when trying to get lock,解决方案
  17. matlab plotyy 属性如何调整,科学网—【Matlab】如何用plotyy对应坐标绘制多条曲线 - 叶瑞杰的博文...
  18. 如何修改游戏服务器数据包,游戏数据包的定义
  19. Netty网络编程学习笔记(四)——进阶篇
  20. PC端微信更新至3.7.0版文件保存至MsgAttach文件夹乱码问题解决

热门文章

  1. 操作系统 实验三:线程的互斥
  2. 工作太闲闹心怎么办啊
  3. SourceTree安装跳过注册
  4. 纪中GMOJ语言模块题目1009
  5. Python实现VRP常见求解算法——离散量子行为粒子群算法(DQPSO)
  6. 欧几里得定理(nyoj775)
  7. win10打开telnet客户端
  8. Embeded linux之网卡驱动
  9. 领袖的七个非常重要的根性-余世维
  10. 【航天远景 MapMatrix 精品教程】04 Metashape空三导入MapMatrix