【发布时间】:2016-05-20 06:14:06
【问题描述】:
我想将一些 opencv 进程添加到 gstreamer 管道,然后通过 udpsink 发送。
我可以像这样从 gstreamer 读取帧:
// may add some plugins to the pipeline later
cv::VideoCapture cap("v4l2src ! video/x-raw, framerate=30/1, width=640, height=480, format=RGB ! videoconvert ! appsink");
cv::Mat frame;
while(ture){
cap >> frame;
// do some processing to the frame
}
但想不通的是如何将处理后的帧传递到以下管道:appsrc ! x264enc ! mpegtsmux ! udpsink host=localhost port=5000
我试过了
cv::VideoWriter writer = cv::VideoWriter("appsrc ! x264enc ! mpegtsmux ! udpsink host=localhost port=5000", 0, (double)30, cv::Size(640, 480), true);
writer << processedFrame;
但是,接收方什么也没有收到。 (我使用管道$gst-launch-1.0 udpsrc port=5000 ! tsparse ! tsdemux ! h264parse ! avdec_h264 ! videoconvert ! ximagesink sync=false作为接收器)
我的问题是,我可以将处理后的 opencv Mat 传递给 gstreamer 管道并让它进行一些编码,然后通过 udpsink 通过网络发送吗?如果可以,我该如何实现? p>
附带问题,有什么方法可以调试 VideoWriter?比如检查帧是否真的写入其中。
请注意,我在 ubuntu 14.04 上使用的是 opencv 2.4.12 和 gstreamer 1.2。
任何帮助都很棒!
编辑:
为了提供更多信息,我测试了以下代码,它给出了GStreamer Plugin: Embedded video playback halted; module appsrc0 reported: Internal data flow error.
#include <stdio.h>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
int main(int argc, char *argv[]){
cv::VideoCapture cap("v4l2src ! video/x-raw, framerate=30/1, width=640, height=480, format=RGB ! videoconvert ! appsink");
if (!cap.isOpened()) {
printf("=ERR= can't create capture\n");
return -1;
}
cv::VideoWriter writer;
// problem here
writer.open("appsrc ! video/x-raw, framerate=30/1, width=640, height=480, format=RGB ! autovideoconvert ! ximagesink sync=false", 0, (double)30, cv::Size(640, 480), true);
if (!writer.isOpened()) {
printf("=ERR= can't create writer\n");
return -1;
}
cv::Mat frame;
int key;
while (true) {
cap >> frame;
if (frame.empty()) {
printf("no frame\n");
break;
}
writer << frame;
key = cv::waitKey( 30 );
}
cv::destroyWindow( "video" );
}
appsrc 管道显然有问题,但我不知道出了什么问题,因为管道 gst-launch-1.0 v4l2src ! video/x-raw, framerate=30/1, width=640, height=480, format=RGB ! videoconvert ! ximagesink sync=false 工作正常。
【问题讨论】:
-
你需要为appsrc元素设置适当的大写(capabilities - 它的appsrc参数叫做caps) - 你知道
processedFrames是什么格式的吗? -
我尝试将
video/x-raw, framerate=30/1, width=640, height=480, format=RGB(与源相同)设置为appsrc,但没有成功。有什么方法可以检查 opencv Mat 的 gstreamer caps 格式吗?