我有这个gstreamer管道,它可以从coomand系列中运行:
GstElement * pipeline = gst_parse_launch("autovideosrc ! tee name = t ! "
"queue ! omxh264enc ! video/x-h264, "
"stream-format=(string)byte-stream ! h264parse ! "
"qtmux ! filesink name=fileSink location=test.mp4 t. "
"! queue ! videoscale ! video/x-raw, width=480,height=270 ! "
"xvimagesink name=displaySink", &error);</raw>
现在,我在C ++端复制这个,如下所示:
GstElement * displaySink = gst_bin_get_by_name (GST_BIN (pipeline), "displaySink");
qDebug() << displaySink;
// prepare the ui
QWidget window;
window.resize(480, 270);
window.show();
WId xwinid = window.winId();
gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY(displaySink), xwinid);
// run the pipeline
qDebug() << "Calling run...";
GstStateChangeReturn sret = gst_element_set_state (pipeline,
GST_STATE_PLAYING);
if (sret == GST_STATE_CHANGE_FAILURE) {
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_object_unref (pipeline);
// Exit application
QTimer::singleShot(0, QApplication::activeWindow(), SLOT(quit()));
}
int ret = app.exec();
window.hide();
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_object_unref (pipeline);
我将它连接到QT窗口并播放如下:
test.mp4
这开始将视频流显示在我的Qt窗口上,文件gst_element_set_state (pipeline, GST_STATE_NULL);
被创建并开始增大。但是,当我退出应用程序时,该文件无法播放。我有一种感觉,这是因为我调用了最后一位或一些标题信息:
padding: 25px 50px 75px 100px;
我猜测这可能会在没有确保文件正确创建和最终确定的情况下关闭管道。有没有办法确保在关闭之前在管道上调用EOF或EOS并确保文件正确写入?这也是我此刻的一个推测,但其他事情可能是错误的......
答案 0 :(得分:1)
是的,发送EOS是必要的..
所以在管道的NULL之前做:
gst_element_send_event(pipeline, gst_event_new_eos());