|
- #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;
- }
- }
|