2016-07-28 42 views
3

Ich habe eine benutzerdefinierte GStreamer-Pipeline erstellt, die ich zum Abspielen von RTSP-Streams verwenden werde. Zur gleichen Zeit möchte ich eine neue GstPlayer erstellen, um diese Pipeline zu verwenden. Das Problem ist, dass es keine Möglichkeit gibt, die Pipeline GstPlayer zu setzen (die einzige verwandte Methode ist gst_player_get_pipeline(). Ich verstehe nicht, wie es keine Möglichkeit gibt, eine Pipeline für einen GstPlayer anzupassen. Das scheint so Basisfunktionalität, so muss ich etwas fehltWie setze ich eine GstPlayer-Pipeline?

Meine Pipeline.

GstElement *pipeline, *source, *filter, *sink; 

    // Create pipeline elements 
    pipeline = gst_pipeline_new ("vdi-pipeline"); 
    source = gst_element_factory_make ("rtspsrc", "vdi-source"); 
    filter = gst_element_factory_make ("decodebin", "vdi-filter"); 
    sink = gst_element_factory_make ("appsink", "vdi-sink"); 
    if (!source || !filter || !sink) 
    { 
    __android_log_print (ANDROID_LOG_ERROR, "Error", "A GstElement could not be created. Exiting."); 
    return; 
    } 

    // Add elements to pipeline 
    gst_bin_add_many (GST_BIN (pipeline), source, filter, sink, NULL); 

    // Link elements together 
    if (!gst_element_link_many (source, filter, sink, NULL)) { 
    __android_log_print (ANDROID_LOG_ERROR, "Warning", "Failed to link elements!"); 
    } 

Antwort

0

Aber man kann aus der Box .. rTSP über GstPlayer spielen warum Sie benutzerdefinierte Pipeline wollen der Spieler playbin verwendet? welche akzeptieren jede Art von URL .. und es wird Pipeline dynamisch erstellen, je nachdem was gespielt wird ..

Was ist mit dem Patchen des Players selbst, wenn Sie playbin wirklich nicht benutzen können? Ich denke nicht, dass es für benutzerdefinierte Pipelines gedacht ist. Aber Sie können es hacken here.

Sie werden dann die Newpads und andere Callback auf dem rtspsrc statt Playbin haken .. und andere Sachen - ich denke, Sie wollen das nicht.

Der andere Weg ist - wenn die playbin Pipeline-Konstrukte verwendet es rtspsrc innen - Sie dieses Element aus der Pipeline-Objekt erhalten und einige Parameter ändern .. aber wie das Ändern von Parametern während der Wiedergabe seien Sie vorsichtig ist sehr schwierig ..

UPDATE:

Hm Ich denke, ich überblicke die appsink irgendwie .. Nun, ich denke, Sie können playbin Eigenschaft audio-sink oder Video-Sink setzen, um es zu überschreiben, um Appsink zu verwenden.

Aber immer noch müssen Sie irgendwie das playbin Element aus dem GstPlayer holen oder den playbin Parameter bei der Initialisierung setzen (ich weiß nicht wie) - in diesem Fall würde ich auf IRC (freenode, #gstreamer) fragen, wenn Sie gehen die richtige Richtung.

Vielleicht besser wäre es, Ihre eigene Anwendung mit decodebin und oder sogar playbin zu erstellen und dort das appsink Element zu übergeben. Warum möchten Sie GstPlayer verwenden, wenn Sie nicht spielen, sondern Puffer verarbeiten?

HTH

+0

Ich sollte den Grund angegeben haben, brauche ich eine benutzerdefinierte Pipeline in der Frage. Ich versuche, einen Frame aus dem Live-Stream abzurufen, um ihn an anderer Stelle zu bearbeiten. Ich glaube, ich muss ein 'appsink'-Element als Senke in der Pipeline verwenden, dann, während das Video läuft, rufe 'gst_app_sink_pull_sample (appsink)' auf, um den aktuellen Frame zu bekommen, den ich dann verarbeiten kann (in meinem Fall will ich nur) um eine Bitmap zu erstellen). – MarkyDD

+0

@MarkyDD Update prüfen – nayana