x264_picture_alloc()

本文详细介绍了x264_picture_alloc函数的工作原理,该函数用于为YUV420格式的图像分配内存。文章解释了如何为Y、U、V三个分量分配连续的内存空间,并给出了具体的内存布局和计算示例。

 

/*x264_picture_alloc() 按照色度空间分配内存,并返回内存的首地址作为指针

我们常说得YUV420属于planar格式的YUV,使用三个数组分开存放YUV三个分量,就像是一个三维平面一样。在常见H264测试的YUV序列中,例如CIF图像大小的YUV序列(352*288),在文件开始并没有文件头,直接就是YUV数据,先存第一帧的Y信息,长度为352*288个byte, 然后是第一帧U信息长度是352*288/4个byte, 最后是第一帧的V信息,长度是352*288/4个byte, 因此可以算出第一帧数据总长度是352*288*1.5,即152064个byte, 如果这个序列是300帧的话, 那么序列总长度即为152064*300=44550KB,这也就是为什么常见的300帧CIF序列总是44M的原因.*/

 

 

//初始化编码器 x264_t* init_x264_encoder(int width, int height, int fps) { x264_param_t param; x264_param_default_preset(&param, "ultrafast", "zerolatency"); param.i_width = width; param.i_height = height; param.i_fps_num = fps; param.i_fps_den = 1; param.i_csp = X264_CSP_NV12; param.i_threads = 1; param.rc.i_rc_method = X264_RC_CQP; param.rc.i_qp_constant = 25; param.i_log_level = 0; x264_param_apply_profile(&param, "high"); x264_t* encoder = x264_encoder_open(&param); if (!encoder) { std::cerr << "x264编码器初始化失败!" << std::endl; return nullptr; } return encoder; } //编码 int encode_frame_nv12(x264_t* encoder, const uint8_t* nv12Data, int width, int height, std::string& h264OutString) { if (!encoder || !nv12Data) return -1; // 3️⃣ 分配输入帧结构 x264_picture_t pic_in, pic_out; x264_picture_alloc(&pic_in, X264_CSP_NV12, width, height); // 4️⃣ 拆分 NV12 数据(连续内存:Y + UV) int y_size = width * height; int uv_size = y_size / 2; memcpy(pic_in.img.plane[0], nv12Data, y_size); memcpy(pic_in.img.plane[1], nv12Data + y_size, uv_size); // 5️⃣ 编码 x264_nal_t *nals = nullptr; int i_nals = 0; int frame_size = x264_encoder_encode(encoder, &nals, &i_nals, &pic_in, &pic_out); if (frame_size < 0) { std::cerr << "x264编码失败" << std::endl; x264_picture_clean(&pic_in); x264_encoder_close(encoder); return -3; } // 6️⃣ 输出拼接 h264OutString.clear(); for (int i = 0; i < i_nals; i++) { h264OutString.append(reinterpret_cast<char *>(nals[i].p_payload), nals[i].i_payload); } return 0; } //销毁编码器 void destroy_x264_encoder(x264_t* encoder) { if (encoder) x264_encoder_close(encoder); } 这是编码器相关代码,结合给出的相机采集代码,说明为什么每30帧才有帧头,若我想修改,应该如何修改
最新发布
11-29
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值