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

22|视频录制项目实战:让你的录制器运行起来

你好,我是展晓凯。今天我们来一起学习视频录制器的最后一部分,让它跑起来。
上一节课我们一起实现了视频录制器中的底层模块,现在音频模块已经把音频编码为 AAC 数据放到 AAC 的音频队列里了,视频模块也已经把视频编码为 H264 的数据放到了 H264 的队列里。那这节课我们就需要把这两个队列里的压缩数据封装到一个 MP4 文件里,让整个视频录制器跑起来。
这节课我们也会分成两部分来讲解,第一部分是实现 Muxer 模块,这部分的职责是把压缩后的音视频数据封装成 MP4 格式并写入文件中,第二部分学习整个录制器的中控系统,用来管理各个模块的生命周期和数据流转,让整个录制器项目跑起来。下面就先进入第一部分的学习吧。

Muxer 模块

音频帧和视频帧都编码完毕之后,接下来就要把它们封装到一个容器里,比如 MP4、FLV、RMVB、AVI 等,录制器架构是通过一个 Muxer 模块来完成这个职责的。上一节课中的 AAC 和 H264 这两个队列就是 Muxer 模块的输入,那这个模块的输出又是什么?在我们现在的场景下就是磁盘上的一个 MP4 文件,当然也可以是网络流媒体服务器,那就成为直播场景的推流器了。
注意,这个模块也需要有一个自己单独的线程,我们叫它 Muxer 线程。由于不想影响采集以及实时耳返和预览的过程,所以在编码时单独抽取出一个线程。那为什么我们又要为封装和文件流输出(对应于 FFmpeg 的 Muxer 层和 Protocol 层)单独抽取出一个线程来呢?
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了视频录制器项目实战中Muxer模块的实现过程。Muxer模块的主要职责是将音频和视频数据封装成MP4格式并写入文件中。文章首先介绍了Muxer模块的初始化过程,包括使用FFmpeg实现格式封装与文件流输出的方法定义和参数配置。接着详细讲解了初始化方法内部的核心流程,包括构造Container、添加视频流和音频流,并配置音频格式转换的滤波器。此外,还介绍了音频和视频流的封装和输出过程,包括音频流的时间戳信息处理、ADTS格式的AAC转换为ADIF格式的AAC,以及视频流的extradata填充和关键帧判断等细节。文章还深入探讨了销毁资源和中控系统的实现。总体来看,本文通过具体的代码示例和详细的解释,帮助读者了解了Muxer模块的实现过程,为读者提供了实际操作的指导和技术细节的解析。文章还提出了思考题,引发读者思考如何在录制器项目中完成声音修饰和美颜功能。

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

全部留言(2)

  • 最新
  • 精选
  • peter
    请教老师几个问题啊: Q1:init方法的参数中没有“视频编码格式”。 文中对于init方法的解释中提到“包括视频宽、高、帧率以及比特率、视频编码格式(默认为 H264 格式”。 但是,init方法原型中并没有编码格式的参数。笔误吗? Q2:视频流的上下文中,time_base.den和time_base_num是什么意思? Q3:音频流的上下文中,为什么没有关于时间的设置? Q4:音频流的codec_name是怎么确定的? avcodec_find_encoder_by_name(codec_name); 其中的codec_name是怎么确定的? Q5:前面曾经请教过老师“混音”的问题。这个词是我自己想的,是不是这个术语用得不对?其实,我说的“混音”,就是指将两个音频叠加在一起,播放出来后能同时听到两个声音。这种情况,通用的术语叫什么? “合成”吗?FFmpeg有这个功能吗?

    作者回复: A1: 视频的编码格式我们默认都是H264格式,编码器一般也都用libx264。这句话是相对于音频来讲的,音频可能会是wav格式、aac格式、mp3格式,而即便是aac格式也可以有多种编码器可选择,比如fdk_aac、faac等; A2: 相当于是fps的计算,一个是分母、一个是分子; A3: pts、dts就是时间的设置; A4: 直接外部写死的,比如libfdk_aac A5: 一般叫mix,ffmpeg有一个AudioFilter叫amix

    2022-09-12归属地:北京
    1
  • xuyong
    请教老师一个问题,实际产品中。Android硬编硬解多,还是软编软解多。你们的产品是怎么做的?

    作者回复: 硬编码多一些,有问题黑名单降级为软件编码; 软件接码多一些。

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