gstreamer-rtsp-server环境安装(Linux环境下)

两种方式:
第一种方式,通过官网安装(如果是Linux环境,可以直接通过软件包工具进行安装),点击进入官网下载

第二种方式,手动安装方式(Linux环境)
  第一步,终端执行以下命令,安装gstreamer基础库。

sudo apt-get install gtk-doc-tools
sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
sudo apt-get install libgl1-mesa-dev
sudo apt-get install gstreamer1.0-libav
sudo apt-get install gstreamer1.0-plugins-bad
sudo apt-get install gstreamer1.0-plugins-base
sudo apt-get install gstreamer1.0-plugins-ugly
sudo apt-get install gstreamer1.0-plugins-good

  第二步,下载gstreamer-rtsp-server,执行以下命令行(下载源码并编译安装)

# download src
git clone git://anongit.freedesktop.org/gstreamer/gst-rtsp-server

cd gst-rtsp-server

# see all branches
# remotes/origin/1.8    8799fb5 tests: try to avoid using the same ports in different tests
git branch -av

# create new branch
git checkout -B test
git reset --hard 8799fb5

# compile
./autogen.sh && make -j12

  第三步,在主目录下的终端中执行

sudo gedit ~/.bashrc   //打开bashrc文件

  在bashrc文件中添加以下两句话设置环境变量。

#这个路径就是gstreamer安装的路径,一般系统默认的路径都是这个
export LD_LIBRARY_PATH=/usr/local/lib
export GST_PLUGIN_PATH=/usr/local/lib:/usr/lib/x86_64-linux-gnu/gstreamer-1.0

  然后source一下刚才的配置,这样就配好环境变量了。

source ~/.bashrc

  第四步,确认自己是否安装成功,终端执行以下命令

#若成功,则有对应版本信息
gst-inspect-1.0 --version




验证RTSP是否能够正常工作

第一步,验证是否能够拉流

#指令是这个,但是这个rtsp流地址可能不好用了,需要自己可以上网找一个可用的rtsp流链接替换掉location中的地址,或者在我下面参考资料的网页里面找到rtsp和rtmp的测试地址
gst-launch-1.0 rtspsrc latency=20 location="rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov" ! rtph264depay ! h264parse ! avdec_h264 ! autovideosink

第二步,完成推流
  刚刚下载编译的gst-rtsp-server文件夹下边,有个examples文件夹,里面的test-launch.c就是我们测试的源码(未改动)
源码结构如下

#include <gst/gst.h>
#include <gst/rtsp-server/rtsp-server.h>
#define DEFAULT_RTSP_PORT "8554"

static char *port = (char *) DEFAULT_RTSP_PORT;

static GOptionEntry entries[] = {
  {"port", 'p', 0, G_OPTION_ARG_STRING, &port,
      "Port to listen on (default: " DEFAULT_RTSP_PORT ")", "PORT"},
  {NULL}
};

int main (int argc, char *argv[])
{
  GMainLoop *loop;
  GstRTSPServer *server;
  GstRTSPMountPoints *mounts;
  GstRTSPMediaFactory *factory;
  GOptionContext *optctx;
  GError *error = NULL;

  optctx = g_option_context_new ("<launch line> - Test RTSP Server, Launch\n\n"
      "Example: \"( videotestsrc ! x264enc ! rtph264pay name=pay0 pt=96 )\"");
  g_option_context_add_main_entries (optctx, entries, NULL);
  g_option_context_add_group (optctx, gst_init_get_option_group ());
  if (!g_option_context_parse (optctx, &argc, &argv, &error)) {
    g_printerr ("Error parsing options: %s\n", error->message);
    g_option_context_free (optctx);
    g_clear_error (&error);
    return -1;
  }
  g_option_context_free (optctx);

  loop = g_main_loop_new (NULL, FALSE);

  /* create a server instance */
  server = gst_rtsp_server_new ();
  g_object_set (server, "service", port, NULL);

  /* 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, argv[1]);

  /* 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:%s/test\n", port);
  g_main_loop_run (loop);

  return 0;
}

  可以通过输入以下命令行编译

gcc test-launch.c -o test $(pkg-config --cflags --libs gstreamer-rtsp-server-1.0 gstreamer-1.0)

  编译完成后,会生成一个名为test的可执行文件。在当前目录下打开终端,输入

#其中device=/dev/video0是你读取的摄像头编号,如果是笔记本,video0应该是笔记本自带摄像头
./test "( v4l2src device=/dev/video0 norm=255 ! video/x-raw-yuv,format='fourcc'YUY2,width=640,height=480 ! x264enc tune="zerolatency" threads=4  ! rtph264pay name=pay0 pt=96 )"

  再新开一个终端,输入

#这里端口号8554与源文件test-launch.c开头定义的DEFAULT_RTSP_PORT "8554"相一致,如果不一样的话要改成一样的,两者相同就可以
gst-launch-1.0 rtspsrc latency=20 location="rtsp://127.0.0.1:8554/test" ! rtph264depay ! h264parse ! avdec_h264 ! autovideosink

  然后就可以看见你自己啦,这就实现了在本地拉/推流。   类似的,我们也可以测试关于rtsp流的转发

以上过程中的一些Q&A

Q1:关于gstreamer无组件修复的问题(无v4l2src,osssink,xvimagesink等组件)
  原因由anaconda引起,anaconda的环境有安装gstreamer,并为之配置了环境变量,系统一直找到的都是anaconda里低版本的gstreamer。
解决方法:

Q2:关于库文件<gst/gst.h>不存在的问题
  可能安装过程中某些工具包之间的依赖关系不完善(因为此前remove过旧版本的gstreamer或者旧版工具包)
解决方法:
https://tieba.baidu.com/p/1495215022?red_tag=2587769120 下载synaptic重新安装相关的工具包

Q3:关于安装依赖包遇上E:unable to locate package如何解决
  在系统应用中”软件和更新“中把软件镜像源改为aliyun(阿里云),然后执行以下命令更新软件镜像源(一般改好镜像源后会自动更新一下,采用以下命令以防万一)。

sudo apt-get update
sudo apt-get upgrade