gstreamer学习(一) gstreamer-rtsp-server环境安装
用于流媒体入门,gstreamer-rtsp-server安装过程及环境配置整理,测试了rtsp拉/推流,一些遇到的问题及解决方法,附上一些有用的参考链接。
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流的转发,这里附上一篇相关链接,本文一部分实现过程借鉴于此->基于gstreamer的rtsp推送和转发。
以上过程中的一些Q&A
Q1:关于gstreamer无组件修复的问题(无v4l2src,osssink,xvimagesink等组件)
原因由anaconda引起,anaconda的环境有安装gstreamer,并为之配置了环境变量,系统一直找到的都是anaconda里低版本的gstreamer。
解决方法:https://blog.csdn.net/qq_41263444/article/details/120994179
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
相关资料链接
Gstreamer-rtsp拉流播放
https://blog.csdn.net/tuenbotuenbo/article/details/121285014
rtsp、rtmp流测试地址
https://blog.csdn.net/tengkonglieying/article/details/106093350
gst-launch-1.0在linux下的命令(对v4l2src测试)
https://blog.csdn.net/qq_41592091/article/details/88409402
ubuntu中usb摄像头gstreamer方式采集显示、录像及回放
https://blog.csdn.net/qq_32196869/article/details/124495493
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)