移动端音视频从零到上手:https://juejin.cn/post/6844903889007820813
这篇文章是目录,列举了基本概念内容简单。重点是相关的link是代码实现,内容主要
================================================
音视频硬解码汇总
音视频硬解码篇 二、音视频硬解码流程:封装基础解码框架
https://www.jianshu.com/p/ff65ef5207ce
小结:文章以step为主线,每个step都做了comments和实例说明,按照文章中的steps 走就行。
这节主要是类的设计:定义解码器:IDecoder,继承Runnable,定义音视频数据分离器IExtractor.
后面的章节就是IDecoder和IExtractor的具体实现.
解码流程:按照流程图实现
【解码步骤:1. 初始化,并启动解码器】
【解码步骤:2. 将数据压入解码器输入缓冲】
【解码步骤:3. 将解码好的数据从缓冲区拉取出来】
【解码步骤:4. 渲染】
【解码步骤:5. 释放输出缓冲】
【解码步骤:6. 判断解码是否完成】
【解码步骤:7. 释放解码器】
音视频硬解码篇 三、音视频播放:音视频同步
https://blog.csdn.net/cxpamcu/article/details/102404414
本文的题目不准确,主要内容是音视频的抽取和播放,次要才是音视频的同步。
音视频数据流分离提取器:MMExtractor封装Android原生提取器MediaExtractor, 即MediaExtractor的wrapper.
一、音视频数据流分离提取器
【1,初始化】
【2.1/2.2,获取音视频多媒体格式】
【3,提取数据】
1)readBuffer(byteBuffer: ByteBuffer)
2)selectSourceTrack() 通道切换
3)然后读取数据:mExtractor!!.readSampleData(byteBuffer, 0)??
【4,释放提取器】
封装音频和视频提取器
定义的提取器模型 interface IExtractor
视频提取器
class VideoExtractor(path: String): IExtractor {
//实现各种上篇blog中基类定义的接口
}
音频提取器
class AudioExtractor(path: String): IExtractor {
//实现各种上篇blog中基类定义的接口
}
二、视频播放
生成数据提取器
配置解码器
初始化Surface: surfaceview 也是一种view
<SurfaceView android:id="@+id/sfv"
....../>
渲染 什么也没写
三、音频播放
1. 初始化解码器
2. 获取参数不一样
3. 需要初始化一个音频渲染器:AudioTrack
4. 手动渲染音频数据,实现播放
四、调用并播放
//开启播放
videoDecoder.goOn()
audioDecoder.goOn()
五、音视频同步
scenario1: 不考虑暂停
同步的原理如下:
进入解码前: mStartTimeForSync=获取当前系统时间。
一帧数据解码出来以后:已经播放的时间= 当前系统时间- mStartTimeForSync
如果当前帧的PTS大于流失的时间,进入sleep,否则直接渲染。
scenario2:考虑暂停
1) 暂停的时间段=系统时间-暂停时间
新的mStartTimeForSync= mStartTimeForSync + 暂停的时间段
2) 新的mStartTimeForSync=恢复播放时的系统时间-当前正要播放的帧的PTS
音视频硬解码篇:四、音视频解封和封装:生成一个MP4
https://blog.csdn.net/cxpamcu/article/details/103486483
本文的重点是解封和封装。
解封使用mExtractor.read(mExtractor是前文实现,wrapper android自带的分离器) 。
封装使用android的meidaMuxer, mMediaMuxer?.writeSampleData
一、音视频解封
第一步,初始化MediaExtractor
第二步,获取音频或视频的格式
第三步,读取(分离)音视频数据
mExtractor!!.readSampleData
mExtractor!!.advance()//进入下一帧
二、音视频封装
第一步,初始化
第二步,添加音视频轨道,设置音视频数据流格式,并启动封装器
第三步,写入数据,也很简单,将解封得到的数据写入即可。
mMediaMuxer?.writeSampleData(mVideoTrackIndex, byteBuffer, bufferInfo)
mMediaMuxer?.writeSampleData(mAudioTrackIndex, byteBuffer, bufferInfo)
第四步,释放封装器,完成封装过程
三、整合解封和封装流程
首先,定义了音频和视频分离器,以及封装器;
接着,判断要重封装的视频是否包含有音视频数据,没有则忽略相应的轨道;
最后,启动线程,开始解封和封装,分为两部分:
音频数据分离和写入
视频数据分离和写入
四、调用MediaRepack重封装工具实现重封装
MP4Repack