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

直接上代码

#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 >>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值