快手 · 移动端音视频开发实战
展晓凯
快手回森技术负责人
12246 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 25 讲
快手 · 移动端音视频开发实战
15
15
1.0x
00:00/00:00
登录|注册

09|播放器项目实践(三):让你的播放器跑起来

你好,我是展晓凯。今天我们进入播放器项目实战最后一部分的学习。
前面两节课,我们从播放器的场景入手设计出了播放器的架构,然后一起实现了播放器的底层核心模块,包括音频渲染模块、视频渲染模块与视频解码模块。这节课我们要把这些模块串联在一起,让我们的播放器运行起来。
用播放器播放视频最重要的一点就是要保证音画对齐,架构设计中的 AVSync 模块就承担这一职责。

AVSync 模块的实现

AVSync 模块除了负责音视频的同步之外,还要维护一个解码线程,主要工作就是线程的创建、暂停、运行、销毁,就是我们架构类图中 AVSynchronizer 这个类。
这个类的实现分为两部分,第一部分是维护解码线程,第二部分就是音视频同步。主要接口与实现有以下四个。
提供初始化接口,内部实现为:使用外界传递过来的 URI 去实例化解码器模块,实例化成功之后,创建音频队列与视频队列,并且创建解码线程,将音视频解码后的数据放入队列中;
提供获取音频数据接口,内部实现为:如果音频队列中有音频就直接去返回,同时要记录下这个音频帧的时间戳,如果音频队列中没有音频就返回静音数据;
提供获取视频帧接口,内部实现为:返回与当前播放的音频帧时间戳对齐的视频帧。
提供销毁接口,内部实现为:先停掉解码线程,然后销毁解码器,最后再销毁音视频队列。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了音视频同步在播放器项目中的实现方法,重点围绕AVSync模块展开。作者首先讨论了音视频同步的三种策略,并详细分析了各自的优缺点。文章强调了选择视频向音频对齐的方式,并解释了其实现原理。接着,介绍了中控模块的作用,将各个模块有机地组织起来,协同配合运行。文章还详细介绍了初始化、运行、销毁三个阶段的操作流程。通过本文,读者可以快速了解音视频同步的实现原理和中控模块的作用,对于想要深入了解播放器项目实践的读者具有一定的参考价值。 文章内容主要围绕音视频同步的实现展开,包括音频的渲染、视频的渲染、暂停和继续播放接口的实现以及销毁阶段的操作流程。整个播放器项目的设计与开发经历了输入模块、音频播放模块、视频播放模块、音视频同步模块和中控系统的实现。通过对整个设计与开发阶段的回顾,读者可以更清晰、更深刻地理解整个播放器项目的场景分析和架构设计。 在思考题中,提出了解决渲染音频帧间隔较大的设备导致视频帧渲染出现掉帧情况的问题,鼓励读者留下自己的答案并进行讨论。 总的来说,本文内容涵盖了音视频同步实现原理、播放器项目的设计与开发阶段以及解决实际问题的思考,对于对播放器项目感兴趣的读者具有一定的参考和学习价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《快手 · 移动端音视频开发实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(5)

  • 最新
  • 精选
  • 小跑猫
    老师,用于音视频同步的时间戳是怎么来的,比如视频和音频分别进行编码格式封装,那这俩的时间戳是在编码的时候写入的么,如果是话编码过程中如何保证时间戳的同步。

    作者回复: 是的,是在编码过程中写入的,如果编码过程中写入的不对,任何播放器都不能进行纠偏。 具体编码过程中如何保证同步,会再视频录制器项目中有详细讲解哈,大约在20、21小节。

    2022-08-28归属地:北京
    1
  • keepgoing
    老师蓝牙耳机的问题我想可以通过操作更细节的音视频同步方案解决,但是还没有特别明确思路 老师能不能给一些解答的思路,感谢!

    作者回复: 在上面一条已经回复

    2022-12-12归属地:北京
  • 一个正直的小龙猫
    老师的播放器 支持dash协议么?

    作者回复: 支持,是因为ffmpeg内部支持的,ffmpeg从3.4.2版本开始支持dash。

    2022-08-17归属地:北京
  • peter
    请教老师一个问题: Q1:“混音”的技术方案。 老师,我目前在写技术文档,安卓APP需要实现“混音”、“变速”、“变调”功能,主要是“混音”功能。“混音”,即在一个音频中插入一段音频。 比如一个音频文件A的长度是5分钟,插入一个30秒的音频片段B。可以在A的任意位置插入,即插入起点是任意的。插入后在叠加部分两个声音会同时播放。 根据前面的学习和老师解答,我的理解是:1 不能用ffmpeg,ffmpeg能用在安卓平台但它不支持混音功能;2 基于安卓自身的音频组件来实现“混音”功能; 3 安卓自身有五种方法:SDK层有MediaPlayer、SoundPool 和 AudioTrack三种方法。Native层有OpenSL ES、AAudio两种方法。 4 SDK中的MediaPlayer、SoundPool 、AudioTrack无法完成该功能;用Native层的OpenSL ES、AAudio。 技术方案总结起来就是:基于安卓自身Native层的OpenSL ES或AAudio,进行一定的编程,即可实现。(OpenSL ES或AAudio怎么使用,需要查阅文档)。 我的理解是否对?

    作者回复: 你描述的场景类似于一个编辑SDK的场景,其实非常类似回森App的弹幕功能。 其实就是在一个播放器的基础上,增加AudioProcess模块,在里面增加解码模块,然后根据需要插入的位置(displayRange)进行Mix到主音频轨即可。

    2022-08-12归属地:北京
    2
  • 我的無力雙臂
    demo能否分享一下

    作者回复: 后边在更新哈,现在正在更新课程中。

    2022-08-12归属地:北京
    2
收起评论
显示
设置
留言
5
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部