Gstreamer rtsp 播放(有声) [英] Gstreamer rtsp playing (with sound)
问题描述
我是 gstreamer 的新手,简单地尝试从 Dlink 2103 摄像头获取 rtsp 视频流.
im newbie in gstreamer and simple try to wath rtsp video flow from Dlink 2103 camera.
当我尝试时(只是视频):
When i trying it (just video):
gst-launch rtspsrc location=rtsp://192.168.0.20/live1.sdp !
rtph264depay !
h264parse ! capsfilter caps="video/x-h264,width=1280,height=800,framerate=(fraction)25/1" !
ffdec_h264 ! ffmpegcolorspace ! autovideosink
没关系.
当我尝试时(只是音频):
When i trying it (just audio):
gst-launch rtspsrc location=rtsp://192.168.0.20/live1.sdp !
rtpg726depay ! ffdec_g726 ! audioconvert ! audioresample ! autoaudiosink
还可以.
接下来我尝试播放音频和视频.gst-launch 手册页用于生成如下内容:
Next i try play both audio and video. gst-launch man page was used for generate something like this:
gst-launch-0.10 -m -vvv -e rtspsrc location=rtsp://192.168.0.20/live1.sdp latency=1000 !
gstrtpptdemux name=demuxer demuxer. !
queue !
rtph264depay ! h264parse ! capsfilter caps="video/x-h264,width=1280,height=800,framerate=(fraction)25/1" !
ffdec_h264 ! ffmpegcolorspace ! autovideosink demuxer. !
queue !
rtpg726depay ! ffdec_g726 ! audioconvert ! audioresample ! autoaudiosink
但是视频在第一帧就卡住了.我也尝试使用 decodebin(1 版和 2 版)这种经典方式:
But video freez with first frame. I also try this classic way using decodebin (both 1 and 2 ver):
gst-launch-0.10 -v souphttpsrc rtspsrc location=rtsp://192.168.0.20/live1.sdp !
decodebin name=decoder decoder. ! queue ! audioconvert ! audioresample !
autoaudiosink decoder. !
ffmpegcolorspace ! autovideosink
但它也会在第一帧冻结.
BUT it also freez on first frame.
我使用 playbin 成功的一种方法......
ONE way i have success it using playbin...
gst-launch-0.10 playbin2 uri=rtsp://192.168.0.20/live1.sdp
是我的管道不好还是 dlink 相机有问题?你能告诉我我应该学习更多的关键词吗?
IS IT my bad pipeline or something wrong with dlink camera? Can you tell me key-word that i should to learn more?
提前致谢!
推荐答案
解决方案 1(已测试)
好的,我制作了自己的 RTSP 服务器进行测试
Ok I made my own RTSP server to test
我使用以下信息(http://www.ip-sense.com/linuxsense/how-to-develop-a-rtsp-server-in-linux-using-gstreamer/)
/* GStreamer
* Copyright (C) 2008 Wim Taymans <wim.taymans at gmail.com>
* Copyright (c) 2012 enthusiasticgeek <enthusiasticgeek@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
//Edited by: enthusiasticgeek (c) 2012 for Stack Overflow Sept 11, 2012
//###########################################################################
//Important
//###########################################################################
//On ubuntu: sudo apt-get install libgstrtspserver-0.10-0 libgstrtspserver-0.10-dev
//Play with VLC
//rtsp://localhost:8554/test
//video decode only: gst-launch -v rtspsrc location="rtsp://localhost:8554/test" ! rtph264depay ! ffdec_h264 ! autovideosink
//audio and video:
//gst-launch -v rtspsrc location="rtsp://localhost:8554/test" name=demux demux. ! queue ! rtph264depay ! ffdec_h264 ! ffmpegcolorspace ! autovideosink sync=false demux. ! queue ! rtppcmadepay ! alawdec ! autoaudiosink
//###########################################################################
#include <gst/gst.h>
#include <gst/rtsp-server/rtsp-server.h>
/* define this if you want the resource to only be available when using
* user/admin as the password */
#undef WITH_AUTH
/* this timeout is periodically run to clean up the expired sessions from the
* pool. This needs to be run explicitly currently but might be done
* automatically as part of the mainloop. */
static gboolean
timeout (GstRTSPServer * server, gboolean ignored)
{
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;
GstRTSPMediaMapping *mapping;
GstRTSPMediaFactory *factory;
#ifdef WITH_AUTH
GstRTSPAuth *auth;
gchar *basic;
#endif
gst_init (&argc, &argv);
loop = g_main_loop_new (NULL, FALSE);
/* create a server instance */
server = gst_rtsp_server_new ();
/* get the mapping for this server, every server has a default mapper object
* that be used to map uri mount points to media factories */
mapping = gst_rtsp_server_get_media_mapping (server);
#ifdef WITH_AUTH
/* make a new authentication manager. it can be added to control access to all
* the factories on the server or on individual factories. */
auth = gst_rtsp_auth_new ();
basic = gst_rtsp_auth_make_basic ("user", "admin");
gst_rtsp_auth_set_basic (auth, basic);
g_free (basic);
/* configure in the server */
gst_rtsp_server_set_auth (server, auth);
#endif
/* 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 ! video/x-raw-yuv,width=320,height=240,framerate=10/1 ! "
"x264enc ! queue ! rtph264pay name=pay0 pt=96 ! audiotestsrc ! audio/x-raw-int,rate=8000 ! alawenc ! rtppcmapay name=pay1 pt=97 "")");
/* attach the test factory to the /test url */
gst_rtsp_media_mapping_add_factory (mapping, "/test", factory);
/* don't need the ref to the mapper anymore */
g_object_unref (mapping);
/* attach the server to the default maincontext */
if (gst_rtsp_server_attach (server, NULL) == 0)
goto failed;
/* add a timeout for the session cleanup */
g_timeout_add_seconds (2, (GSourceFunc) timeout, server);
/* start serving, this never stops */
g_main_loop_run (loop);
return 0;
/* ERRORS */
failed:
{
g_print ("failed to attach the server
");
return -1;
}
}
生成文件
# Copyright (c) 2012 enthusiasticgeek
# RTSP demo for Stack Overflow
sample:
gcc -Wall -I/usr/include/gstreamer-0.10 rtsp.c -o rtsp `pkg-config --libs --cflags gstreamer-0.10 gstreamer-rtsp-0.10` -lglib-2.0 -lgstrtspserver-0.10 -lgstreamer-0.10
测试了解码管道.它工作正常!
Tested the decoding pipeline. It works fine!
gst-launch -v rtspsrc location="rtsp://localhost:8554/test" name=demux demux. ! queue ! rtph264depay ! ffdec_h264 ! ffmpegcolorspace ! autovideosink sync=false demux. ! queue ! rtppcmadepay ! alawdec ! autoaudiosink
解决方案 2(已测试)
尝试使用复用/解复用组合
Try using mux/demux combination
`gst-launch-1.0 -e rtspsrc location='rtsp://localhost:554' latency=0 name=d d. ! queue ! capsfilter caps="application/x-rtp,media=video" ! rtph264depay ! mpegtsmux name=mux ! filesink location=file.ts d. ! queue ! capsfilter caps="application/x-rtp,media=audio" ! decodebin ! audioconvert ! audioresample ! lamemp3enc ! mux.`
解码管道
gst-launch filesrc location=file.ts !打字!mpegtsdemux 名称=demux 解复用器.!队列 !h264解析!ffdec_h264 !自动视频接收器解复用器.!队列 !mp3解析!ffdec_mp3!音频转换!autoaudiosink demux.
解决方案 3(未经测试)
尝试使用基于 Tee
的方法.同时运行 gst-launch-0.10 -v playbin2 uri=rtsp://192.168.0.20/live1.sdp
.注意详细选项.这会给你很多关于如何构建管道的提示.
Try using a Tee
based approach. Also run gst-launch-0.10 -v playbin2 uri=rtsp://192.168.0.20/live1.sdp
. Notice the verbose option. This will give you a lot of hints on how to construct the pipeline.
Tee bin 有一个共同的来源 -> 将其分成两条管道,一条用于音频解码,一条用于视频解码.
Have a common source to Tee bin -> fork this into two pipelines one for audio decode and one for video decode.
src -> tee(分叉成两个分支 - 子管道)->(分支 1 将有音频解复用器 -> 音频解码器 -> 音频接收器)和(分支 2 将有视频解复用器 -> 视频解码器 -> 视频接收器)
试一试(未经测试).您可能需要稍微调整此管道才能使其正常工作,但您会有所了解.
Give the following a shot (untested). You may have to tweak this pipeline a bit to get it to work but you will get an idea.
gst-launch rtspsrc location=rtsp://192.168.0.20/live1.sdp ! queue ! tee name=t !
rtph264depay t. !
h264parse t. ! capsfilter caps="video/x-h264,width=1280,height=800,framerate=(fraction)25/1" t. !
ffdec_h264 t. ! ffmpegcolorspace t. ! autovideosink t. ! queue !
rtpg726depay ! ffdec_g726 ! audioconvert ! audioresample ! autoaudiosink
这篇关于Gstreamer rtsp 播放(有声)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!