- 需求
- 安装依赖
- 下载、编译gst-rtsp-server
- 测试
- 源代码介绍
- 动态获取多路流的rtsp server
- 错误
- 参考
gcc 版本7.5.0 g++ 版本7.5.0 ubuntu 版本18.04 gst-rtsp-server 版本1.8.0安装依赖
sudo apt-get install gtk-doc-tools sudo apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base sudo apt-get install gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly sudo apt-get install gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools sudo apt-get install gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5 gstreamer1.0-pulseaudio sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev下载、编译gst-rtsp-server
git clone git://anongit.freedesktop.org/gstreamer/gst-rtsp-server 或者 wget https://github.com/GStreamer/gst-rtsp-server/archive/1.8.zip
cd gst-rtsp-server git checkout remotes/origin/1.8 or git clone https://github.com/GStreamer/common.git ./autogen.sh make -j4 sudo make install //进入demo cd example测试
1、切换到examples目录: cd examples 2、搭建Rtsp Server: ./test-launch "( videotestsrc ! x264enc ! rtph264pay name=pay0 pt=96 )" 直接读取摄像头(笔记本电脑一般自带摄像头,台式机请插入USB摄像头)视频的命令就是它了: $ ./test-launch "( v4l2src ! video/x-raw-yuv,format='fourcc'YUY2,width=640,height=480 ! ffmpegcolorspace ! x264enc ! rtph264pay name=pay0 pt=96 )" 直接读取CSI摄像头 ./test-launch "nvarguscamerasrc ! nvvidconv ! clockoverlay ! omxh264enc ! rtph264pay pt=96 name=pay0"---成功 ./test-launch "( mfw_v4lsrc device=/dev/video0 ! queue ! vpuenc codec=6 ! rtph264pay name=pay0 pt=96 )"---失败 3、播放rtsp流: gst-launch-1.0 playbin uri=rtsp://127.0.0.1:8554/test 或者直接通过VLC打开以及通过opencv也可以打开
# 发送1 gst-launch-1.0 videotestsrc ! video/x-raw,format=I420 ! omxh264enc ! video/x-h264,stream-format=byte-stream ! rtph264pay mtu=1400 ! udpsink host=127.0.0.1 port=5000 # 接收1 gst-launch-1.0 udpsrc port=5000 ! 'application/x-rtp,encoding-name=(string)H264' ! rtph264depay ! h264parse ! omxh264dec ! nvoverlaysink sync=false async=false # 发送2 ./test-launch "(videotestsrc ! video/x-raw,format=I420,framerate= 25/1 ! x264enc ! video/x-h264,stream-format=byte-stream ! rtph264pay name=pay0 pt=96)" # 接收2 gst-launch-1.0 rtspsrc location=rtsp://127.0.01:8554/test ! rtph264depay ! h264parse ! omxh264dec ! nvoverlaysink sync=false async=false源代码介绍
test-readme.c
#include#include int main (int argc, char *argv[]) { //声明相关对象 GMainLoop *loop; GstRTSPServer *server; GstRTSPMountPoints *mounts; GstRTSPMediaFactory *factory; //构建 rtsp 服务器 gst_init (&argc, &argv); loop = g_main_loop_new (NULL, FALSE); // 创建 rtsp 服务器的主消息循环,也是默认的消息循环。 server = gst_rtsp_server_new (); // 创建 rtsp 服务器对象 mounts = gst_rtsp_server_get_mount_points (server); // 获取 rtsp 服务器的装载点集合的引用 // 装载点集合 mounts 是服务器 server 的属性 factory = gst_rtsp_media_factory_new (); // 创建媒体工厂,用来产生媒体数据流 gst_rtsp_media_factory_set_launch (factory, "( videotestsrc is-live=1 ! x264enc ! rtph264pay name=pay0 pt=96 )"); gst_rtsp_media_factory_set_shared (factory, TRUE); gst_rtsp_mount_points_add_factory (mounts, "/test", factory); // 把媒体工厂添加到装载点集合 g_object_unref (mounts); gst_rtsp_server_attach (server, NULL); // 把服务器附加到默认的消息循环。 //运行 rtsp 服务器 g_print ("stream ready at rtsp://127.0.0.1:8554/testn"); g_main_loop_run (loop); return 0; }
服务器管理另外四个对象: GstRTSPSessionPool、GstRTSPMountPoints、 GstRTSPAuth 和 GstRTSPThreadPool。
GstRTSPSessionPool 是一个跟踪服务器中所有活动会话的对象。通常会为每个为某个媒体流执行设置请求的客户机保留一个会话。它包含客户端与服务器协商以接收特定流的配置,即UDP使用的传输和端口对以及流的状态。会话池的默认实现通常就足够了,但服务器可以使用替代实现。
GstRTSPMountPoints 对象更有趣,在服务器对象有用之前需要更多的配置。此对象管理从请求URL到特定流的映射及其配置。我们将在下一个主题中解释如何配置此对象。
GstRTSPAuth是对用户进行身份验证并授权用户执行的操作的对象。默认情况下,服务器没有 GstRTSPAuth 对象,因此不会尝试执行任何身份验证或授权。
GstRTSPThreadPool 管理用于客户端连接和媒体管道的线程。服务器有一个线程池的默认实现,在大多数情况下应该足够了。
动态获取多路流的rtsp server类似example里面的C文件,将你所命名的文件名(C文件),加在Makefile,Makefile.am,Makefile.in对应位置,直接通过sudo make -j8即可完成修改,将生成对应可执行文件直接./运行即可。
代码1
#include#include #include void* testFun(void *args) { GMainLoop *loop = (GMainLoop *) args; g_main_loop_run (loop); } int main (int argc, char *argv[]) { GMainLoop *loop; GstRTSPServer *server; GstRTSPMountPoints *mounts; GstRTSPMediaFactory *factory; gst_init (&argc, &argv); loop = g_main_loop_new (NULL, FALSE); pthread_t tTest; pthread_create(&tTest, NULL, testFun, loop); /* create a server instance */ server = gst_rtsp_server_new (); gst_rtsp_server_set_service (server, "8555"); /* get the mount points for this server, every server has a default object * that be used to map uri mount points to media factories */ mounts = gst_rtsp_server_get_mount_points (server); /* make a media factory for a test stream. The default media factory can use * gst-launch syntax to create pipelines. * any launch line works as long as it contains elements named pay%d. Each * element with pay%d names will be a stream */ factory = gst_rtsp_media_factory_new (); gst_rtsp_media_factory_set_launch (factory, "( videotestsrc is-live=1 ! x264enc ! rtph264pay name=pay0 pt=96 )"); gst_rtsp_media_factory_set_shared (factory, TRUE); /* attach the test factory to the /test url */ gst_rtsp_mount_points_add_factory (mounts, "/test", factory); /* don't need the ref to the mapper anymore */ g_object_unref (mounts); /* attach the server to the default maincontext */ gst_rtsp_server_attach (server, NULL); /* start serving */ g_print ("stream ready at rtsp://127.0.0.1:8554/testn"); //g_main_loop_run (loop); pthread_join(tTest, NULL); return 0; }
代码2:
#include错误#include const char* port = "10001"; static void handle_client (GstRTSPClient * client, GstRTSPContext * ctx, GstRTSPServer * server, gpointer user_data) { GstRTSPClientClass *klass; GstRTSPMountPoints *mounts; GstRTSPMediaFactory *factory; GstRTSPUrl *uri; gchar *path; gchar *launch = "( videotestsrc is-live=1 ! x264enc ! rtph264pay name=pay0 pt=96 )"; uri = ctx->uri; if (!uri) return; klass = GST_RTSP_CLIENT_GET_CLASS (client); path = klass->make_path_from_uri (client, uri); mounts = gst_rtsp_server_get_mount_points (server); factory = gst_rtsp_mount_points_match (mounts, path, NULL); if (!factory) { factory = gst_rtsp_media_factory_new (); gst_rtsp_media_factory_set_launch (factory, launch); gst_rtsp_media_factory_set_shared (factory, TRUE); //g_signal_connect (factory, "media-constructed", (GCallback) // media_constructed, NULL); gst_rtsp_mount_points_add_factory (mounts, path, factory); g_print ("new factory: %sn", launch); } else { g_object_unref (factory); } g_object_unref (mounts); g_free (path); //g_free (launch); } static void client_connected (GstRTSPServer * server, GstRTSPClient * client, gpointer user_data) { g_signal_connect_object (client, "options-request", (GCallback) handle_client, server, G_CONNECT_AFTER); } static gboolean timeout (GstRTSPServer * server) { GstRTSPSessionPool *pool; pool = gst_rtsp_server_get_session_pool (server); gst_rtsp_session_pool_cleanup (pool); g_object_unref (pool); return TRUE; } int main (int argc, char *argv[]) { GMainLoop *loop; GstRTSPServer *server; GError *error = NULL; gst_init (&argc, &argv); loop = g_main_loop_new (NULL, FALSE); /* create a server instance */ server = gst_rtsp_server_new (); gst_rtsp_server_set_service (server, port); /* attach the server to the default maincontext */ gst_rtsp_server_attach (server, NULL); g_signal_connect (server, "client-connected", (GCallback) client_connected, NULL); g_timeout_add_seconds (2, (GSourceFunc) timeout, server); g_object_unref (server); /* start serving */ g_print ("rtsp://127.0.0.1:%s/n", port); g_main_loop_run (loop); return 0; }
- Error generated. /dvs/git/dirty/git-master_linux/multimedia/nvgstreamer/gst-nvarguscamera/gstnvargus
解决办法:sudo systemctl restart nvargus-daemon (可以重启nvargus-daemon,重启后程序可以正常运行
)
参考基于树莓派板子
- 使用树莓派专用摄像头实现rtsp流的传输,并调用Opencv显示
- <树莓派>——树莓派通过csi摄像头实时传输rtsp流
- 树莓派CSI/USB摄像头使用mjpg实现网页摄像头监控
- Liunx树莓派(ARM)开发篇—基于mjpg-streamer的摄像头(CSI摄像头)监控(完整流程)(附代码)
- 树莓派CSI摄像头实现rtsp流的传输,笔记本使用Python调用Opencv显示
基于jetson nano
- gstreamer之RTSP Server编译及注意事项
- 下载gst_rtsp_server地址
- Gstreamer——搭建RTSP服务器
- 记录tx2上安装配置gestermer进而使用gst-rtsp-server
- Gstreamer视频传输测试gst-launch
- gst-launch-1.0在Linux下的命令
- linux环境下用GStreamer实现rtsp取流播放



