#include "VideoAfterProc.h" VideoAfterProc::VideoAfterProc(QObject* parent) : IAfterProc(parent) , m_pFfmpegDecodeNew(nullptr) , m_bNeedWork(false) , m_bIsPlay(false) , m_ulSpeedTime(10) {} VideoAfterProc::~VideoAfterProc() { m_file.flush(); m_file.close(); } void VideoAfterProc::getFfmpegDecode() { m_pFfmpegDecodeNew = m_pUIntParam.second->getVideoWidget()->getFfmpegDecode(); } void VideoAfterProc::run() { m_uiDataSize = m_byteArray.size(); m_uiIndex = 0; while (m_uiIndex + m_pFrame->m_uiFrameLen <= m_uiDataSize) { m_tempArray = m_byteArray.mid(m_uiIndex, 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(); m_uiIndex += m_pFrame->m_uiFrameLen; } m_uiDataSize = 0; m_uiIndex = 0; m_byteArray.clear(); // 剔除无效填充数据 if (m_usFillSize != 0) { rejectFillData(); } else { m_ableArray = m_validArray; m_validArray.clear(); } emit dataProcFinished(); // 将数据写入文件中 m_file.write(m_ableArray); m_file.flush(); m_file.close(); // 进行视频播放 resetVideoData(); QByteArray tempValid; m_bNeedWork = true; while (m_bNeedWork) { if (m_bIsPlay == true) { // 视频播放 while (m_uiIndex + VideoPacketLength <= m_uiDataSize) { if (m_bIsPlay == false) { break; } tempValid = m_ableArray.mid(m_uiIndex, VideoPacketLength); m_pFfmpegDecodeNew->getConstBuffer()->write((unsigned char*)tempValid.data(), VideoPacketLength); m_uiIndex += VideoPacketLength; emit playedCount(m_uiDataSize, m_uiIndex); QThread::msleep(m_ulSpeedTime); } if (m_bIsPlay == true) { // 计算末尾剩余视频 unsigned int m_uiDeltaSize = m_uiDataSize - m_uiIndex; tempValid = m_ableArray.mid(m_uiIndex, m_uiDeltaSize); m_pFfmpegDecodeNew->getConstBuffer()->write((unsigned char*)tempValid.data(), (unsigned short)m_uiDeltaSize); emit playedCount(m_uiDataSize, m_uiDataSize); // 重新赋值 resetVideoData(); startPlayer(false); } } } m_ableArray.clear(); } // 剔除无效填充数据 void VideoAfterProc::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_uiDataSize = 0; m_uiIndex = 0; m_validArray.clear(); } void VideoAfterProc::startPlayer(bool status) { m_bIsPlay = status; if (status == true) { m_pFfmpegDecodeNew->start(); } else if (status == false) { m_pFfmpegDecodeNew->stop(); } } void VideoAfterProc::stop() { m_bNeedWork = false; } void VideoAfterProc::setPlayPos(int pos) { QMutexLocker locker(&m_mutex); m_uiIndex = (unsigned int)((m_uiDataSize * 1.0) * (pos * 1.0 / 100.0)); } void VideoAfterProc::resetVideoData() { m_uiDataSize = m_ableArray.size(); m_uiIndex = 0; } void VideoAfterProc::videoSpeed(QString speed) { if (speed == "x1") { m_ulSpeedTime = 10; } else if (speed == "x2") { m_ulSpeedTime = 5; } else if (speed == "x5") { m_ulSpeedTime = 2; } else if (speed == "x10") { m_ulSpeedTime = 1; } }