修改为GSTREAMER
This commit is contained in:
parent
ead081f353
commit
28c8149491
|
|
@ -2,16 +2,31 @@
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
|
||||||
|
#include <thread> // for std::this_thread::sleep_for
|
||||||
|
#include <chrono> // for std::chrono::milliseconds
|
||||||
|
|
||||||
#include "opencv2/core/core.hpp"
|
#include "opencv2/core/core.hpp"
|
||||||
#include "opencv2/highgui/highgui.hpp"
|
#include "opencv2/highgui/highgui.hpp"
|
||||||
#include "opencv2/imgproc/imgproc.hpp"
|
#include "opencv2/imgproc/imgproc.hpp"
|
||||||
#include "rknn/rkYolov5s.hpp"
|
#include "rknn/rkYolov5s.hpp"
|
||||||
#include "rknn/rknnPool.hpp"
|
#include "rknnPool.hpp"
|
||||||
|
|
||||||
|
const std::string GSTREAMER_PIPELINE =
|
||||||
|
"rtspsrc location=rtsp://admin:hzx12345@192.168.1.10:554/Streaming/Channels/1301 is-live=true latency=0 ! "
|
||||||
|
"rtph265depay ! h265parse ! mppvideodec ! " // mppvideodec 是 RK 平台的硬解码器
|
||||||
|
"videoconvert ! video/x-raw,format=BGR ! appsink drop=1";
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
char *model_name = NULL;
|
char *model_name = NULL;
|
||||||
|
// const char* model_path = "/home/forlinx/rknn-cpp-Multithreading-main/model/RK3588/yolov5s-640-640.rknn";
|
||||||
const char* model_path = "/app/edge-proxy/models/RK3588/yolov5s-640-640.rknn";
|
const char* model_path = "/app/edge-proxy/models/RK3588/yolov5s-640-640.rknn";
|
||||||
|
|
||||||
|
// 参数二,模型所在路径/The path where the model is located
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// 初始化rknn线程池/Initialize the rknn thread pool
|
||||||
int threadNum = 3;
|
int threadNum = 3;
|
||||||
rknnPool<rkYolov5s, cv::Mat, cv::Mat> testPool(model_path, threadNum);
|
rknnPool<rkYolov5s, cv::Mat, cv::Mat> testPool(model_path, threadNum);
|
||||||
if (testPool.init() != 0)
|
if (testPool.init() != 0)
|
||||||
|
|
@ -20,23 +35,39 @@ int main(int argc, char **argv)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// const char *video_name = "/home/forlinx/Videos/test_video.mp4";
|
||||||
|
// cv::VideoCapture capture;
|
||||||
|
// if (strlen(video_name) == 1)
|
||||||
|
// capture.open((int)(video_name[0] - '0'));
|
||||||
|
// else
|
||||||
|
// capture.open(video_name);
|
||||||
setenv("OPENCV_FFMPEG_CAPTURE_OPTIONS", "rtsp_transport;tcp", 1);
|
setenv("OPENCV_FFMPEG_CAPTURE_OPTIONS", "rtsp_transport;tcp", 1);
|
||||||
printf("Set RTSP transport protocol to TCP\n");
|
printf("Set RTSP transport protocol to TCP\n");
|
||||||
std::string rtsp_url = "rtsp://admin:hzx12345@192.168.1.10:554/Streaming/Channels/1301";
|
std::string rtsp_url = "rtsp://admin:hzx12345@192.168.1.10:554/Streaming/Channels/1301";
|
||||||
cv::VideoCapture capture(rtsp_url, cv::CAP_FFMPEG);
|
// cv::VideoCapture capture(rtsp_url, cv::CAP_FFMPEG);
|
||||||
|
cv::VideoCapture capture(GSTREAMER_PIPELINE, cv::CAP_GSTREAMER);
|
||||||
|
// if (!capture.isOpened())
|
||||||
|
// {
|
||||||
|
// printf("Error: Could not open RTSP stream.\n");
|
||||||
|
// return -1;
|
||||||
|
// }
|
||||||
|
// printf("RTSP stream opened successfully!\n");
|
||||||
if (!capture.isOpened())
|
if (!capture.isOpened())
|
||||||
{
|
{
|
||||||
printf("Error: Could not open RTSP stream.\n");
|
printf("Error: Could not open GStreamer RTSP stream. Check pipeline or RTSP URL.\n");
|
||||||
|
// 可以打印 GStreamer 错误到 stderr
|
||||||
|
fprintf(stderr, "GStreamer pipeline used: %s\n", GSTREAMER_PIPELINE.c_str());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
printf("RTSP stream opened successfully!\n");
|
printf("GStreamer RTSP stream opened successfully!\n");
|
||||||
|
|
||||||
|
|
||||||
const char* WINDOW_NAME = "RTSP Fullscreen Display";
|
const char* WINDOW_NAME = "RTSP Fullscreen Display";
|
||||||
cv::namedWindow(WINDOW_NAME, cv::WINDOW_NORMAL);
|
cv::namedWindow(WINDOW_NAME, cv::WINDOW_NORMAL);
|
||||||
cv::setWindowProperty(WINDOW_NAME, cv::WND_PROP_FULLSCREEN, cv::WINDOW_FULLSCREEN);
|
cv::setWindowProperty(WINDOW_NAME, cv::WND_PROP_FULLSCREEN, cv::WINDOW_FULLSCREEN);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
struct timeval time;
|
struct timeval time;
|
||||||
gettimeofday(&time, nullptr);
|
gettimeofday(&time, nullptr);
|
||||||
auto startTime = time.tv_sec * 1000 + time.tv_usec / 1000;
|
auto startTime = time.tv_sec * 1000 + time.tv_usec / 1000;
|
||||||
|
|
@ -46,15 +77,34 @@ int main(int argc, char **argv)
|
||||||
while (capture.isOpened())
|
while (capture.isOpened())
|
||||||
{
|
{
|
||||||
cv::Mat img;
|
cv::Mat img;
|
||||||
if (capture.read(img) == false)
|
// if (capture.read(img) == false)
|
||||||
break;
|
// break;
|
||||||
|
if (capture.read(img) == false) {
|
||||||
|
printf("Failed to read frame from GStreamer stream. Re-attempting...\n");
|
||||||
|
// 尝试重新打开流,或者等待一段时间
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
||||||
|
if (!capture.isOpened()) { // 如果流关闭了,尝试重新打开
|
||||||
|
capture.open(GSTREAMER_PIPELINE, cv::CAP_GSTREAMER);
|
||||||
|
if (!capture.isOpened()) {
|
||||||
|
printf("Failed to re-open GStreamer stream. Exiting.\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
printf("GStreamer stream re-opened successfully!\n");
|
||||||
|
}
|
||||||
|
continue; // 继续下一帧
|
||||||
|
}
|
||||||
|
if (img.empty()) {
|
||||||
|
printf("Empty frame received. Skipping.\n");
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(10)); // 防止空循环过快
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (testPool.put(img) != 0)
|
if (testPool.put(img) != 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (frames >= threadNum && testPool.get(img) != 0)
|
if (frames >= threadNum && testPool.get(img) != 0)
|
||||||
break;
|
break;
|
||||||
cv::imshow(WINDOW_NAME, img);
|
cv::imshow(WINDOW_NAME, img);
|
||||||
if (cv::waitKey(1) == 'q')
|
if (cv::waitKey(1) == 'q') // 延时1毫秒,按q键退出/Press q to exit
|
||||||
break;
|
break;
|
||||||
frames++;
|
frames++;
|
||||||
|
|
||||||
|
|
@ -67,13 +117,14 @@ int main(int argc, char **argv)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 清空rknn线程池/Clear the thread pool
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
cv::Mat img;
|
cv::Mat img;
|
||||||
if (testPool.get(img) != 0)
|
if (testPool.get(img) != 0)
|
||||||
break;
|
break;
|
||||||
cv::imshow(WINDOW_NAME, img);
|
cv::imshow(WINDOW_NAME, img);
|
||||||
if (cv::waitKey(1) == 'q')
|
if (cv::waitKey(1) == 'q') // 延时1毫秒,按q键退出/Press q to exit
|
||||||
break;
|
break;
|
||||||
frames++;
|
frames++;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue