我是视频编码新手。我正在使用 FFmpeg 库来解码H.264 帧。我有以下 C++ 代码(完整代码位于here):
AVCodecContext *context = create_codec_context();
AVFrame *decoded_frame = av_frame_alloc();
avcodec_send_packet(context, encoded_packet);
avcodec_receive_frame(context, decoded_frame);
std::cout << decoded_frame->width << "\n"; // prints 1620, as expected
std::cout << decoded_frame->linesize[0] << "\n"; // prints 1664!
让我觉得奇怪的是解码帧的
linesize
。虽然框架的width
是1620
,但linesize[0]
是1664
。根据这个答案,计算linesize
时考虑了对齐。为了从 1664
获得 1620
,应该应用 64
作为与初始宽度的对齐。
我的问题是,这个
64
对齐从何而来?搜索 FFmpeg 代码没有给出任何结果。编码帧本身是否已经有这些信息?
如果之后我决定使用 av_image_copy_to_buffer() 将解码后的帧“展平”为一维数组,我应该使用什么对齐方式?也应该是
64
吗?
这是 ffmpeg 源代码的一部分,其中解释了对齐的工作原理: