我正在使用Nitrogen6x板和ov5640相机(mipi).
相机没有使用标准v4l/v4l,但我们可以使用GStreamer为其驱动程序(mfw_v4l)流式传输视频:
gst-launch mfw_v4lsrc ! autovideosink
Run Code Online (Sandbox Code Playgroud)
我想通过GStreamer(OpenCV内部的GStreamer)调用OpenCV中的相机.我在这里问了一个关于在OpenCV中调用GStreamer的问题,这是后续的.
如果我启用了GStreamer支持,则会在源代码中检查它,但OpenCV会尝试使用标准V4L/V4L2作为GStreamer,我想要更改它.有关调用GStreamer的部分位于cap_gstreamer.cpp中:
CvCapture* cvCreateCapture_GStreamer(int type, const char* filename )
{
CvCapture_GStreamer* capture = new CvCapture_GStreamer;
if( capture->open( type, filename ))
return capture;
delete capture;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想这是我应该以某种方式指向相机驱动程序的部分.("type"这里可能是一个与驱动程序相关的数字(在precomp.hpp中定义),但是什么是"文件名"?)
有关如何通过GStreamer访问相机的任何建议都会有所帮助和赞赏.谢谢!
在干净的Debian 8安装上,我必须安装一些gstreamer-plugins.虽然大多数已经安装或可以通过apt-get轻松安装,但gstreamer0.10-ffmpeg无法安装:
sudo apt-get install gstreamer0.10-ffmpeg
Run Code Online (Sandbox Code Playgroud)
抛出以下警告:
包gstreamer0.10-ffmpeg不可用,但由另一个包引用.这可能意味着包丢失,已被淘汰或仅可从其他来源获得E:包'gstreamer0.10-ffmpeg'没有安装候选
我怎么能安装包呢?
我需要使用ffmpeg/avconv将jpg帧传输到python PIL(Pillow)Image对象,使用gst作为中介*.我一直在寻找这个答案而没有太多运气.我想我很接近 - 但我被困住了.使用Python 2.7
我从python启动的理想管道如下所示:
我将控制的前几个步骤作为单个命令,将.jpgs写入磁盘的速度与硬件允许的速度一样快.
该命令看起来像这样:
command = [
"ffmpeg",
"-f video4linux2",
"-r 30",
"-video_size 1280x720",
"-pixel_format 'uyvy422'",
"-i /dev/video0",
"-vf fps=30",
"-f H264",
"-vcodec libx264",
"-preset ultrafast",
"pipe:1 -",
"|", # Pipe to GST
"gst-launch-1.0 fdsrc !",
"video/x-h264,framerate=30/1,stream-format=byte-stream !",
"decodebin ! videorate ! video/x-raw,framerate=30/1 !",
"videoconvert !",
"jpegenc quality=55 !",
"multifilesink location=" + Utils.live_sync_path + "live_%04d.jpg"
]
Run Code Online (Sandbox Code Playgroud)
如果使用popen或os.system运行,这将成功将帧写入磁盘.
但是我没有将帧写入磁盘,而是想要捕获我的子进程管道中的输出,并在写入时将帧读取到类似文件的缓冲区中,然后由PIL读取.
像这样的东西:
import subprocess as …Run Code Online (Sandbox Code Playgroud) 我正在尝试实时进行一些视频处理.我开始尝试FFmpeg,但我看到了这个问题:
哪个进一步链接到这个问题:
ffmpeg,libav和avconv之间有什么区别和相似之处?
这篇博文:
http://blog.pkh.me/p/13-the-ffmpeg-libav-situation.html
读完之后我才知道Libav是FFmpeg的一个分支,正在分开开发.我需要使用Libav或FFmpeg或libVLC或Gstreamer开发C++应用程序.我认为在回答这些问题后会有很多变化.对这些工具进行一些基准测试会很棒.
你们对视频和音频处理的任何基准测试结果有什么偏好?我需要快速处理帧并将视频流式传输到多个C++应用程序,这将是解决此问题的最佳方法,以及最佳选择工具是什么?
因此,截至2018年,这些工具在视频处理方面的现状如何.知道熟悉这些工具的视频处理人员的一些结果会很高兴.
我想创建一个Qt小部件,可以播放传入的RTP流,其中视频编码为H264并且不包含音频.
我的实施基本计划如下:
我的环境:
我的问题:
编辑
我找到的一个解决方案是将libVLC与Qt结合使用,我在这个帖子中学到了这个.这是感兴趣的代码示例.我还在寻找基于Phonon的解决方案.
理想情况下,我只需要提供一个SDP文件并完成工作.
我正在开发一个GStreamer应用程序,并为实现传入RTP流的播放器而苦苦挣扎.我正在尝试围绕gstrtpbin元素构建一个管道.我正在尝试使用gst-launch构造对管道进行建模:
VIDEO_CAPS="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H264"
gst-launch -v udpsrc caps=$VIDEO_CAPS port=4444 \
! gstrtpbin .recv_rtp_sink_0 \
! rtph264depay ! ffdec_h264 ! xvimagesink
Run Code Online (Sandbox Code Playgroud)
当我启动脚本时,GStreamer报告这些错误:
Setting pipeline to PAUSED ...
Pipeline is live and does not need PREROLL ...
Setting pipeline to PLAYING ...
/GstPipeline:pipeline0/GstRtpBin:rtpbin0/GstRtpSession:rtpsession0: ntp-ns-base = 3469468914024449000
New clock: GstSystemClock
/GstPipeline:pipeline0/GstRtpBin:rtpbin0/GstRtpSession:rtpsession0.GstPad:recv_rtp_sink: caps = application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264
/GstPipeline:pipeline0/GstRtpBin:rtpbin0.GstGhostPad:recv_rtp_sink_0: caps = application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264
/GstPipeline:pipeline0/GstRtpBin:rtpbin0.GstGhostPad:recv_rtp_sink_0.GstProxyPad:proxypad0: caps = application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264
/GstPipeline:pipeline0/GstRtpBin:rtpbin0/GstRtpSession:rtpsession0.GstPad:recv_rtp_src: caps = application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264
/GstPipeline:pipeline0/GstRtpBin:rtpbin0/GstRtpSsrcDemux:rtpssrcdemux0.GstPad:sink: caps = application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264 …Run Code Online (Sandbox Code Playgroud) 我一直在使用gst-launch实用程序对GStreamer进行一些实验.但是,最终目标是使用GStreamer库在我自己的应用程序上实现相同的功能.
问题是,最终很难(至少对于那些不习惯使用GStreamer API的人来说)将我在命令行上测试的内容"移植"到C/C++代码.
我可能需要移植的命令示例如下:
gst-launch filesrc location="CLIP8.mp4" ! decodebin2 ! jpegenc ! multifilesink location="test%d.jpg"
Run Code Online (Sandbox Code Playgroud)
什么是最"直接"的方式/方法来获取这样的命令并在我自己的应用程序上用C语言编写它.
另外,作为一个附带问题,我怎么能用在内存上做这项工作的可能性替换multifilesink(我正在使用OpenCV对应该从视频中提取的给定图像执行一些计算).是否可以直接解码到内存并立即使用它而无需先保存到文件系统?它可以(并且应该)是顺序的,我的意思是在我完成处理当前帧之后只会继续到下一帧,这样我就不必在内存中保留数千帧.
你说什么?
我正在研究gstreamer作为从列表中选择视频设备以将其提供给opencv脚本的方法.
我绝对不明白如何在Windows中使用gstreamer与python.我从gstreamer官方网站安装了Windows gstreamer 1.07二进制文件.但是,我无法在python中导入和模块.pygstgst
>>> import pygst
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
import pygst
ImportError: No module named pygst
>>>
Run Code Online (Sandbox Code Playgroud)
我检查了gstreamer安装,似乎没有pygst.py提供.但是,有一个名为的文件gst-env包含环境变量的路径(在安装时未添加到系统变量中.我检查过.
关于同一问题的其他问题在这里和这里,例如,都使用gstreamer 的winbuild版本.为什么会这样?
我完全迷失在这一个.
好吧,我使用SDK for Gstreamer 0.10(其中有一个pygst.py)管理它,但是没有办法使用Gstreamer 1.0系列,因为0.10是"寿命终止"?
我正在编写一个Android应用程序,其中包括从台式PC发送和接收视频流.为了使应用程序正常工作,我们需要尽可能少的延迟,必要时牺牲视频质量.我们正在gstreamer 1.45两端使用,但是对于当前的管道,我们在Galaxy Note S2上至少有0.5秒的延迟,那就是两个设备都在同一网络上(后来这应该通过VPN工作).
该发件人管道
appsrc name=vs_src format=time do-timestamp=true
caps="video/x-raw, format=(string)RGB, width=(int)640, height=(int)480, framerate=(fraction)15/1000"
! videoconvert
! x264enc speed-preset=ultrafast tune=zerolatency byte-stream=true threads=1 key-int-max=15 intra-refresh=true ! h264parse ! rtph264pay pt=96
! queue ! udpsink name=vs_sink host=%s port=%d async=false
Run Code Online (Sandbox Code Playgroud)
该接收器管道
udpsrc name=vr_src
caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, payload=(int)96, encoding-name=(string)H264"
! rtpjitterbuffer
! rtph264depay ! h264parse ! avdec_h264
! videorate ! videoconvert
! glimagesink name=vr_sink async=false
Run Code Online (Sandbox Code Playgroud)
设置threads=2或更高会发出gstreamer警告,表明它是在没有多线程支持的情况下编译的.我知道有些设备提供硬件解码器,但可靠地访问它们的唯一方法似乎是通过encodebin/ decodebin.我已经尝试使用decodebin但由于某种原因它抱怨它无法找到所需的插件(例如No decoder to handle …
在这种情况下,我有多个摄像头(rtspsrc)和一个singleton元素,它们对传入的视频流进行分析。我称它为单例元素,因为它具有请求源和接收器垫。应用程序中应该只存在其中之一,因为它可以在GPU上运行,并且可以通过批量处理获得更好的性能。将我正在构建的应用程序视为API,以添加相机,移除相机,打开和关闭每个相机的分析等。相机将对其进行分析,捕获结果并继续发送。麻烦的是,我需要共享一个Gstreamer元素(分析元素)。
因此,我有多个摄像头,将其馈入单个元素,然后馈入至appsink。这相当有效,但我希望能够:
rtspsrc都完全隔离,这样一个错误就不会影响整个管道如果我将所有摄像机都放在管道中,则无法弄清楚如何暂停特定摄像机。我无法暂停整个管道,因为这将停止所有摄像机。我想出的最好办法是删除并与特定摄像机的元素不同,然后在恢复时重新添加并重新链接。这有点。如果某个特定对象rtspsrc停止响应,则整个管道都将停止。如果rtspsrc不存在特定内容,则整个管道不会过渡到PLAYING状态
我应该如何设计我的应用程序?您认为我应该只有一条大型管道吗?还是应该有一个包含单例分析元素的管道,以及每个摄像机的管道,然后使用appsink和appsrc将它们连接起来?这种方法可能会使处理事情变得更容易,因为每个管道都是完全独立的?
让我知道您是否需要更多信息。