Fix rtsp streaming
This commit is contained in:
parent
7680d7d7e3
commit
a29d9b38be
@ -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"
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
@ -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();
|
||||
|
||||
@ -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");
|
||||
|
||||
@ -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();
|
||||
};
|
||||
Loading…
x
Reference in New Issue
Block a user