You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

VideoAfterProc.cpp 4.3 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. #include "VideoAfterProc.h"
  2. VideoAfterProc::VideoAfterProc(QObject* parent)
  3. : IAfterProc(parent)
  4. , m_pFfmpegDecodeNew(nullptr)
  5. , m_bNeedWork(false)
  6. , m_bIsPlay(false)
  7. , m_ulSpeedTime(10)
  8. {}
  9. VideoAfterProc::~VideoAfterProc()
  10. {
  11. m_file.flush();
  12. m_file.close();
  13. }
  14. void VideoAfterProc::getFfmpegDecode()
  15. {
  16. m_pFfmpegDecodeNew = m_pUIntParam.second->getVideoWidget()->getFfmpegDecode();
  17. }
  18. void VideoAfterProc::run()
  19. {
  20. m_uiDataSize = m_byteArray.size();
  21. m_uiIndex = 0;
  22. while (m_uiIndex + m_pFrame->m_uiFrameLen <= m_uiDataSize) {
  23. m_tempArray = m_byteArray.mid(m_uiIndex, m_pFrame->m_uiFrameLen);
  24. // 从数据通道中提取数据
  25. for (auto channel : m_pParam->m_pChannelGroup->m_vecChannel) {
  26. m_validArray.append(m_tempArray.at(channel->m_uiAbsolutePos));
  27. }
  28. m_tempArray.clear();
  29. m_uiIndex += m_pFrame->m_uiFrameLen;
  30. }
  31. m_uiDataSize = 0;
  32. m_uiIndex = 0;
  33. m_byteArray.clear();
  34. // 剔除无效填充数据
  35. if (m_usFillSize != 0) {
  36. rejectFillData();
  37. } else {
  38. m_ableArray = m_validArray;
  39. m_validArray.clear();
  40. }
  41. emit dataProcFinished();
  42. // 将数据写入文件中
  43. m_file.write(m_ableArray);
  44. m_file.flush();
  45. m_file.close();
  46. // 进行视频播放
  47. resetVideoData();
  48. QByteArray tempValid;
  49. m_bNeedWork = true;
  50. while (m_bNeedWork) {
  51. if (m_bIsPlay == true) { // 视频播放
  52. while (m_uiIndex + VideoPacketLength <= m_uiDataSize) {
  53. if (m_bIsPlay == false) {
  54. break;
  55. }
  56. tempValid = m_ableArray.mid(m_uiIndex, VideoPacketLength);
  57. m_pFfmpegDecodeNew->getConstBuffer()->write((unsigned char*)tempValid.data(),
  58. VideoPacketLength);
  59. m_uiIndex += VideoPacketLength;
  60. emit playedCount(m_uiDataSize, m_uiIndex);
  61. QThread::msleep(m_ulSpeedTime);
  62. }
  63. if (m_bIsPlay == true) {
  64. // 计算末尾剩余视频
  65. unsigned int m_uiDeltaSize = m_uiDataSize - m_uiIndex;
  66. tempValid = m_ableArray.mid(m_uiIndex, m_uiDeltaSize);
  67. m_pFfmpegDecodeNew->getConstBuffer()->write((unsigned char*)tempValid.data(),
  68. (unsigned short)m_uiDeltaSize);
  69. emit playedCount(m_uiDataSize, m_uiDataSize);
  70. // 重新赋值
  71. resetVideoData();
  72. startPlayer(false);
  73. }
  74. }
  75. }
  76. m_ableArray.clear();
  77. }
  78. // 剔除无效填充数据
  79. void VideoAfterProc::rejectFillData()
  80. {
  81. m_uiDataSize = m_validArray.size();
  82. m_uiIndex = 0;
  83. while (m_uiIndex + m_usFillSize <= m_uiDataSize) {
  84. if (m_validArray.at(m_uiIndex) != m_fillArray.at(0)) {
  85. m_ableArray.append(m_validArray.at(m_uiIndex));
  86. ++m_uiIndex;
  87. } else if (m_validArray.at(m_uiIndex) == m_fillArray.at(0)) {
  88. if (m_validArray.mid(m_uiIndex, m_usFillSize) != m_fillArray) {
  89. m_ableArray.append(m_validArray.at(m_uiIndex));
  90. ++m_uiIndex;
  91. } else {
  92. m_uiIndex += m_usFillSize;
  93. }
  94. }
  95. }
  96. m_uiDataSize = 0;
  97. m_uiIndex = 0;
  98. m_validArray.clear();
  99. }
  100. void VideoAfterProc::startPlayer(bool status)
  101. {
  102. m_bIsPlay = status;
  103. if (status == true) {
  104. m_pFfmpegDecodeNew->start();
  105. } else if (status == false) {
  106. m_pFfmpegDecodeNew->stop();
  107. }
  108. }
  109. void VideoAfterProc::stop()
  110. {
  111. m_bNeedWork = false;
  112. }
  113. void VideoAfterProc::setPlayPos(int pos)
  114. {
  115. QMutexLocker locker(&m_mutex);
  116. m_uiIndex = (unsigned int)((m_uiDataSize * 1.0) * (pos * 1.0 / 100.0));
  117. }
  118. void VideoAfterProc::resetVideoData()
  119. {
  120. m_uiDataSize = m_ableArray.size();
  121. m_uiIndex = 0;
  122. }
  123. void VideoAfterProc::videoSpeed(QString speed)
  124. {
  125. if (speed == "x1") {
  126. m_ulSpeedTime = 10;
  127. } else if (speed == "x2") {
  128. m_ulSpeedTime = 5;
  129. } else if (speed == "x5") {
  130. m_ulSpeedTime = 2;
  131. } else if (speed == "x10") {
  132. m_ulSpeedTime = 1;
  133. }
  134. }