Bonjour à tous!

Je débute avec Gstreamer en ligne de commande dans le terminal et également en langage C.
Je souhaiterais ajouter les sous-titres dans une video, mais je n'y parviens lorsque je le code.

Dans le terminal, la commande que j'utilise est la suivante (fonctionne):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
gst-launch-0.10 filesrc location = video.srt name=subfile ! subparse ! overlay. filesrc location=video.ogv ! oggdemux \ oggdemux0. ! queue ! theoradec ! subtitleoverlay name=overlay ! ffmpegcolorspace ! autovideosink \ oggdemux0. ! queue ! vorbisdec ! audioconvert ! autoaudiosink
En langage C, j'arrive uniquement à avoir la video et le son:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
 
//gcc -Wall lecteuraudiovideo.c -o lecteuraudiovideo $(pkg-config --cflags --libs gstreamer-0.10)
//gcc -Wall basic-tutorial-5.c -o basic-tutorial-5 $(pkg-config --cflags --libs gstreamer-0.10  gtk+-2.0)
//gcc basic-tutorial-5.c -o basic-tutorial-5 $(pkg-config --cflags --libs gstreamer-interfaces-0.10 gtk+-2.0 gstreamer-0.10)
//gcc lecteuraudiovideo.c -o lecteuraudiovideo $(pkg-config --cflags --libs gstreamer-interfaces-0.10 gtk+-2.0 gstreamer-0.10)
 
 
//`pkg-config --libs gtk+-2.0`
 
#include <string.h>
 
#include <gtk/gtk.h>
#include <gst/gst.h>
#include <gst/interfaces/xoverlay.h>
 
#include <gdk/gdk.h>
#if defined (GDK_WINDOWING_X11)
#include <gdk/gdkx.h>
#elif defined (GDK_WINDOWING_WIN32)
#include <gdk/gdkwin32.h>
#elif defined (GDK_WINDOWING_QUARTZ)
#include <gdk/gdkquartz.h>
#endif
 
static gboolean bus_call (GstBus     *bus,
                          GstMessage *msg,
                          gpointer    data)
{
  GMainLoop *loop = (GMainLoop *) data;
 
  switch (GST_MESSAGE_TYPE (msg)) {
 
   case GST_MESSAGE_EOS:
      g_print ("End of stream\n");
      g_main_loop_quit (loop);
      break;
    case GST_MESSAGE_ERROR: {
      gchar  *debug;
      GError *error;
 
      gst_message_parse_error (msg, &error, &debug);
      g_free (debug);
 
      g_printerr ("Error: %s\n", error->message);
      g_error_free (error);
 
      g_main_loop_quit (loop);
      break;
    }
    default:
      break;
  }
  return TRUE;
}
 
static void on_pad_added (GstElement *element,
              GstPad     *pad,
              gpointer    data)
{
  GstPad *sinkpad;
  GstElement *decoder = (GstElement *) data;
 
  /* We can now link this pad with the vorbis-decoder sink pad */
  g_print ("Dynamic pad created, linking demuxer/decoder\n");
 
  sinkpad = gst_element_get_static_pad (decoder, "sink");
 
  gst_pad_link (pad, sinkpad);
  gst_object_unref (sinkpad);
}
 
