直接上代码
#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 >>