2016-12-21 5 views
1

Ich habe versucht, ein Video in h264 kodiert und muxed mit Matroskamux, aber ich kann es nicht erreichen. Ich bin auf der Embedded-Plattform, einem iMX6.Gstreamer: mastroskamux Fehler: nicht verknüpft

Meine Pipeline arbeitet mit gst-lauch:

gst-launch-1.0 filesrc location=video.mkv ! matroskademux ! h264parse ! imxvpudec ! imxipuvideosink 

ich es in C erstellt, aber es funktioniert nicht. Ich entfernte Fehlerbehandlung, verwende ich eine Struktur rep alle Elemente enthalten:

rep->pipeline = gst_pipeline_new("pipeline"); 
rep->src = gst_element_factory_make("filesrc","source0"); 
rep->demux = gst_element_factory_make("matroskademux","demux0"); 
rep->queue = gst_element_factory_make("queue2","queue0"); 
rep->parser = gst_element_factory_make("h264parse","parser0"); 
rep->decoder = gst_element_factory_make("imxvpudec","dec0"); 
rep->sink = gst_element_factory_make("imxipuvideosink","sink0"); 
gst_bin_add_many (GST_BIN(rep->pipeline), rep->src, rep->demux, rep->queue, rep->parser, rep->decoder,rep->sink, NULL); 
g_object_set(rep->src, "location", "video.mkv", NULL); 
g_object_set(rep->sink, "use-vsync", TRUE, NULL); 
gst_element_link_many(rep->src, rep->demux, rep->queue, rep->parser, rep->decoder, rep->sink, NULL); 
g_print("start pipeline\n"); 
gst_element_set_state (rep->pipeline, GST_STATE_PLAYING); 
g_main_loop_run (loop); 

Das Video nicht angezeigt wird und die Anwendung fest. Mit GST_DEBUG 4 = bekomme ich eine Menge Debug, aber in den letzten Zeilen:

0:00:00.168590667 577 0xe24c0 WARN   matroskademux matroska-demux.c:4500:gst_matroska_demux_loop:<demux0> error: stream stopped, reason not-linked 
0:00:00.168777333 577 0xe24c0 INFO  GST_ERROR_SYSTEM gstelement.c:1835:gst_element_message_full:<demux0> posting message: GStreamer encountered a general stream error. 
0:00:00.169084667 577 0xe24c0 INFO  GST_ERROR_SYSTEM gstelement.c:1858:gst_element_message_full:<demux0> posted error message: GStreamer encountered a general stream error. 
0:00:00.169268000 577 0xe24c0 INFO     task gsttask.c:300:gst_task_func:<demux0:sink> Task going to paused 

Ich habe versucht, die Verknüpfung von demuxer des Pads zu zwingen, weil es eine „manchmal“ Source-Pad hat.

Ich weiß nicht, wie man vorgeht, damit es funktioniert. Danke für die Hilfe.

EDIT: Protokolldatei here. Es ist ein Verknüpfungsproblem, ich weiß nicht, wie ich es lösen soll.

+0

Wahrscheinlich stimmt die Caps nicht überein. Vielleicht gibt es mehr Spuren in der Matroska? Versuchen Sie GST_DEBUG = 5 und leiten Sie das Protokoll in eine Datei um. Es gibt eine Menge Dinge, die erklären können, was vor sich geht. Ich kann in das Protokoll schauen. – peper0

+0

@ peper0 Danke für die Antwort, ich habe meinen Beitrag mit dem Log bearbeitet. – PierreOlivier

+0

Was genau war Ihre Pipeline während des Laufs, den Sie protokolliert haben? [EDIT] Sorry, ich dachte, es wäre ein Log von gst-launch. Jetzt sehe ich, dass es aus dem Code stammt, den du angehängt hast. – peper0

Antwort

2

Das Problem ist, dass Demux keine Source-Pads im NULL-Zustand hat, wenn Sie versuchen, es zu verknüpfen. Demux fügt die Ausgangspads im PAUSED-Status hinzu, da in diesem Moment mit der Verarbeitung der Eingabedatei begonnen wird. Daher kann man es nicht einfach am Anfang verknüpfen und dann starten.

Sie müssen den Anschluss der "on-Pad-added" Ereignis des demuxer mit etwas wie folgt aus:

g_signal_connect (rep->demux, "pad-added", G_CALLBACK (on_pad_added), rep->queue); 

Und schreiben richtige on_pad_added Funktion, wie folgt aus:

void 
on_pad_added (GstElement *element, 
       GstPad  *pad, 
       gpointer data) 
{ 
    GstPad *sinkpad; 
    GstElement *queue = (GstElement *) data; 

    g_print ("Dynamic pad created, linking demuxer/decoder\n"); 

    sinkpad = gst_element_get_static_pad (queue, "sink"); 

    gst_pad_link (pad, sinkpad); 

    gst_object_unref (sinkpad); 
} 

I didn überprüfe nicht, ob mein Code kompiliert, aber ich bin mir sicher, dass du eine Idee hast.

Sie könnten auch an this example interessiert sein.

BTW, gst-launch verwendet einige intelligente Maschinen, die solche verzögerte Verknüpfung unterstützt. In Code müssen Sie es manuell tun.

+0

Es hat funktioniert, vielen Dank! – PierreOlivier