使用 ffmpeg api 进行视频解码的步骤
概括来说,视频解码的步骤包括:
- 创建解码器
- 解封装,从视频流中读取一个 packet
- 将 packet 送给解码器,解码器进行解码
- 从解码器中,取回解码后的数据
创建解码器
在 ffmpeg 中与解码器相关的结构体有两个:AVCodec 和 AVCodecContext。
AVCodec结构体包含了编解码器的特定信息,如编解码器的类型、名称、支持的像素格式或音频样本格式等。你可以使用 avcodec_find_decoder
从 ffmpeg 支持的编解码器中找到你需要的那个。
avcodec_find_decoder 函数的主要目的是根据给定编解码器ID(AVCodecID)找到合适的解码器。在实现逻辑中,它对FFmpeg支持的所有编解码器进行迭代,并比较它们的AVCodecID与所需的AVCodecID。
如果发现有无法找到某个 id,有可能是因为你使用的 ffmpeg 做了裁剪,不支持这种类型的 codec,这时候你可以在代码中打印一下当前 ffmpeg 支持的 codec 信息:
AVCodec 结构体仅仅是对某个编解码器的描述,要进行编解码还需要 AVCodecContext 参与。
在 FFmpeg 中,AVCodecContext 是一个结构体,它表示编解码器的上下文,主要负责存储与编解码器相关的配置信息和状态。AVCodecContext 的作用在于为音频、视频或字幕数据的编码和解码过程提供所需要的各种参数和数据。AVCodecContext 包含以下主要信息:
- 编解码器类型(音频、视频或字幕)
- 编解码器的 ID(用于标识特定的编解码器,例如 H.264,MP3 等)
- 时间基(用于计算时间戳)
- 帧率或采样率(视频或音频播放的速度)
- 比特率(编解码后的数据流的速率)
- 编码或解码期间使用的各种配置选项(如像素格式,音频通道数量,视频分辨率等)
要使用特定的 AVCodec 对象进行编解码,需要为其配置一个相应的 AVCodecContext,并设置相应的参数。然后使用 FFmpeg 提供的函数(如 avcodec_open2,avcodec_send_packet 等)对数据进行编解码。
因此,AVCodecContext 是连接原始数据、编解码器(AVCodec)和输出数据之间的桥梁。它帮助用户在输入和输出之间传递数据,并提供编解码过程所需的参数。
在代码中,使用 avcodec_alloc_context3
创建一个 AVCodecContext
接着,需要填充 AVCodecContext 中各种信息,一种简便的方式是使用 avcodec_parameters_to_context
最后一步,使用 avcodec_open2
打开编解码器并与 AVCodecContext 相关联。