X264作为一个开源的视频编码函数库,是最好的有损视频编码,小巧而又简单。所以对X264的学习是非常有必要的。
在下载X264源代码使用时,需要先对其进行编译,产生相应的.dll,.lib,.h文件,然后拷贝到我们的工程下才行。具体的X264的编译过程:点击打开链接。但是X264的编译过程非常麻烦,很费力气,所以可以下载编译好的.dll,.lib,.h文件直接使用,这样比较省力,下载的链接:点击打开链接 。
在进行X264的编码之前,先看一下编码的整体流程图(流程图来自于雷霄骅的博客,链接在下面):
经过这个流程图我们可以很清晰的清楚编码的过程,简单看下它的各个主要函数:
x264_param_default():用来设置结构体x264_param_t的缺省值(结构体x264_param_t里有着编码的各项参数);
x264_picture_alloc():为结构体x264_picture_t分配内存;
x264_encoder_open():打开编码器;
x264_picture_t:结构体,用来存储压缩编码前的像素数据;
x264_encoder_encode():编码一帧图像;
x264_nal_t:结构体,存储压缩编码后的码流数据;
flush_encoder:这里使用的函数和编码模块一样,输出编码器中剩余的码流数据;
x264_encoder_close():关闭编码器;
x264_picture_clean():释放x264_picture_alloc()申请的资源。
具体代码分析:
(1)头文件:
#include "stdint.h"
#include <stdio.h>
#include <stdlib.h>
extern "C"
{
#include "x264.h"
}
#define width 640
#define height 360
这里x264.h就是我们编译得到的文件,此外还有x264_config.h,要一起保存在项目工程里。
(2)变量声明:
int i;
int j;
int frame_num = 100;
int csp = X264_CSP_I420;
int y_size = width*height;
int n_nal;
int ret;
x264_param_t* param = (x264_param_t*)malloc(sizeof(x264_param_t));
x264_picture_t* pic_in = (x264_picture_t*)malloc(sizeof(x264_picture_t));
x264_picture_t* pic_out = (x264_picture_t*)malloc(sizeof(x264_picture_t));
x264_nal_t* nal = (x264_nal_t *)malloc(sizeof(x264_nal_t));
x264_t *encoder;
上面是函数中需要用到的一些参数定义。
视频尺寸是640x260,YUV42