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.

VideoProcess.cpp 4.7 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. #include "VideoProcess.h"
  2. VideoProcess::VideoProcess(QObject* parent)
  3. : IProcess(parent)
  4. //, m_pFfmpegDecodeOld(nullptr)
  5. , m_pFfmpegDecodeNew(nullptr)
  6. , m_bIsPlay(false)
  7. {
  8. /*
  9. m_pFfmpegDecodeOld = new FfmpegDecodeOld();
  10. //将获取的数据传入到FFmpeg模块中
  11. m_pFfmpegDecodeOld->start();
  12. */
  13. }
  14. VideoProcess::~VideoProcess()
  15. {
  16. if (m_pConstBuffer) {
  17. delete m_pConstBuffer;
  18. m_pConstBuffer = nullptr;
  19. }
  20. m_file.write(m_fileArray);
  21. m_file.flush();
  22. m_file.close();
  23. }
  24. void VideoProcess::getFfmpegDecode()
  25. {
  26. m_pConstBuffer = new ConstBuffer(VideoBufferLength, false, false, m_pFrame->m_uiFrameLen);
  27. m_pFfmpegDecodeNew = m_pUIntParam.second->getVideoWidget()->getFfmpegDecode();
  28. }
  29. void VideoProcess::run()
  30. {
  31. /*Ffmpeg探测网络流格式(勿删)
  32. unsigned char* m_pOriginBuffer = new unsigned char[m_pFrame->m_uiValidFrameLen];
  33. unsigned short usRecvSize = 0;
  34. m_bNeedWork = true;
  35. while (m_bNeedWork) {
  36. usRecvSize =m_pConstBuffer->read(m_pOriginBuffer, m_pFrame->m_uiValidFrameLen);
  37. if (usRecvSize <= 0) {
  38. continue;
  39. }
  40. //剔除视频中的无效数据
  41. //向FFmpeg中写入数据,每次写入VideoPacketLength个字节
  42. QByteArray videoArray;
  43. m_pFfmpegDecodeOld->getConstBuffer()->write((unsigned
  44. char*)videoArray.data(),VideoPacketLength);
  45. }*/
  46. unsigned char* m_ReadBuffer = new unsigned char[m_pFrame->m_uiFrameLen];
  47. unsigned short usReadLen;
  48. m_bNeedWork = true;
  49. while (m_bNeedWork) {
  50. if (m_bIsPlay == false) {
  51. continue;
  52. }
  53. usReadLen = m_pConstBuffer->read(m_ReadBuffer, m_pFrame->m_uiFrameLen);
  54. if (usReadLen <= 0) {
  55. QThread::usleep(1);
  56. continue;
  57. }
  58. // 提取通道数据
  59. m_tempArray = QByteArray((char*)m_ReadBuffer, m_pFrame->m_uiFrameLen);
  60. // 从数据通道中提取数据
  61. // 提取一个数据,添加一个时间
  62. for (auto channel : m_pParam->m_pChannelGroup->m_vecChannel) {
  63. m_validArray.append(m_tempArray.at(channel->m_uiAbsolutePos));
  64. }
  65. m_tempArray.clear();
  66. // 剔除无效数据
  67. if (m_usFillSize != 0) {
  68. rejectFillData();
  69. } else {
  70. m_ableArray.append(m_validArray);
  71. m_validArray.clear();
  72. }
  73. // 将数据写入文件中
  74. m_fileArray.append(m_ableArray);
  75. if (DataAchiveBuffer <= m_fileArray.size()) {
  76. m_file.write(m_fileArray);
  77. m_file.flush();
  78. m_fileArray.clear();
  79. }
  80. // 将数据放到播放器中
  81. validDataDeal();
  82. }
  83. }
  84. void VideoProcess::rejectFillData()
  85. {
  86. m_uiDataSize = m_validArray.size();
  87. m_uiIndex = 0;
  88. while (m_uiIndex + m_usFillSize <= m_uiDataSize) {
  89. if (m_validArray.at(m_uiIndex) != m_fillArray.at(0)) {
  90. m_ableArray.append(m_validArray.at(m_uiIndex));
  91. ++m_uiIndex;
  92. } else if (m_validArray.at(m_uiIndex) == m_fillArray.at(0)) {
  93. if (m_validArray.mid(m_uiIndex, m_usFillSize) != m_fillArray) {
  94. m_ableArray.append(m_validArray.at(m_uiIndex));
  95. ++m_uiIndex;
  96. } else {
  97. m_uiIndex += m_usFillSize;
  98. }
  99. }
  100. }
  101. m_validArray.remove(0, m_uiIndex);
  102. m_uiDataSize = 0;
  103. m_uiIndex = 0;
  104. }
  105. void VideoProcess::validDataDeal()
  106. {
  107. /*
  108. if (m_bIsPlay == true) {
  109. //将数据放到播放器中
  110. m_uiDataSize = m_ableArray.size();
  111. m_uiIndex = 0;
  112. QByteArray tempValid;
  113. while (m_uiIndex + VideoPacketLength <= m_uiDataSize) {
  114. tempValid = m_ableArray.mid(m_uiIndex, VideoPacketLength);
  115. m_pFfmpegDecodeNew->getConstBuffer()->write((unsigned char*)tempValid.data(),
  116. VideoPacketLength); m_uiIndex += VideoPacketLength;
  117. }
  118. m_ableArray.remove(0,m_uiIndex);
  119. m_uiDataSize = 0;
  120. m_uiIndex = 0;
  121. }
  122. else if(m_bIsPlay == false){
  123. m_ableArray.clear();
  124. m_uiDataSize = 0;
  125. m_uiIndex = 0;
  126. }*/
  127. if (m_bIsPlay == true) {
  128. // 将数据放到播放器中
  129. m_pFfmpegDecodeNew->getConstBuffer()->write((unsigned char*)m_ableArray.data(),
  130. (unsigned short)m_ableArray.size());
  131. m_ableArray.clear();
  132. } else if (m_bIsPlay == false) {
  133. m_ableArray.clear();
  134. }
  135. }
  136. void VideoProcess::startPlayer(bool status)
  137. {
  138. m_bIsPlay = status;
  139. if (m_bIsPlay == true) {
  140. m_pFfmpegDecodeNew->start();
  141. } else if (m_bIsPlay == false) {
  142. m_pFfmpegDecodeNew->stop();
  143. }
  144. }