Fix rtsp streaming

This commit is contained in:
Barzan Hayati 2025-07-12 23:40:25 +00:00
parent 7680d7d7e3
commit a29d9b38be
5 changed files with 32 additions and 26 deletions

View File

@ -9,7 +9,7 @@
"clock_rate": 90000,
"bitrate":4000000,
"payload": 96,
"rtsp_port": 8554,
"rtsp_port": 3087,
"updsink_port_num": 5400,
"host": "224.224.255.255"
}

View File

@ -16,9 +16,8 @@ std::chrono::time_point<std::chrono::steady_clock>
PipelineManager::PipelineManager() { ; }
PipelineManager::PipelineManager(int num_sources, char** url_camera)
: csv_fp("csv_fps.csv")
{
if (!csv_fp.is_open()) {
: csv_fp("csv_fps.csv") {
if (!csv_fp.is_open()) {
std::cerr << "Failed to open csv_fp csv file.\n";
throw std::runtime_error("Failed to open csv_fps_buffer_probe.csv");
}
@ -69,18 +68,16 @@ char* createName(const char* str, int num) {
return result;
}
void PipelineManager::set_row_csv_fps(const std::string& name, double fps){
void PipelineManager::set_row_csv_fps(const std::string& name, double fps) {
if (!csv_fp.is_open()) {
std::cerr << "Failed to write: stream not open for " << name << "\n";
return;
}
else{
} else {
csv_fp << name << "," << fps << "\n";
std::cout << "Wrote: " << name << " = " << fps << "\n";
}
}
}
GstPadProbeReturn PipelineManager::osd_sink_pad_buffer_probe(
GstPad* pad, GstPadProbeInfo* info, gpointer user_data) {
(void)pad; // This explicitly marks it as unused
@ -166,7 +163,8 @@ GstPadProbeReturn PipelineManager::buffer_probe(GstPad* pad,
long long elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(
current_time_buffer_probe - last_time_buffer_probe)
.count();
fps_buffer_probe = (double)(frame_count_buffer_probe * 1000 / (double)elapsed);
fps_buffer_probe =
(double)(frame_count_buffer_probe * 1000 / (double)elapsed);
if (elapsed >= 1000) { // Update every second
g_print("FPS_buffer_probe: %.2f\n", fps_buffer_probe);
frame_count_buffer_probe = 0;
@ -201,7 +199,7 @@ bool PipelineManager::playing_pipeline(int num_sources, char** url_camera) {
gst_element_set_state(pipeline, GST_STATE_PLAYING);
GstStateChangeReturn ret =
gst_element_set_state(pipeline, GST_STATE_PLAYING);
if(ret == GST_STATE_CHANGE_FAILURE) {
if (ret == GST_STATE_CHANGE_FAILURE) {
g_printerr("Unable to set pipeline to playing.\n");
gst_object_unref(pipeline);
return false;
@ -346,7 +344,8 @@ bool PipelineManager::create_pipeline_elements(int num_sources,
}
nv_ds_logger_manager->create_nv_ds_logger();
sink_manager->create_sink(prop);
sink_manager->create_sink(prop, rtsp_streaming_manager->host,
rtsp_streaming_manager->updsink_port_num);
message_handling->create_message_handler(pipeline, g_run_forever, loop);
setup_pipeline();
@ -380,11 +379,18 @@ bool PipelineManager::create_pipeline_elements(int num_sources,
g_main_loop_run(loop);
auto end = std::chrono::system_clock::now();
std::cout << " Overall running time = "
<< std::chrono::duration_cast<std::chrono::microseconds>(end -
start)
.count()
<< "us" << std::endl;
/* Out of the main loop, clean up nicely */
g_print("Returned, stopping playback \n");
gst_element_set_state(pipeline, GST_STATE_NULL);
g_print("Deleting pipeline \n");
gst_object_unref(GST_OBJECT(pipeline));
rtsp_streaming_manager->destroy_sink_bin();
// g_source_remove (bus_watch_id);
message_handling->source_remove();
g_main_loop_unref(loop);
@ -392,11 +398,6 @@ bool PipelineManager::create_pipeline_elements(int num_sources,
// g_free (g_source_bin_list);
// g_free (uri);
g_mutex_clear(&eos_lock);
rtsp_streaming_manager->destroy_sink_bin();
auto end = std::chrono::system_clock::now();
std::cout <<" Overall running time = " <<
std::chrono::duration_cast<std::chrono::microseconds>(end - start).count() <<
"us" << std::endl;
return true;
}

View File

@ -32,12 +32,11 @@ gboolean RtspStreamingManager::start_rtsp_streaming() {
GstRTSPMediaFactory *factory;
char udpsrc_pipeline[512];
char port_num_Str[64] = {0};
// char *encoder_name;
char *encoder_name;
(void)encoder_name;
// if (udp_buffer_size == 0)
// udp_buffer_size = 512 * 1024;//524288
if (udp_buffer_size == 0) udp_buffer_size = 512 * 1024;
server = gst_rtsp_server_new();
sprintf(port_num_Str, "%d", rtsp_port);
sprintf(udpsrc_pipeline,
"( udpsrc name=pay0 port=%d buffer-size=%u "
@ -47,6 +46,7 @@ gboolean RtspStreamingManager::start_rtsp_streaming() {
codec_rtsp_out.c_str(), payload); // H264
// g_print(udpsrc_pipeline);
g_print("%s\n", udpsrc_pipeline);
server = gst_rtsp_server_new();
g_object_set(server, "service", port_num_Str, NULL);
mounts = gst_rtsp_server_get_mount_points(server);
factory = gst_rtsp_media_factory_new();

View File

@ -11,7 +11,8 @@ SinkManager::SinkManager() {
config.at("codec_rtsp_out").get_to(codec_rtsp_out);
}
bool SinkManager::create_sink(cudaDeviceProp prop) {
bool SinkManager::create_sink(cudaDeviceProp prop, std::string host,
guint updsink_port_num) {
if (display_output == 0) {
output_sink = "fake_sink";
sink = gst_element_factory_make("fakesink", "nvvideo-renderer");
@ -43,7 +44,8 @@ bool SinkManager::create_sink(cudaDeviceProp prop) {
caps = gst_element_factory_make("capsfilter", "filter");
g_object_set(
caps, "caps",
gst_caps_from_string("video/x-raw(memory:NVMM), format=I420"),
gst_caps_from_string(
"video/x-raw(memory:NVMM), format=I420"), // video/x-raw
NULL);
if (!caps) {
g_printerr("Unable to create caps. Exiting.\n");
@ -53,6 +55,10 @@ bool SinkManager::create_sink(cudaDeviceProp prop) {
// Make the encoder
if (!strcmp(codec_rtsp_out.c_str(), "H264")) {
encoder = gst_element_factory_make("nvv4l2h264enc", "encoder");
// encoder = gst_element_factory_make("x264enc", "h264 encoder");
// g_object_set(G_OBJECT(encoder), "preset-level", 1, NULL);
// g_object_set(G_OBJECT(encoder), "insert-sps-pps", 1, NULL);
// g_object_set(G_OBJECT(encoder), "bufapi-version", 1, NULL);
g_printerr("Creating H264 Encoder.\n");
} else if (!strcmp(codec_rtsp_out.c_str(), "H265")) {
encoder = gst_element_factory_make("nvv4l2h265enc", "encoder");

View File

@ -13,10 +13,9 @@ class SinkManager {
public:
GstElement *sink = NULL, *nvvidconv_postosd = NULL, *caps = NULL,
*encoder = NULL, *rtppay = NULL;
std::string host, output_sink, output_video_path;
std::string output_sink, output_video_path;
int display_output = 1, bitrate;
guint updsink_port_num;
SinkManager();
bool create_sink(cudaDeviceProp prop);
bool create_sink(cudaDeviceProp prop, std::string, guint);
~SinkManager();
};