数据从采集到编码,依靠着全局变量obs进行联络,包括不同线程间的数据传递。
全局变量obs
位于obs.c
中定义struct obs_core *obs = NULL;
,在obs_init
申请内存和初始化相关内容。
视频待编码数据存放在:obs->video.video->cache[0...15].frame.data[0...]
中。
注意:typedef struct video_output video_t;
,即video_output
与video_t
一致。
输出output
obs_output_create中调用插件创建接口,保存插件创建的数据指针。而create返回的指针将会传递给插件的start接口。
obs_output_create() {
output->context.data =
info->create(output->context.settings, output);
}
编码过程
obs_x264_encode中编码,调用init_pic_data将obs内部数据结构装换为x264需要的数据。 x264_encoder_encode
X264结构体
/********************************************************************************************
x264_image_t 结构用于存放一帧图像实际像素数据。该结构体定义在x264.h中
*********************************************************************************************/
typedef struct
{
int i_csp; // 设置彩色空间,通常取值 X264_CSP_I420,所有可能取值定义在x264.h中
int i_plane; // 图像平面个数,例如彩色空间是YUV420格式的,此处取值3
int i_stride[4]; // 每个图像平面的跨度,也就是每一行数据的字节数
uint8_t *plane[4]; // 每个图像平面存放数据的起始地址, plane[0]是Y平面,
// plane[1]和plane[2]分别代表U和V平面
} x264_image_t;
/********************************************************************************************
x264_picture_t 结构体描述一视频帧的特征,该结构体定义在x264.h中。
*********************************************************************************************/
typedef struct
{
int i_type; // 帧的类型,取值有X264_TYPE_KEYFRAME、X264_TYPE_P、
// X264_TYPE_AUTO等。初始化为auto,则在编码过程自行控制。
int i_qpplus1; // 此参数减1代表当前帧的量化参数值
int i_pic_struct; // 帧的结构类型,表示是帧还是场,是逐行还是隔行,
// 取值为枚举值 pic_struct_e,定义在x264.h中
int b_keyframe;// 输出:是否是关键帧
int64_t i_pts; // 一帧的显示时间戳
int64_t i_dts; // 输出:解码时间戳。当一帧的pts非常接近0时,该dts值可能为负。
/* 编码器参数设置,如果为NULL则表示继续使用前一帧的设置。某些参数
(例如aspect ratio) 由于收到H264本身的限制,只能每隔一个GOP才能改变。
这种情况下,如果想让这些改变的参数立即生效,则必须强制生成一个IDR帧。*/
x264_param_t *param;
x264_image_t img; // 存放一帧图像的真实数据
x264_image_properties_t prop;
x264_hrd_t hrd_timing; // 输出:HRD时间信息,仅当i_nal_hrd设置了才有效
void *opaque; // 私有数据存放区,将输入数据拷贝到输出帧中
} x264_picture_t ;
参考:x264重要结构体详细说明(2): x264_image_t、x264_picture_t、x264_nal_t