【问题标题】:Why does the same gstreamer command does work on WIndows but not on linux?为什么相同的 gstreamer 命令在 WINdows 上有效,但在 linux 上无效?
【发布时间】:2020-05-29 16:45:24
【问题描述】:

我尝试从网络摄像头捕捉视频并在 appr 后保存。 10 秒(splitmuxsink) 我在 Windows(10) 和 Linux (yocto) 上尝试了相同的 gstreamer cmd,但它只适用于 Windows。 Windows 机器是普通笔记本电脑,Linux 机器是 Raspy 3 在 Linux 上,文件在启动后创建,但大小不会增长,并且在一定时间后不会拆分..

c:\gstreamer\1.0\x86\bin>gst-launch-1.0.exe  -v souphttpsrc location=http://192.168.1.245:8080/video ! multipartdemux ! image/jpeg, framerate=25/1 ! jpegparse  ! splitmuxsink location=file%02d.mkv max-size-time=10000000000 muxer=matroskamux
gst-launch-1.0  -v souphttpsrc location=http://192.168.1.245:8080/video ! multipartdemux ! image/jpeg, framerate=25/1 ! jpegparse  ! splitmuxsink location=file%02d.mkv max-size-time=10000000000 muxer=matroskamux

我还尝试捕获单个 jpg 文件,该文件在两个类似的系统上都可以工作。

gst-launch-1.0.exe  -v souphttpsrc location=http://192.168.1.245:8080/shot.jpg  ! filesink location=capture1.jpg

gstreamer 的版本: c:\gstreamer\1.0\x86\bin>gst-launch-1.0 --gst-version GStreamer 核心库版本 1.15.90

root@raspberrypi3:~# gst-launch-1.0 --gst-version GStreamer 核心库版本 1.14.4

输出也很相似,但在 linux 我有一个输出 /GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0/GstQueue:queue0: max-size-buffers = 13 /GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0/GstQueue:queue0: max-size-buffers = 14 每时每刻.... 这个输出是不是让一切都变慢了以至于它不起作用?

窗户:

c:\gstreamer\1.0\x86\bin>gst-launch-1.0.exe  -v souphttpsrc location=http://192.168.1.245:8080/video ! multipartdemux ! image/jpeg, framerate=25/1 ! jpegparse  ! splitmuxsink location=file%02d.mkv max-size-time=10000000000 muxer=matroskamux
Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
/GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0/GstFileSink:sink: async = false
Got context from element 'souphttpsrc0': gst.soup.session=context, session=(SoupSession)NULL, force=(boolean)false;
/GstPipeline:pipeline0/GstCapsFilter:capsfilter1: caps = image/jpeg, framerate=(fraction)25/1
/GstPipeline:pipeline0/GstCapsFilter:capsfilter1.GstPad:src: caps = image/jpeg, framerate=(fraction)25/1
/GstPipeline:pipeline0/GstJpegParse:jpegparse0.GstPad:sink: caps = image/jpeg, framerate=(fraction)25/1
/GstPipeline:pipeline0/GstCapsFilter:capsfilter1.GstPad:sink: caps = image/jpeg
/GstPipeline:pipeline0/GstJpegParse:jpegparse0.GstPad:src: caps = image/jpeg, parsed=(boolean)true, format=(string)I420, width=(int)1280, height=(int)720, framerate=(fraction)25/1
/GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0.GstGhostPad:video.GstProxyPad:proxypad0: caps = image/jpeg, parsed=(boolean)true, format=(string)I420, width=(int)1280, height=(int)720, framerate=(fraction)25/1
/GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0/GstQueue:queue0.GstPad:sink: caps = image/jpeg, parsed=(boolean)true, format=(string)I420, width=(int)1280, height=(int)720, framerate=(fraction)25/1
/GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0.GstGhostPad:video: caps = image/jpeg, parsed=(boolean)true, format=(string)I420, width=(int)1280, height=(int)720, framerate=(fraction)25/1
/GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0/GstQueue:queue0.GstPad:src: caps = image/jpeg, parsed=(boolean)true, format=(string)I420, width=(int)1280, height=(int)720, framerate=(fraction)25/1
/GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0/GstMatroskaMux:matroskamux0.GstMatroskamuxPad:video_0: caps = image/jpeg, parsed=(boolean)true, format=(string)I420, width=(int)1280, height=(int)720, framerate=(fraction)25/1
/GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0/GstMatroskaMux:matroskamux0.GstMatroskamuxPad:video_0: caps = NULL
/GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0/GstFileSink:sink: location = file00.mkv
Pipeline is PREROLLED ...
/GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0/GstMatroskaMux:matroskamux0.GstMatroskamuxPad:video_0: caps = image/jpeg, parsed=(boolean)true, format=(string)I420, width=(int)1280, height=(int)720, framerate=(fraction)25/1
/GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0/GstMatroskaMux:matroskamux0.GstPad:src: caps = video/x-matroska
/GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0/GstFileSink:sink.GstPad:sink: caps = video/x-matroska
Setting pipeline to PLAYING ...
New clock: GstSystemClock

Linux:

