diff --git a/src/FFNvDecoder.cpp b/src/FFNvDecoder.cpp index c76c0e0..3dc6519 100644 --- a/src/FFNvDecoder.cpp +++ b/src/FFNvDecoder.cpp @@ -3,6 +3,7 @@ #include #include +#include using namespace std; @@ -36,6 +37,7 @@ FFNvDecoder::FFNvDecoder() name = ""; m_bPause = false; + m_bReal = true; } FFNvDecoder::~FFNvDecoder() @@ -45,6 +47,14 @@ FFNvDecoder::~FFNvDecoder() bool FFNvDecoder::init(const string& path) { + fstream infile(path); + if (infile.is_open()){ + m_bReal = false; + infile.close(); + }else { + m_bReal = true; + } + // 查找对应的硬件解码设备 const char* device_name = "cuda"; AVHWDeviceType hw_device_type = av_hwdevice_find_type_by_name(device_name); @@ -157,10 +167,14 @@ void FFNvDecoder::decode_thread() while (m_bRunning) { - if (m_bPause) + + if (!m_bReal) { - std::this_thread::sleep_for(std::chrono::milliseconds(3)); - continue; + if (m_bPause) + { + std::this_thread::sleep_for(std::chrono::milliseconds(3)); + continue; + } } int result = av_read_frame(fmt_ctx, pkt); @@ -175,6 +189,16 @@ void FFNvDecoder::decode_thread() break; } + if (!m_bReal) + { + if (m_bPause) + { + av_packet_unref(pkt); + std::this_thread::sleep_for(std::chrono::milliseconds(3)); + continue; + } + } + if (stream_index == pkt->stream_index) { result = avcodec_send_packet(avctx, pkt); diff --git a/src/FFNvDecoder.h b/src/FFNvDecoder.h index 8894f38..a225634 100644 --- a/src/FFNvDecoder.h +++ b/src/FFNvDecoder.h @@ -71,4 +71,6 @@ private: bool m_bPause; FrameQueue mFrameQueue; + + bool m_bReal; // 是否实时流 }; \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 3aade7e..890b05f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -24,7 +24,7 @@ int main(){ pDecManager->setUserPtr("dec1", decoder); pDecManager->startDecodeByName("dec1"); - FFNvDecoder* dec2 = pDecManager->createDecoder("/home/cmhu/Proj_DxDecoder/data/test.mp4",postDecoded,"dec2"); + FFNvDecoder* dec2 = pDecManager->createDecoder("/home/cmhu/data/test.mp4",postDecoded,"dec2"); if (!dec2) { return 1;