2016-07-03 6 views
2

ich diese gstreamer Pipeline, die aus der coomand Linie arbeitet als:gstreamer nicht auf die filesink Spülung

gst-launch-1.0 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 -e 

Nun, ich dies auf der C++ Seite am Replizieren wie folgt:

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> 

I zum Anschluss an ein QT Fenster und spielen wie folgt:

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); 

Dies startet den Video-Stream auf meine Qt Fenster anzeigen und th Die Datei test.mp4 wird erstellt und beginnt an Größe zu wachsen. Wenn ich jedoch die Anwendung beende, ist die Datei nicht abspielbar. Ich habe das Gefühl, das ist, weil die letzten Bits oder einige Header-Informationen nicht auf Grund ruft mich geschrieben wird:

gst_element_set_state (pipeline, GST_STATE_NULL); 

ich spekulieren, dass dies vielleicht die Pipeline geschlossen, ohne sicherzustellen, dass die Datei korrekt erstellt und finalisiert. Gibt es eine Möglichkeit, sicherzustellen, dass EOF oder EOS in der Pipeline aufgerufen wird, bevor sie geschlossen wird, und sicherstellen, dass die Datei ordnungsgemäß geschrieben wird? Dies ist auch eine Spekulation im Moment von meinem Teil aber etwas anderes falsch sein könnte ...

Antwort

1

Ja Senden EOS ist notwendig ..

Also vor dem nulling Rohr tun:

gst_element_send_event(pipeline, gst_event_new_eos()); 
+0

Wie zu wissen, dass die EOS vom Filesink verarbeitet wurde? Es erzeugt weiterhin defekte Dateien, wenn es im Handler von 'MESSAGE_EOS' auf NULL gesetzt ist. – Velkan

+0

@Velkan nur aktivieren GST_DEBUG = 5 beim Ausführen Ihrer App .. es gibt einige Debug-Kategorie für diese, aber ich erinnere mich nicht .. Sie sollten eos Ereignis durch Pipe sehen. – nayana