代码
参考FFMpeg中example代码写了个简单的HEVC解码器(实际上修改了CODECID应该都能解码)
example的代码位于doc/examples路径下
运行方法
获取到FFMpeg编译包(包括include和lib,还有dll这些,后面会写一下如何在windows下编译生成ffmpeg)
实际FFMpeg编译后生成包含的头文件很少,可能因为主要是为了包装成上层应用。因此我在读取解码后的量化参数的时候,把hevcdec.h之类的文件也全部复制过来了,主要是为了调用HEVCContext这个结构体,里面的qp_y_tab包含每个min_cb的量化参数。
应该是可以根据划分深度,获取到每个编码块的量化参数,这样更符合码流分析的习惯。但是目前没有找到有用ffmpeg对HEVC码流实现码流分析的开源项目,因此都是自己瞎琢磨,每个参数每个变量去找他们的用途和含义,因此有很多不懂的地方法,有写的不合理和不对的地方,烦请指出。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
extern "C" {
#include <libavcodec/avcodec.h>
#include <libavcodec/codec_desc.h>
#include <libavcodec/codec.h>
#include <libavcodec/hevcdec.h>
}
#define INBUF_SIZE 4096
FILE* fr;
static void pgm_save(AVFrame *frame, int xsize, int ysize,
char* filename)
{
//FILE* f;
int i, j, k;
int width = frame->width;
//fprintf(f, "P5\n%d %d\n%d\n", xsize, ysize, 255);
for (i = 0; i < ysize; i++)
fwrite(frame->data[0] + width * i , 1, width, fr);
for (j = 0; j < ysize / 2; j++)
fwrite(frame->data[1] + width / 2 * j, 1, width / 2, fr);
for (k = 0; k < ysize / 2; k++)
fwrite(frame->data[2] + width / 2 *