OBS-采集/编码

2021-09-24  本文已影响0人  上官宏竹

数据从采集到编码,依靠着全局变量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_outputvideo_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

编码/录制流程

OBS编码录制全流程图.png
上一篇 下一篇

猜你喜欢

热点阅读