| | |
| | | |
| | | // BASICGB28181::avframe_to_cvmat(frame).copyTo(p_this->m_image); |
| | | p_this->m_image = std::move(BASICGB28181::avframe_to_cvmat(p_this->frame)); |
| | | if(p_this->m_image.empty()) { |
| | | ERR("camID:" << p_this->m_camIdx << " frameW:" << p_this->frame->width); |
| | | continue; |
| | | } |
| | | // 将i帧保存为快照 |
| | | if (p_this->m_SnapshotNotSaveRet && (p_this->pkt.flags & AV_PKT_FLAG_KEY)) { |
| | | try { |
| | |
| | | if (!m_packetsVec.empty()) { |
| | | auto iter = m_packetsVec.begin(); |
| | | while (iter->m_frameId < lastFrameId) { |
| | | INFO("DropFrame: " << iter->m_frameId); |
| | | // INFO("DropFrame: " << iter->m_frameId); |
| | | delete iter->m_packet.data; |
| | | iter = m_packetsVec.erase(iter); |
| | | } |
| | |
| | | |
| | | bool BASICGB28181::FFmpegDecoderJPG::SaveVideo(std::string path, int64_t lastFrameId) { |
| | | std::lock_guard<std::mutex> lock(g_mutex); |
| | | INFO("SaveVideo: " << path << "m_packetsVec.size : " << m_packetsVec.size()); |
| | | // INFO("SaveVideo: " << path << "m_packetsVec.size : " << m_packetsVec.size()); |
| | | if (!m_packetsVec.empty()) { |
| | | startWrite(path.c_str()); |
| | | int64_t firstKeyFramePts = m_packetsVec[0].m_packet.pts; |
| | |
| | | unsigned long int frame_index = 0; |
| | | for (const auto &item:m_packetsVec) { |
| | | if (item.m_frameId < lastFrameId) { |
| | | DBG("item.m_frameId < lastFrameId " << item.m_frameId << " " << lastFrameId); |
| | | // DBG("item.m_frameId < lastFrameId " << item.m_frameId << " " << lastFrameId); |
| | | conversion(const_cast<AVPacket *> (&item.m_packet), firstKeyFramePts, firstKeyFrameDts, video_st, |
| | | frame_index); |
| | | frame_index++; |
| | |
| | | AVPacket *pkg = static_cast<AVPacket *>(packet); |
| | | |
| | | |
| | | DBG("frame_index==%d\n" << frame_index); |
| | | // DBG("frame_index==\n" << frame_index); |
| | | //Write PTS |
| | | AVRational time_base1 = inStream->time_base; |
| | | //Duration between 2 frames (us) |