int main (int argc, char *argv[]) {
    GMainLoop *loop;
 
    GstElement *pipeline, *source, *subOverlay, *subParse, *subSource, *demuxer, *audioDecoder, *videoDecoder, *audioConv, *videoConv, *videosink, 
            *audiosink, *audioQueue, *videoQueue;
    GstBus *bus;
 
    gst_init (&argc, &argv);
 
    loop = g_main_loop_new (NULL, FALSE);
 
    if (argc < 2 && argc > 3) {
        g_printerr ("Usage: %s <Ogg/Vorbis filename> [Srt filename]\n", argv[0]);
        return -1;
    }
 
    pipeline     = gst_pipeline_new ("audiovideo-player");
    source       = gst_element_factory_make ("filesrc",          "file-source");
    demuxer      = gst_element_factory_make ("oggdemux",         "ogg-demuxer");
    audioQueue   = gst_element_factory_make ("queue",            "audio-queue");
    videoQueue   = gst_element_factory_make ("queue",            "video-queue");
    audioDecoder = gst_element_factory_make ("vorbisdec",        "vorbis-decoder");
    videoDecoder = gst_element_factory_make ("theoradec",        "theora-decoder");
    audioConv    = gst_element_factory_make ("audioconvert",     "audio-converter");
    videoConv    = gst_element_factory_make ("ffmpegcolorspace", "video-converter");
    videosink    = gst_element_factory_make ("autovideosink",    "video-output");
    audiosink    = gst_element_factory_make ("autoaudiosink",    "audio-output");
    subOverlay   = gst_element_factory_make ("subtitleoverlay",    "NULL");
    subParse     = gst_element_factory_make ("subparse",    "NULL");
    subSource    = gst_element_factory_make ("filesrc",    "file-source");
 
 
    if (!pipeline || !source || !demuxer || !audioDecoder || !audioConv || !videoDecoder || !videoConv || !audioQueue 
            || !videoQueue || !audiosink || !videosink) {
        g_printerr ("One element could not be created. Exiting.\n");
        exit(-1);
    }
 
    g_object_set (G_OBJECT (source), "location", argv[1], NULL);
 
    bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
    gst_bus_add_watch (bus, bus_call, loop);
    gst_object_unref (bus);
 
    gst_bin_add_many (GST_BIN (pipeline),
                        source, demuxer, 
                        audioQueue, videoQueue, audioDecoder, videoDecoder,
                        videoConv, audioConv, videosink, audiosink, NULL);
 
    gst_element_link (source, demuxer);
 
 
gst_element_link_many (videoQueue, videoDecoder, videoConv, subOverlay, videosink, NULL);
g_signal_connect (demuxer, "pad-added", G_CALLBACK (on_pad_added), videoQueue);
 
/* file-source -> ogg-demuxer ~> vorbis-decoder -> converter -> alsa-output */
gst_element_link_many (audioQueue, audioDecoder, audioConv, audiosink, NULL);
g_signal_connect (demuxer, "pad-added", G_CALLBACK (on_pad_added), audioQueue);
 
 
/* Linking subtitles and video pads together */
g_object_set (G_OBJECT (subSource), "location", argv[2], NULL);
 
gst_element_link (subSource, subParse);
 
if(gst_element_link_pads(subParse, NULL, subOverlay, NULL)) {
    g_printerr("Pads couldn't be linked\n");
}
 
 
 
    g_print ("Lecture de : %s\n", argv[1]);
    gst_element_set_state (pipeline, GST_STATE_PLAYING);
 
    g_print ("En cours...\n");
    g_main_loop_run (loop);
 
    g_print ("Arret de la lecture\n");
    gst_element_set_state (pipeline, GST_STATE_NULL);
    g_print ("Suppression du pipeline\n");
    gst_object_unref (GST_OBJECT (pipeline));
    return 0;
}
Ça me retourne cette erreur et la vidéo ne se lance pas:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
./lecteuraudiovideo video.ogv video.srt 
 
(lecteuraudiovideo:10384): GStreamer-WARNING **: Trying to connect elements that don't share a common ancestor: video-converter and NULL
 
(lecteuraudiovideo:10384): GStreamer-WARNING **: Trying to connect elements that don't share a common ancestor: video-converter and NULL
Pads couldn't be linked
Lecture de : video.ogv
En cours...
Dynamic pad created, linking demuxer/decoder
Dynamic pad created, linking demuxer/decoder
Dynamic pad created, linking demuxer/decoder
Dynamic pad created, linking demuxer/decoder
Dynamic pad created, linking demuxer/decoder
Dynamic pad created, linking demuxer/decoder
...
Vous avez des idées ou des explications, car je ne vois pas trop comment procéder... Merci!