0

我的目标是从采集卡(Blackmagic decklink)获取视频流到 OpenCV 并实时流到 red5 或任何其他 rtmp 服务器。

所以,我尝试在 gstreamer 的两个分支上完成,下面的命令工作正常。但是,当与 OpenCV 一起使用时,只需将黑帧流式传输到 rtmp 服务器,顺便说一下,opencv 运行良好。

Gstreamer 命令:

gst-launch-1.0 -v autovideosrc !三通名称=t t。!视频转换!视频缩放!队列 !x264enc pass=pass1 threads=4 bitrate=5000 tune=zerolatency !队列 !flvmux 可流=真!rtmpsink location="rtmp://127.0.0.1/live/stb live=1" max-lateness=100 t。!视频/x-raw,宽度=1280,高度=720!应用程序

OpenCV 代码:

String gstSentence = "gst-launch-1.0 -v autovideosrc ! tee name=t " +
                "t. ! videoconvert ! videoscale ! queue ! x264enc pass=pass1 threads=4 bitrate=5000 tune=zerolatency  " +
                "! queue ! flvmux streamable=true ! rtmpsink location=\"rtmp://127.0.0.1/live/stb live=1\" max-lateness=100 " +
                "t. ! video/x-raw,width=1280,height=720 ! appsink";

        System.out.println(gstSentence);
        videoCapture = new VideoCapture(gstSentence);

我的环境:

  • Ubuntu 16.04
  • OpenCV 3.1 - Java 包装器
  • Gstreamer 1.8.1

我该如何处理?

提前致谢。

4

1 回答 1

1

问题是您将 gst-launch-1.0 留在那里,这当然行不通。

这是一个正确的方法:

String gst = "autovideosrc ! tee name=t " + 
             "t. ! videoconvert ! videoscale ! queue ! x264enc pass=pass1 threads=4 bitrate=5000 tune=zerolatency  " +
             "! queue ! flvmux streamable=true ! rtmpsink location=\"rtmp://127.0.0.1/live/stb live=1\" max-lateness=100 " +
             "t. ! video/x-raw,width=1280,height=720 ! appsink";

videoCapture = new VideoCapture(gstSentence);

这个问题的启发..

请注意,将 x264enc 与 tee 一起使用会出现问题。因为有时 x264enc 想要预卷很多帧,这可能会淹没 tee 的另一个分支。

于 2016-06-30T06:47:07.940 回答