2016-04-11 10 views
1

Ich habe char * Puffer, die ich aus video.mp4 Datei gelesen habe. Dieser Puffer hat eine Größe 4096. Ich versuchte GstBuffer von char * bufferWie rohe char * Puffer mit Gstreamer zu spielen?

GstBuffer* Buffer = gst_buffer_new_wrapped(data, size); 
dataBuffer = gst_buffer_copy(tmpBuf); 

Dann habe ich diesen Puffer drücken auf die appsrc

GstElement* source = gst_bin_get_by_name (GST_BIN (consumer), "source"); 
gst_app_src_push_buffer (GST_APP_SRC (source), dataBuffer); 
gst_object_unref (source); 

Pipeline Verbraucher wurde in der nächsten Art und Weise erstellt zu erstellen :

gchar* videoConsumerString = g_strdup_printf ("appsrc max-buffers=5 drop=false name=source ! decodebin ! xvimagesink"); 
consumer = gst_parse_launch (videoConsumerString, NULL); 
gst_element_set_state (consumer, GST_STATE_NULL); 
g_free (videoConsumerString); 

Nach dem Erstellen der Pipeline habe ich seinen Status auf die GST_STATE_NULL. Wenn ich anfange zu spielen, setze ich den Status auf GST_STATE_PLAYING.

Aber in der aus ich bekam Fehler:

ERROR from element mpegvparse0: No valid frames found before end of stream 

Ich habe versucht, eine Größe von char * buffer zu ändern, verwenden Sie unterschiedliche Elemente in der Pipeline (zB ffmpegcolorspace, videconvert, einige andere), aber dieses Problem nicht behoben .

Wenn mit GST_DEBUG laufen = 3, ich habe eine Menge Warnungen

0:00:00.064480642 4059  0x12c66d0 WARN codecparsers_mpegvideo gstmpegvideoparser.c:887:gst_mpeg_video_packet_parse_picture_header: Unsupported picture type : 0 

Ich benutze GStreamer 1.0. Hat jemand mit einem solchen Problem konfrontiert?

P.S. Ich habe keine Möglichkeit, Daten aus einer Datei mit Gstreamer zu lesen. Ich kann nur Puffer aus der Datei mit fread lesen und dann versuchen, sie zu spielen. Vielleicht muss ich eine bestimmte feste Größe des eingelesenen Puffers setzen?

+0

Haben Sie [this] (https://cgit.freedesktop.org/gstreamer/gst-plugins-base/tree/tests/examples/app/appsrc_ex.c) als Beispiel verwendet? Wie wurde dieses Eos erschaffen? (Ich meine das Ende des Streams - wer hat das erschaffen, machst du das irgendwie)? Meine Vermutung ist, dass Sie den Puffer nach EOS drücken .. sehen Sie irgendwelche Warnungen diesbezüglich (laufen mit 'GST_DEBUG = 3./Your_app') – nayana

+0

Warum '' 'gst_element_set_state (Verbraucher, GST_STATE_NULL);' ''? Wann stellen Sie es auf '' 'GST_STATE_PLAYING' ''? Wir benötigen wahrscheinlich ein vollständigeres Code-Snippet. Wenn Sie ffmpegcolorspace aufrufen, wird mir angezeigt, dass Sie gstreamer-0.10 verwenden, das seit Jahren nicht mehr aktualisiert wurde. Bitte erwägen Sie den Wechsel zu 1.X speziell für neuen Code. – ensonic

+0

@otopolsky Nein, verwendet https://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/section-data-spoof.html Beispiel, aber sie sind fast ähnlich. Ich schiebe EOS in den Puffer, wenn alle Daten bereits gepusht sind. Ich habe den Fragetext aktualisiert. Wenn mit GST_DEBUG laufen = 3, erhalte ich eine Menge codecparsers_mpegvideo gstmpegvideoparser.c: 887: gst_mpeg_video_packet_parse_picture_header: Nicht unterstützter Bildtyp: 0 –

Antwort

1

Ich löste dieses Problem. Unerwarteterweise war es bei der Erstellung des GstBuffer.

korrekte Art und Weise solche Puffer von Daten (char *) mit bekannter Größe ist

GstBuffer * buffer = gst_buffer_new_allocate(NULL, size, NULL); 
    gst_buffer_fill(m_dataBufferProducer, 0, data, size); 

Vielen Dank für Ihre Hilfe zu schaffen!