root@raspberrypi3:~# gst-launch-1.0  -v souphttpsrc location=http://192.168.1.245:8080/video ! multipartdemux ! image/jpeg, framerate=25/1 ! jpegparse  ! splitmuxsink location=file%02d.mkv max-size-time=10000000000 muxer=matroskamux
Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
/GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0/GstFileSink:sink: async = false
Got context from element 'souphttpsrc0': gst.soup.session=context, session=(SoupSession)NULL, force=(boolean)false;
/GstPipeline:pipeline0/GstCapsFilter:capsfilter1: caps = image/jpeg, framerate=(fraction)25/1
/GstPipeline:pipeline0/GstCapsFilter:capsfilter1.GstPad:src: caps = image/jpeg, framerate=(fraction)25/1
/GstPipeline:pipeline0/GstJpegParse:jpegparse0.GstPad:sink: caps = image/jpeg, framerate=(fraction)25/1
/GstPipeline:pipeline0/GstCapsFilter:capsfilter1.GstPad:sink: caps = image/jpeg
/GstPipeline:pipeline0/GstJpegParse:jpegparse0.GstPad:src: caps = image/jpeg, parsed=(boolean)true, format=(string)I420, width=(int)1280, height=(int)720, framerate=(fraction)25/1
/GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0.GstGhostPad:video.GstProxyPad:proxypad0: caps = image/jpeg, parsed=(boolean)true, format=(string)I420, width=(int)1280, height=(int)720, framerate=(fraction)25/1
/GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0/GstQueue:queue0.GstPad:sink: caps = image/jpeg, parsed=(boolean)true, format=(string)I420, width=(int)1280, height=(int)720, framerate=(fraction)25/1
/GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0/GstQueue:queue0.GstPad:src: caps = image/jpeg, parsed=(boolean)true, format=(string)I420, width=(int)1280, height=(int)720, framerate=(fraction)25/1
/GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0/GstQueue:queue0.GstPad:src: caps = image/jpeg, parsed=(boolean)true, format=(string)I420, width=(int)1280, height=(int)720, framerate=(fraction)25/1
/GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0/GstMatroskaMux:matroskamux0.GstMatroskamuxPad:video_0: caps = image/jpeg, parsed=(boolean)true, format=(string)I420, width=(int)1280, height=(int)720, framerate=(fraction)25/1
/GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0/GstMatroskaMux:matroskamux0.GstMatroskamuxPad:video_0: caps = NULL
/GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0/GstFileSink:sink: location = file00.mkv
Pipeline is PREROLLED ...
/GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0/GstMatroskaMux:matroskamux0.GstMatroskamuxPad:video_0: caps = image/jpeg, parsed=(boolean)true, format=(string)I420, width=(int)1280, height=(int)720, framerate=(fraction)25/1
Setting pipeline to PLAYING ...
New clock: GstSystemClock
/GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0/GstQueue:queue0: max-size-buffers = 6
/GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0/GstQueue:queue0: max-size-buffers = 7
/GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0/GstQueue:queue0: max-size-buffers = 8
/GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0/GstQueue:queue0: max-size-buffers = 9
/GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0/GstQueue:queue0: max-size-buffers = 10
/GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0/GstQueue:queue0: max-size-buffers = 11
/GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0/GstQueue:queue0: max-size-buffers = 12
/GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0/GstQueue:queue0: max-size-buffers = 13
[...]

【问题讨论】:

    标签: gstreamer


    【解决方案1】:

    查看splitmuxsink source 似乎max-size-buffers = <N> 日志来自于内部队列已满时的增长。
    在没有更多信息的情况下很难猜出原因,所以我建议您设置GST_DEBUG=5(或其他一些level)以获得更多输出。 如果您使用高比特率或使用安装在 RAM 中的中间位置(例如 /tmp 通常是),也许检查您是否可以足够快地写入文件系统。

    【讨论】:

    • 感谢 divhart 的建议。我听从了你的建议。问题是 Gstreamer 在启动命令序列后直接使用 GST_DEBUG=5 在两秒内创建超过 14.000 行调试信息...这在 IMO 中并不适合初学者调试...
    【解决方案2】:

    我尝试了几件事后发现:

    • GSteamer 调试信息并不是真正可用的,因为对我来说它的信息太多......

    我的示例使用以下内容:

    • 如果我删除“jpegparse”和“framerate=25/1”

    • 并添加“do-timestamp=true”并缩小图片尺寸“image/jpeg,width=640,height=480”

    确实有效。

    在经过 3 周的测试后,IMO 摆弄 Gstreamer 并不是很友好,但它确实是一个非常强大的工具。

    gst-launch-1.0 -v souphttpsrc location=http://192.168.1.133:8080/video  do-timestamp=true ! multipartdemux ! image/jpeg,width=640,height=480 ! splitmuxsink location=FILE%02d.mkv max-size-time=10000000000 muxer=matroskamux
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-26
      • 1970-01-01
      • 1970-01-01
      • 2020-12-01
      • 2012-09-20
      • 1970-01-01
      • 1970-01-01
      • 2013-11-21
      相关资源
      最近更新 更多