将OpenCV抓拍的图片进行x264编码并保存到文件

该博客介绍了如何利用OpenCV抓取图片,并使用X264将其编码为h264格式的文件。通过提供的代码示例,可以将图片编码后保存,最终使用Elecard StreamEye工具进行查看。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直接上代码

#include <opencv.hpp>
#include <Windows.h>
#include <mutex>
#include <queue>
#include <memory>
#include <thread>

#include "atlstr.h"

extern "C"
{
#include "x264.h"
#include "x264_config.h"
};

using namespace cv;
using namespace std;

const int iWidth  = 640;
const int iHeigth = 480;

mutex g_i_mutex;
queue <shared_ptr<unsigned char>> YUVFrame;
FILE* fp_out = nullptr;

bool bStop = false;

int i_pts = 0;

x264_t* m_x264Encoder = nullptr;

shared_ptr<x264_picture_t> m_pictureIn = make_shared<x264_picture_t>();

x264_param_t m_x264Param;

shared_ptr<unsigned char> sps = nullptr;
shared_ptr<unsigned char> pps = nullptr;
int spslen = 0;
int ppslen = 0;
const unsigned char pHeader[4] = { '\0', '\0', '\0', '\1' };
int iSize = 0;
bool bSave = false; //保存当前图片,进行编码,为了保证一秒有30帧的数据

shared_ptr<unsigned char> GetFrame()
{
	shared_ptr<unsigned char> yuvFrame(nullptr);
	{
		lock_guard<mutex> lock(g_i_mutex);

		if (!YUVFrame.empty())
		{
			yuvFrame = YUVFrame.front();
			YUVFrame.pop();
		}
	}

	return yuvFrame;
}

void OutputDebugPrintf(const char* strOutputString, ...)
{
	char strBuffer[4096] = { 0 };
	va_list vlArgs;
	va_start(vlArgs, strOutputString);

	_vsnprintf_s(strBuffer, sizeof(strBuffer)-1, strOutputString, vlArgs);
	va_end(vlArgs);
	OutputDebugString(CA2W(strBuffer));
}


void EncodeImage()
{
	int pos = 0;
	while (!bStop)
	{
		shared_ptr<unsigned char> yuvFrame = GetFrame();

		if (yuvFrame)
		{
			//cout << "count size: " << yuvFrame.use_count() << endl;
			//编码
			m_pictureIn.get()->i_pts = i_pts++;
			//m_pictureIn->opaque = opaque;

			m_pictureIn.get()->img.plane[0] = yuvFrame.get();
			m_pictureIn.get()->img.plane[1] = yuvFrame.get() + m_x264Param.i_height * m_x264Param.i_width;
			m_pictureIn.get()->img.plane[2] = yuvFrame.get() + m_x264Param.i_height * m_x264Param.i_width * 5 / 4;
			m_pictureIn.get()->img.i_stride[0] = m_x264Param.i_width;
			m_pictureIn.get()->img.i_stride[1] = m_x264Param.i_width >> 1;
			m_pictureIn.get()->img.i_stride[2] = m_x264Param.i_width >>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值