#include "VideoProcess.h" VideoProcess::VideoProcess(QObject* parent) : IProcess(parent) //, m_pFfmpegDecodeOld(nullptr) , m_pFfmpegDecodeNew(nullptr) , m_bIsPlay(false) { /* m_pFfmpegDecodeOld = new FfmpegDecodeOld(); //将获取的数据传入到FFmpeg模块中 m_pFfmpegDecodeOld->start(); */ } VideoProcess::~VideoProcess() { if (m_pConstBuffer) { delete m_pConstBuffer; m_pConstBuffer = nullptr; } m_file.write(m_fileArray); m_file.flush(); m_file.close(); } void VideoProcess::getFfmpegDecode() { m_pConstBuffer = new ConstBuffer(VideoBufferLength, false, false, m_pFrame->m_uiFrameLen); m_pFfmpegDecodeNew = m_pUIntParam.second->getVideoWidget()->getFfmpegDecode(); } void VideoProcess::run() { /*Ffmpeg探测网络流格式(勿删) unsigned char* m_pOriginBuffer = new unsigned char[m_pFrame->m_uiValidFrameLen]; unsigned short usRecvSize = 0; m_bNeedWork = true; while (m_bNeedWork) { usRecvSize =m_pConstBuffer->read(m_pOriginBuffer, m_pFrame->m_uiValidFrameLen); if (usRecvSize <= 0) { continue; } //剔除视频中的无效数据 //向FFmpeg中写入数据,每次写入VideoPacketLength个字节 QByteArray videoArray; m_pFfmpegDecodeOld->getConstBuffer()->write((unsigned char*)videoArray.data(),VideoPacketLength); }*/ unsigned char* m_ReadBuffer = new unsigned char[m_pFrame->m_uiFrameLen]; unsigned short usReadLen; m_bNeedWork = true; while (m_bNeedWork) { if (m_bIsPlay == false) { continue; } usReadLen = m_pConstBuffer->read(m_ReadBuffer, m_pFrame->m_uiFrameLen); if (usReadLen <= 0) { QThread::usleep(1); continue; } // 提取通道数据 m_tempArray = QByteArray((char*)m_ReadBuffer, m_pFrame->m_uiFrameLen); // 从数据通道中提取数据 // 提取一个数据,添加一个时间 for (auto channel : m_pParam->m_pChannelGroup->m_vecChannel) { m_validArray.append(m_tempArray.at(channel->m_uiAbsolutePos)); } m_tempArray.clear(); // 剔除无效数据 if (m_usFillSize != 0) { rejectFillData(); } else { m_ableArray.append(m_validArray); m_validArray.clear(); } // 将数据写入文件中 m_fileArray.append(m_ableArray); if (DataAchiveBuffer <= m_fileArray.size()) { m_file.write(m_fileArray); m_file.flush(); m_fileArray.clear(); } // 将数据放到播放器中 validDataDeal(); } } void VideoProcess::rejectFillData() { m_uiDataSize = m_validArray.size(); m_uiIndex = 0; while (m_uiIndex + m_usFillSize <= m_uiDataSize) { if (m_validArray.at(m_uiIndex) != m_fillArray.at(0)) { m_ableArray.append(m_validArray.at(m_uiIndex)); ++m_uiIndex; } else if (m_validArray.at(m_uiIndex) == m_fillArray.at(0)) { if (m_validArray.mid(m_uiIndex, m_usFillSize) != m_fillArray) { m_ableArray.append(m_validArray.at(m_uiIndex)); ++m_uiIndex; } else { m_uiIndex += m_usFillSize; } } } m_validArray.remove(0, m_uiIndex); m_uiDataSize = 0; m_uiIndex = 0; } void VideoProcess::validDataDeal() { /* if (m_bIsPlay == true) { //将数据放到播放器中 m_uiDataSize = m_ableArray.size(); m_uiIndex = 0; QByteArray tempValid; while (m_uiIndex + VideoPacketLength <= m_uiDataSize) { tempValid = m_ableArray.mid(m_uiIndex, VideoPacketLength); m_pFfmpegDecodeNew->getConstBuffer()->write((unsigned char*)tempValid.data(), VideoPacketLength); m_uiIndex += VideoPacketLength; } m_ableArray.remove(0,m_uiIndex); m_uiDataSize = 0; m_uiIndex = 0; } else if(m_bIsPlay == false){ m_ableArray.clear(); m_uiDataSize = 0; m_uiIndex = 0; }*/ if (m_bIsPlay == true) { // 将数据放到播放器中 m_pFfmpegDecodeNew->getConstBuffer()->write((unsigned char*)m_ableArray.data(), (unsigned short)m_ableArray.size()); m_ableArray.clear(); } else if (m_bIsPlay == false) { m_ableArray.clear(); } } void VideoProcess::startPlayer(bool status) { m_bIsPlay = status; if (m_bIsPlay == true) { m_pFfmpegDecodeNew->start(); } else if (m_bIsPlay == false) { m_pFfmpegDecodeNew->stop(); } }