本篇文件主要分析 音视频文件 是怎么产生的 , 以及 音视频文件是如何播放的 ;
视频文件从录像到生成文件的全过程 :
采集图像帧 : 摄像头 硬件 负责 采集画面 , 采集的 初始画面 称为 " 图像帧 " , 一秒钟 采集 的 图像帧 数量 称为 " 帧率 " , 如 : 60 帧 就是 一秒钟采集 60 个画面的 图像帧 ;
图像处理 : 如果想要 对视频画面进行修改 , 如 : 添加滤镜 , 调亮画面 , 增加字幕等 , 可以针对 " 图像帧 " 进行修改 , 修改的过程就是 " 图像处理 " ;
图像帧队列 : 将 处理完毕 的 图像帧 , 放到一个 " 图像帧队列 ( Frame Queue ) " 中 , 等待 视频编码 ;
视频编码 : 在 图像帧队列 ( Frame Queue ) 中的视频画面 , 体积非常大 , 1 分钟可能达到 1GB 大小 , 视频的画面必须要进行 压缩编码 ;
视频包队列 : 将 图像帧 编码 后 , 放到 视频包 中 , 然后 将若干 视频包 放到 " 视频包队列 ( Packet Queue ) " 中 , 等待封装 ;
复用封装 : 使用 复用器 将 视频包队列 和 音频包队列 封装在一起 , 得到 一个 包含 音频 和 视频 的 文件 ;
音频文件从录音到生成文件的全过程 :
采集音频帧 : 麦克风 硬件 负责 采集音频 , 采集的 初始音频 称为 " 采样 " , 一秒钟 采集 的 采样 数量 称为 " 采样率 " , 如 : 44100Hz 采样率 就是 一秒钟采集了 44100 个采样点 ; 采样帧 一般一帧封装若干采样点 , 如 10 毫秒的采样点 也就是 441 个采样 作为一帧数据 ;
音频处理 : 如果想要 对音频声音进行修改 , 如 : 变声 , 增加混响音效 , 噪声处理 等 , 可以针对 " 音频帧 " 进行修改 , 修改的过程就是 " 音频处理 " ;
采样帧队列 : 将 处理完毕 的 采样帧 , 放到一个 " 采样帧队列 ( Frame Queue ) " 中 , 等待 音频编码 ;
视频编码 : 在 采样帧队列 ( Frame Queue ) 中的 PCM 原始音频数据 , 体积非常大 , PCM 就是 WAV 格式的音频 , 没有经过任何压缩 , 音频必须要进行编码 , 编码为 mp3 或 ogg 格式 , 能压缩 10 倍的大小 ;
音频包队列 : 将 采样帧 编码 后 , 放到 音频包 中 , 然后将若干 音频包 放到 " 音频包队列 ( Packet Queue ) " 中 , 等待封装 ;
复用封装 : 使用 复用器 将 视频包队列 和 音频包队列 封装在一起 , 得到 一个包含 音频 和 视频 的 文件 ;
音频采样编码封装 的过程 是下图 红色矩形框内的过程 :
拿到 音视频 文件后 , 播放该文件 , 需要经过以下步骤才能播放出来 :
解复用 : 复用 是 将 音频包队列 ( Packet Queue ) 和 视频包队列 ( Packet Queue ) 封装为一个 音视频文件 , purple解复用是 复用 的 逆向过程 , 就是将 音视频文件 解封装为 音频包队列 ( Packet Queue ) 和 视频包队列 ( Packet Queue ) ;
解码操作 : 与上一个章节 编码 操作相对应 , 是 编码 的 逆向过程 ;
音视频同步 : 解码后的 采样帧队列 和 视频帧队列 , 需要 根据每一帧的 时钟信息 , 进行 音视频同步操作 ;
音视频处理 :
音视频播放 :