这几天做实验要用到视频的分帧Y分量数据,比较麻烦的方法是跟踪宏块的解码过程一块一块去拼,但实际上ffmpeg工程里是可以直接获取的:
位于libavcodec/utils.c下
int attribute_align_arg avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture,
int *got_picture_ptr,
const AVPacket *avpkt)
{
...
picture->data[0]即为Y分量。///以此类推data[1]、data[2]应该为UV(Cr、Cb)但是这个我没有验证
}
值得注意的是这里的YUV应该是最终解码的产物,也就是说是经过了环路滤波去除了块效应的。
环路滤波则需要回溯到libavcodec/h264_slice.c里,
static int decode_slice(struct AVCodecContext *avctx, void *arg)
{
loop_filter(...)
}
跟踪了一下过程大概是按宏块先行后列,还是稍微有点复杂的,具体可以学习雷神的Blog:https://blog.csdn.net/leixiaohua1020/article/details/45224579。