#include "RTSPDecoder/RTSPDecoder.h" #include #include #include std::string getDateTime_usec() { time_t timep = time(NULL); struct tm *p = localtime(&timep); struct timeval tv; gettimeofday(&tv, NULL); int msec = tv.tv_usec / 1000; char tmp[30] = {0}; sprintf(tmp, "%04d-%02d-%02d %02d:%02d:%02d.%03d", 1900 + p->tm_year, 1 + p->tm_mon, p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec, msec); return std::string(tmp); } int main() { RTSPDecoder decoder; RTSPDecoder::DecoderConfig config; config.max_streams = 10; // 最大10路流 config.use_hw_accel = true; // 使用硬件加速 config.width = 1920; // 输出宽度 config.height = 1080; // 输出高度 config.buffer_size = 5; // 每路流缓冲5帧 if (!decoder.init(config)) { std::cerr << "Failed to initialize decoder" << std::endl; return 1; } // 添加RTSP流 std::vector rtsp_urls = { "./1.mp4", "./1.mp4", "./1.mp4", "./1.mp4", "./1.mp4", "./1.mp4", "./1.mp4", "./1.mp4", "./1.mp4", "./1.mp4", // 添加更多流... }; std::vector stream_ids; for (const auto& url : rtsp_urls) { try { int stream_id = decoder.addStream(url); stream_ids.push_back(stream_id); std::cout << "Added stream " << stream_id << ": " << url << std::endl; } catch (const std::exception& e) { std::cerr << "Failed to add stream: " << e.what() << std::endl; } } int iID = 0; // 主循环 while (true) { for (int stream_id : stream_ids) { ++iID; cv::Mat frame; if (decoder.getFrame(stream_id, frame, 1)) { // 处理帧... if (!cv::imwrite("./jpg/Stream_" + std::to_string(stream_id) + "_" + std::to_string(iID) + ".jpg", frame)) { std::cerr << "Save Failed ./jpg/Stream_" + std::to_string(stream_id) + "_" + std::to_string(iID) + ".jpg" << " size:" << frame.size() << std::endl; } std::cout << getDateTime_usec() << " Stream " << stream_id << " -- " << std::to_string(iID) << std::endl; } } if (cv::waitKey(1) == 27) { // ESC键退出 break; } } // 清理 for (int stream_id : stream_ids) { decoder.removeStream(stream_id); } return 0; }