------------------------------------全系列文章目录------------------------------------

获取播放速率
  • 通过捕获SDL_KEYDOWN按键按下事件,并通过标志位判断当前的键位SDL_Event::SDL_KeyboardEvent::SDL_Keysym::SDL_Keycode为SDLK_1、SDLK_2和SDLK_5,分别对应1倍速、2倍速和0.5倍速。
视频和音频播放变速
  • 改变视频播放速率的方法为直接改变帧率即改变每帧的帧持续时间,加速时缩短帧持续时间,反之减小帧持续时间。但是变速后帧持续时间过短,就要采取丢帧的处理方式。

  • 改变音频播放速率的方法有三种:

    • 改变采样率,即对原PCM数据进行重采样处理。加速播放时提高采样率,反之减小采样率。但是这种方法会导致声音在变速的同时变调。

    • 丢帧和填充帧,即加速播放时丢帧处理,反之在原始帧之间填充空白帧。但是这种方法会导致播放期间有杂音存在。

    • 使用相关音频处理算法实现变速不变调,如soundtouch和sonic。

具体代码实现
  • 由于时间关系,此处使用了一个简化版本的变速播放方案,即视频变速采用改变每帧持续时间的方法,音频变速采用丢帧和填充帧的方法;同时只支持了2倍速率和0.5倍速率的变速档位。

  • 事件捕获后,采用一个变量记录当前的播放速率,默认为1。

    switch (_event.type) {case SDL_KEYDOWN:switch (_event.key.keysym.sym) {case SDLK_2:avc->play_rate = 2;break;case SDLK_1:avc->play_rate = 1;break;case SDLK_5:avc->play_rate = 0.5;break;} break;................default:break;
    }
    
  • 在更新当前帧持续时间时,改变帧持续时间的基准值。

    /*计算延时时间*/
    uint32_t AVCtrl::get_delay(double aclk, double vclk)
    {int64_t        delay;double        _duration, diff; /*根据播放速率改变帧持续时间的基准值*/_duration    = vc.get_duration() / play_rate;if (_isnan(aclk) || _isnan(vclk))return _duration;diff        = (aclk - vclk) * MICROSECOND_TO_SECOND;if (diff < 0) {if (-diff > 3 * _duration)    delay = (-diff - _duration);else delay = _duration;} else {delay = _duration - diff;delay = delay < 0 ? 0 : delay;}return delay;
    }
    
  • 在音频回调函数中,根据播放速率进行丢帧和填充空白帧处理。

    void fill_audio_callback(void *userdata, Uint8 * stream, int len)
    {static int play_rate_ctrl = 1;...............if (avc->play_rate == 2) { /*两倍速下,多解码一帧音频帧,但回调PCM数据的操作在下面步奏中*/avc->ac.pktq.packet_queue_get(&pkt);    //获取未解码帧数据while (avc->ac.get_frame(&pkt) == -1);    //解码并获取重采样的音频数据} else if (avc->play_rate == 0.5) { /*0.5倍速下,隔次回调返回空白数据*/play_rate_ctrl = -play_rate_ctrl;if (play_rate_ctrl == 1) SDL_memset(stream, 0, len);return;}...............
    }
    
  • 因为视频帧持续时间的获取是根据 基于pts的音视频时钟差和初始持续时间 来获取的,所以当音频和视频同时变速时,不需要更改音频帧和视频帧的pts数据,即可维持两者的pts在同一量级上。

大致流程
  • 因为采用的变速方案比较简单,因此在原先基础上改动的地方很少,且流程比较简单。

音视频播放器—变速播放相关推荐

  1. android音视频播放器开发百度云,Android 播放端 SDK

    1 概述 PLDroidPlayer 是一个适用于 Android 平台的音视频播放器 SDK,可高度定制化和二次开发,为 Android 开发者提供了简单.快捷的接口,帮助开发者在 Android ...

  2. Linux系统的madplay、mplayer音视频播放器的制作

    Linux系统音视频播放器的制作 madplay和mplayer的安装环境 一.Linux系统录音播放源码的下载和移植 1.需要下载alsa-lib-1.2.6.tar.bz2(声音驱动的内核组件库) ...

  3. 德声科技代理M-Live音视频播放器

    M-live于1987年在里米尼成立,30年来一直是意大利MIDI领域(软件和播放器)的领导者,音乐家.音响工程师和IT专家构成了其工作团队的核心. M-Live生产的乐器消除了个人与音乐体验之间的所 ...

  4. 开源安卓Android流媒体音视频播放器实现声音自动停止、恢复、一键静音功能源码

    本文转自EasyDarwin团队John的博客:http://blog.csdn.net/jyt0551/article/details/60802145 我们在开发安卓Android流媒体音视频播放 ...

  5. QT + FFmpeg 5.x + x264 + x265 + SDL2 音视频播放器

    QT + FFmpeg 5.x + x264 + x265 + SDL2 音视频播放器 使用了QT的QML设计界面,人机交互; 使用了FFmpeg 5.x + x264 + x265 + SDL2 完 ...

  6. 基于electron的音视频播放器

    基于electron的音视频播放器 前言 选择做一个音视频播放器桌面应用程序原因 技术的选型 已经实现了的功能 音视频播放实现 右键菜单实现 总结 效果图 安装包下载: 最后如果大家觉得我这个音视频播 ...

  7. 专业音视频播放器:Elmedia Video Player Pro mac中文版

    为大家推荐一款超级好用的苹果专用视频播放器,Elmedia Video Player Pro for Mac几乎支持所有的音视频格式,具备修改播放.流式传输.画中画.流传输视频到其他设备.彩色主题.观 ...

  8. Qt FFmpeg 音视频播放器

    使用FFmpeg库实现 本地和rtp 音视频播放器,使用qt绘制视频. 本demo环境为 qt5.12 vs2019-32位 .pro的qt工程 FFmpeg版本位3.4.8 vs2092-32位 本 ...

  9. 使用Qt编写的跨平台音视频播放器(一)

    1.初衷 为了学习Qt,遂自己琢磨着写一个音视频播放器(比较五花八门,借鉴模仿了好几个软件的界面),可以有很多种实现方式,在这里我使用的是QMediaPlayer,和QVideoWidget显示.有时 ...

最新文章

  1. Swift - 异常处理
  2. A Network-based End-to-End Trainable Task-oriented Dialogue System
  3. LintCode Python 简单级题目 96.链表划分
  4. 华为发布最强服务器芯片,[百家号]华为:最强ARM服务器芯片,华为鲲鹏920处理器发布...
  5. 前端知识笔记汇总200304
  6. Android笔记 意图传值demo
  7. 体重增长:目前为止我们所知道的一切器
  8. el x修改激活的菜单_3d快捷键
  9. Android Studio Entry name *.xml collided解决方案
  10. 面包板入门电子制作 学习笔记10
  11. html文件如何显示大纲视图,如何使用大纲视图生成章节目录
  12. 数据结构--算法达人修炼学习安排及方法指导
  13. 用C语言画一个Q版奥特曼
  14. Windows域提权漏洞CVE-2021-442287
  15. 最新软件云测试方法你知道多少?有什么好处
  16. 如何判断二叉树的前序,中序,后序遍历
  17. 二叉树练习:最小函数值
  18. 黑马JAVA知识点总结
  19. 《变形金刚2》剧情细节大揭秘(100%剧透!)
  20. 详解二叉树的前序遍历

热门文章

  1. 【JavaWeb】AJAX
  2. 诺贝尔物理学奖揭晓:LED灯将点亮整个21世纪
  3. maven 依赖com.google.code.kaptcha
  4. conda 安装pytorch(gpu)
  5. 6.Python常用第三方库—jieba库的使用(中文分词词库)
  6. cglib BeanCopier 使用
  7. vs2022创建窗口应用程序
  8. assert()详解
  9. Markdown小技巧:代码格式、缩进和字体大小
  10. Ramdisk虚拟内存盘,Swap分区