一、概述
解码从数据结构上看,是将 AVPacket
转换为 AVFrame
的过程。如何构建 AVPacket,以及获取到 AVFrame 后续要进行什么操作,严格来说并不是解码的步骤。
本文主要关注使用 FFmpeg
的软解 H.264
。虽然本文并不涉及 VideoToolBox
,但硬解和软解有一些共用的 API,并且软解过程更流畅,所以熟悉软解后再去了解硬解会容易。
早在2015年8月初,FFmpeg
就已经开始逐步支持 macOS 和 iOS 平台的 VideoToolBox
,2017年7月低,FFmpeg 在 example 中新增了一个 hw_decode.c 用于演示对文件的硬解码。以前使用过其软编码(基于 x264
)和软解码,也单独使用 VideoToolBox 进行过硬编码和硬解码。但是距离上次使用 FFmpeg 后其 API 发生了一些改变,VideoToolBox 也支持 HEVC
了,所以重新研究一次。
Libuv 官方文档( https://github.com/libuv/libuv/tree/v1.x/docs )对各种 C 结构及操作对应结构的 API 也有清晰的描述。本文首先简单分析 uv_loop_s
结构的定义。接着深入源码分析了 uv_loop_XXX
和 uv__loop_XXX
系列函数。
Libuv 官方文档( https://github.com/libuv/libuv/tree/v1.x/docs )和 uvbook ( http://nikhilm.github.com/uvbook/ ) 对 I/O ( event ) 循环有比较详细的介绍。
本文首先摘抄/抄袭了网络上对官方文档关于 I/O( event ) 描述的翻译,并做了必要的补充。