Bonjour à tous je cherche à réaliser un petit lecteur multimedia a l'aide de Gstreamer en C.

Mon problème est que je dois différencier un flux audio d'un flux video/audio.

Mais je ne trouve pas comment faire !

Voila mon code pour le moment :

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
 
#include <gst/gst.h> 
#include <glib.h>
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");
 
  if(sinkpad==NULL){
     g_print("erreur Sinkpad Null\n");
  }	
 
  gst_pad_link (pad, sinkpad);
  gst_object_unref (sinkpad);
}
 
int main (int   argc,
          char *argv[])
{
  GMainLoop *loop;
 
  GstElement *pipeline, *source, *demuxer,*sink_video, *conv, *sink_audio, *queue_audio, *queue_video;
  GstBus *bus;
 
  /* Initialisation */
  gst_init (&argc, &argv);
 
 loop = g_main_loop_new (NULL, FALSE);
 
  /* Verification des arguments d'entree */
  if (argc != 2) {
    g_printerr ("Usage: %s <Multimedia File>\n", argv[0]);
    return -1;
  }
 
  /* Creation des elements gstreamer */
  pipeline      = gst_pipeline_new ("Video-player");
  source        = gst_element_factory_make ("filesrc",       "file-source");
  demuxer       = gst_element_factory_make ("decodebin",      "decodebin");
  conv          = gst_element_factory_make ("audioconvert",  "converter");
  sink_audio    = gst_element_factory_make ("autoaudiosink", "audio-output");
  sink_video    = gst_element_factory_make ("autovideosink", "video-output");
  queue_audio   = gst_element_factory_make ("queue",         "tampon-audio");
  queue_video   = gst_element_factory_make ("queue",         "tampon-video");
 
  if (!pipeline || !source || !demuxer || !conv || !sink_audio || !sink_video || !queue_audio || !queue_video) {
    g_printerr ("One element could not be created. Exiting.\n");
    return -1;
  }
 
  /* Mise en place du pipeline */
  /* on configurer le nom du fichier a*l'element source */
  g_object_set (G_OBJECT (source), "location", argv[1], NULL);
 
  /* on rajoute une gestion de messages */
  bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
  gst_bus_add_watch (bus, bus_call, loop);
  gst_object_unref (bus);
 
  /* on rajoute tous les elements dans le pipeline */
  gst_bin_add_many (GST_BIN (pipeline),
                    source, demuxer, queue_audio, conv, sink_audio, queue_video, sink_video, NULL);
 
  /* On relie les elements entre eux */
  gst_element_link (source, demuxer);
  gst_element_link_many (queue_audio, conv, sink_audio, NULL);
  gst_element_link_many (queue_video, sink_video, NULL);
  g_signal_connect (demuxer, "pad-added", G_CALLBACK (on_pad_added), queue_audio);
  g_signal_connect (demuxer, "pad-added", G_CALLBACK (on_pad_added), queue_video);
 
  /* Notez que le demuxer va etre lie au decodeur dynamiquement.
     la raison est que Ogg peut contenir plusieurs flux (par exemple
     audio et video). Les connecteurs sources seront crees quand la
     lecture debutera, par le demuxer quand il detectera le nombre et
     la nature des flux. Donc nous connectons une fonction de rappel
     qui sera execute quand le "pad-added" sera emis. */
 
  /* passage a l'etat "playing" du pipeline */
  g_print ("Lecture de : %s\n", argv[1]);
  gst_element_set_state (pipeline, GST_STATE_PLAYING);
 
  /* Iteration */
  g_print ("En cours...\n");
  g_main_loop_run (loop);
 
  /* En dehors de la boucle principale, on nettoie proprement */
  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;
} 
 
 
//gcc -Wall lecteuraudio.c -o lecteuraudio $(pkg-config --cflags --libs gstreamer-0.10)