我在通过RTSP传输H.264视频时遇到了一些麻烦.目标是将摄像机图像直播到RTSP客户端(理想情况下是最终的浏览器插件).到目前为止,这个问题一直很顺利,除了一个问题:视频会在启动时滞后,每隔几秒就会断断续续,并且延迟时间约为4秒.这是不好的.
我们的设置是使用x264(w/zerolatency和ultrafast)进行编码,并使用ffmpeg 0.6.5的libavformat打包到RTSP/RTP中.为了测试,我在连接到RTSP服务器时接收带有gst-launch的GStreamer管道的流.但是,当我只使用RTP从另一个GStreamer实例直接流式传输时,我已经能够重现相同的问题.
发送机:
gst-launch videotestsrc ! x264enc tune=zerolatency ! rtph264pay ! udpsink host=10.89.6.3
Run Code Online (Sandbox Code Playgroud)
收货机:
gst-launch udpsrc ! application/x-rtp,payload=96 ! rtph264depay ! decodebin ! xvimagesink
Run Code Online (Sandbox Code Playgroud)
您也可以在同一台计算机上运行这两者,只需将主机更改为127.0.0.1即可.在接收端,您应该注意到口吃和通常效果不佳的视频,以及控制台上的重复警告:
WARNING: from element /GstPipeline:pipeline0/GstXvImageSink:xvimagesink0: A lot of buffers are being dropped.
Additional debug info:
gstbasesink.c(2875): gst_base_sink_is_too_late (): /GstPipeline:pipeline0/GstXvImageSink:xvimagesink0:
There may be a timestamping problem, or this computer is too slow.
Run Code Online (Sandbox Code Playgroud)
我在互联网上看到的一个常见建议的"修复"是sync=false与xvimagesink 一起使用:
gst-launch udpsrc ! application/x-rtp,payload=96 ! rtph264depay ! decodebin ! xvimagesink sync=false
Run Code Online (Sandbox Code Playgroud)
即使使用我们的相机软件进行测试,视频也会以接近零的延迟播放.这对于测试非常有用,但对于部署并不是很有用,因为它不适用于Totem,VLC或其浏览器插件嵌入.
我想尝试从源头解决问题; 我怀疑x264或者RTP有效载荷在H.264流上缺少某种时间戳信息.有什么办法来修改源 GST管道,这样我就不会需要使用 …
在gstreamer中,cap的语法是什么,指定媒体功能?Caps是指定允许的媒体类型的字符串,看起来像"audio/x-raw-int,..."但是我无法找到关于cap字符串中允许的确切内容的良好文档.
我正在寻找最快的方法来编码可在html5视频标签中查看的网络摄像头流.我正在使用Pandaboard:http://www.digikey.com/product-highlights/us/en/texas-instruments-pandaboard/686#tabs-2获取硬件.可以使用gstreamer,cvlc,ffmpeg.我将用它来驱动一个机器人,所以在视频流中需要最少的延迟.质量不一定很好,也不需要音频.此外,这仅适用于一个客户端,因此带宽不是问题.到目前为止最好的解决方案是使用带有mpjpeg的ffmpeg给我约1秒的延迟.还有什么更好的?
我正试图从/dev/video0带有Gstreamer 1.0 v4l2src元素的本地安装的Logitech C920相机捕获H264流.
v4l2-ctl --list-formats 表明相机能够提供H264视频格式:
# v4l2-ctl --list-formats
ioctl: VIDIOC_ENUM_FMT
...
Index : 1
Type : Video Capture
Pixel Format: 'H264' (compressed)
Name : H.264
...
Run Code Online (Sandbox Code Playgroud)
但管道
# gst-launch-1.0 -vvv v4l2src device=/dev/video0 ! video/x-h264, width=800, height=448, framerate=30/1 ! fakesink
一直给我not-negotiated (-4)错误:
/GstPipeline:pipeline0/GstV4l2Src:v4l2src0.GstPad:src: caps = video/x-h264, width=(int)800, height=(int)448, interlace-mode=(string)progressive, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)30/1
/GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:src: caps = video/x-h264, width=(int)800, height=(int)448, interlace-mode=(string)progressive, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)30/1
/GstPipeline:pipeline0/GstFakeSink:fakesink0.GstPad:sink: caps = video/x-h264, width=(int)800, height=(int)448, interlace-mode=(string)progressive, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)30/1
/GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:sink: caps = video/x-h264, …Run Code Online (Sandbox Code Playgroud) 我一直在测试使用不同的播放器播放多个直播流,因为我想获得最低的延迟值.我尝试了gstreamer播放器(gst-launch-0.01),mplayer,totem和ffmpeg播放器(ffplay).我使用不同的配置值来获得每个配置值的最低延迟,例如:
ffplay -fflags nobuffer
mplayer -benchmark
Run Code Online (Sandbox Code Playgroud)
我流媒体的协议是udp,我使用ffplay比mplayer或gst-launch获得更好的价值.说实话,我不知道我需要什么样的配置才能让gstreamer获得更低的延迟.现在,我需要的是两件事:
我想知道是否有人有更好的建议来流式传输低延迟<100毫秒的直播流.我现在高于100毫秒,这对我来说效率不高.
由于我目前正在使用ffplay,因为它是目前为止最好的.我想做一个带有播放和录制按钮的简单gui和3个屏幕从不同的视频服务器流,我只是不知道使用什么样的包装(应该真的很快)!
我为gstreamer创建了一个单独的类来传输视频.
该类使用moveToThread()在单独的线程上运行.
我正在使用Qt5.5进行开发.
当我在主线程上发出startcommand时,Qthread启动并且gstreamer用于g_main_loop_run流式传输视频.这绝对没问题.但不知何故g_main_loop_run阻止线程,当我发出信号从主线程停止视频时,它不会在gstreamer类中执行插槽.
有人可以建议我如何解决这个问题?我可以用其他g_main_loop_r命令替换un或者可以使用g_main_loop_quit( gloop ); 用另一种方式.
void StreamingVideo::slotStartStream() // this slot called on start of thread from main thread
{
if( !isElementsLinked() )
{
qDebug() << " we are emitting in dummy server ";
//emit sigFailed( "elementsFailed" ); // WILL CONNECT IT WITH MAIN GUI ONXCE CODE IS FINISHED
return;
}
gst_bus_add_watch( bus, busCall, gloop );
gst_object_unref( bus );
//proper adding to pipe
gst_bin_add_many( GST_BIN( pipeline ), source, capsFilter, conv, …Run Code Online (Sandbox Code Playgroud) 我使用Debian sid(amd64),每周滚动更新.我最近从他们的官方网站下载了RStudio桌面版0.99.902并发布了(当然是root用户):
dpkg -i rstudio-0.99.902-amd64.deb
无济于事:
dpkg:依赖问题会阻止rstudio的配置:rstudio取决于libgstreamer0.10-0; 但是:未安装包libgstreamer0.10-0.rstudio取决于libgstreamer-plugins-base0.10-0; 但是:未安装包libgstreamer-plugins-base0.10-0.
系统上安装了这两个软件包的较新版本(1.0-0),但官方Debian存储库中不再提供那些较旧版本(0.10-0).
如何在Debian sid下安装RStudio并完全运行?当然,我从官方Debian存储库安装了R debs,没有任何问题......
谢谢你的帮助!
我编写了一个python脚本来使用gstreamer(pygst和gst模块)来计算replaygain标签,并且它与各种gobject错误不一致.我发现你可以通过在脚本顶部放置以下样板来解决这个问题:
import gobject
gobject.threads_init()
Run Code Online (Sandbox Code Playgroud)
我试了一下,它运作了.任何人都可以解释为什么这些行是必要的,为什么pygst本身不这样做?