Bonsoir,
je suis en train de réaliser une petite application qui me permets d'écouter et d'enregistrer une station webradio
pour ce faire j'utilise la dll Directshow.net pour construire mon filtre d'enregistrement
J'utilise visualexpress 2010 pour programmer.
Je viens de constater le fait suivant
si je développe ma fonction de création du graph et son emploi dans une Form standard mon programme fonctionne correctement
Par contre si je le mets dans un programme wpf soit au niveau du xaml;cs où d'un fichier complémentaire cs.
j'ai systématiquement un message d'erreur m'indiquant que les objet s COM ne peuvent être contruits

Avez-vous rencontré le même pb et si oui comment le résoudre
A tire indicatif je fournis ma source

Source WPF
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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.IO;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
using DirectShowLib;
 
namespace lecteur_radios
{
    /// <summary>
    /// Logique d'interaction pour MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
 
       private int hr = 0;
 
       private IPin GetPin(IBaseFilter filter, string pinname)
        {
 
            IEnumPins epins;
            hr = filter.EnumPins(out epins);
 
            IntPtr fetched = Marshal.AllocCoTaskMem(4);
            IPin[] pins = new IPin[1];
            while (epins.Next(1, pins, fetched) == 0)
            {
                PinInfo pinfo;
                pins[0].QueryPinInfo(out pinfo);
                bool found = (pinfo.name == pinname);
                DsUtils.FreePinInfo(pinfo);
                if (found)
                {
                    return pins[0];
                }
 
 
            }
            return null;
        }
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            mediaElement1.Source = new Uri("mms://vipnrj.yacast.net/encodernostalgie");
            image1.Source = new BitmapImage(new Uri("pack://application:,,,/bin/Debug/Nostalgie.png"));
        }
 
        private void button2_Click(object sender, RoutedEventArgs e)
        {
 
    // création du ficher destinataire 
 
            string repertoire = "C:\\Documents and Settings\\michel\\Mes documents\\Ma musique\\EnregistrementsWebRadios";
 
 
 
            DateTime date = DateTime.Now;
            string dateString = String.Format("{0:yyyy_MM_dd_hhmms}", date);
            string fichier = repertoire + "\\" + dateString + "_Nostalgie" + ".mp3";
           LancerEnregistrement("mms://vipnrj.yacast.net/encodernostalgie", fichier);
 
 
        }
       private void LancerEnregistrement(string urlStation, string pathFichier)
        {
            IGraphBuilder pGraph = (IGraphBuilder)new FilterGraph();
 
            BuildGraph(pGraph, urlStation, pathFichier);
            IMediaControl mediaControl = (IMediaControl)pGraph;
            IMediaEvent mediaEvent = (IMediaEvent)pGraph;
            hr = mediaControl.Run();
 
 
 
        }
 
 
       private void BuildGraph(IGraphBuilder pGraph, string urlStation, string fichierSortie)
        {
 
 
            Guid CLSID_WindowsMediaSourceFilter = new Guid("{6B6D0800-9ADA-11d0-A520-00A0D10129C0}");
            Guid CLSID_LameAudioEncoder = new Guid("{B8D27088-FF5F-4B7C-98DC-0E91A1696286}");
            Guid CLSID_WMAudiodecoderDMO = new Guid("{94297043-BD82-4DFD-B0DE-8177739C6D20}");
 
 
 
            IBaseFilter pWindowsMediaSourceFilter = (IBaseFilter)Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID_WindowsMediaSourceFilter));
            IBaseFilter pLameAudioEncoder = (IBaseFilter)Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID_LameAudioEncoder));
            IBaseFilter pFilterwrite = (IBaseFilter)new FileWriter();
 
            // création du graph et de son interface
 
 
 
 
 
            //Ajout des filtres au graph
            hr = pGraph.AddFilter(pWindowsMediaSourceFilter, "Windows Media Source Filter");
            hr = pGraph.AddFilter(pLameAudioEncoder, "Lame Audio Encoder");
            hr = pGraph.AddFilter(pFilterwrite, "Filter Write");
 
            IFileSinkFilter pFilterWrite_sink = pFilterwrite as IFileSinkFilter;
 
 
 
 
            hr = pFilterWrite_sink.SetFileName(fichierSortie, null);
 
            // paramétrage de l'entée url vie l'interface IFileSourceFilter 
            IFileSourceFilter pWindowsMediaSourceFilter_src = (IFileSourceFilter)pWindowsMediaSourceFilter;
            hr = pWindowsMediaSourceFilter_src.Load(urlStation, null);
 
 
            //contruction du graph en automatique
 
            hr = pGraph.Render(GetPin(pWindowsMediaSourceFilter, "Stream 1"));
            IMediaControl control = (IMediaControl)pGraph;
 
 
 
        }
 
 
        private void Grid_Loaded(object sender, RoutedEventArgs e)
        {
 
            // mettre les actions de contrôles et de création des répertoires et copie des dataform
 
 
 
        }
 
 
 
 
 
    }
    public class PersonConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            Double p = System.Convert.ToDouble(value);
            if (p == double.NaN) return null;
 
            return p/10;
        }
 
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        { throw new NotImplementedException(); }
    }
 
 
}
Source form cs
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
 
 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DirectShowLib;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
 
namespace lecteur_radio_2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
         private IPin GetPin(IBaseFilter filter, string pinname)
        {
 
            IEnumPins epins;
            int hr = filter.EnumPins(out epins);
 
            IntPtr fetched = Marshal.AllocCoTaskMem(4);
            IPin[] pins = new IPin[1];
            while (epins.Next(1, pins, fetched) == 0)
            {
                PinInfo pinfo;
                pins[0].QueryPinInfo(out pinfo);
                bool found = (pinfo.name == pinname);
                DsUtils.FreePinInfo(pinfo);
                if (found)
                {
                    return pins[0];
                }
 
 
            }
            return null;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            int hr = 10;
 
            Guid CLSID_WindowsMediaSourceFilter = new Guid("{6B6D0800-9ADA-11d0-A520-00A0D10129C0}");
            Guid CLSID_LameAudioEncoder = new Guid("{B8D27088-FF5F-4B7C-98DC-0E91A1696286}");
            Guid CLSID_WMAudiodecoderDMO = new Guid("{94297043-BD82-4DFD-B0DE-8177739C6D20}");
 
 
 
            IBaseFilter pWindowsMediaSourceFilter = (IBaseFilter)Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID_WindowsMediaSourceFilter));
            IBaseFilter pLameAudioEncoder = (IBaseFilter)Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID_LameAudioEncoder));
            IBaseFilter pWMAudiodecoderDMO = (IBaseFilter)Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID_WMAudiodecoderDMO));
            IBaseFilter pFilterwrite = (IBaseFilter)new FileWriter();
 
            // création du graph et de son interface
            IGraphBuilder pgraph =(IGraphBuilder) new FilterGraph();
 
 
 
 
            //Ajout des filtres au graph
            hr = pgraph.AddFilter(pWindowsMediaSourceFilter, "Windows Media Source Filter");
            hr = pgraph.AddFilter(pLameAudioEncoder, "Lame Audio Encoder");
            hr = pgraph.AddFilter(pFilterwrite, "Filter Write");
 
            IFileSinkFilter pFilterWrite_sink = pFilterwrite as IFileSinkFilter;
 
            string repertoire = "C:\\Documents and Settings\\michel\\Mes documents\\Ma musique\\EnregistrementsWebRadios";
 
 
 
            DateTime date = DateTime.Now;
                string dateString = String.Format("{0:yyyy_MM_dd_hhmms}", date);
                string fichier =repertoire +"\\" + dateString +"_Nostalgie"+".mp3";
 
 
            hr = pFilterWrite_sink.SetFileName(fichier, null);
 
            // paramétrage de l'entée url vie l'interface IFileSourceFilter 
         IFileSourceFilter pWindowsMediaSourceFilter_src = (IFileSourceFilter)pWindowsMediaSourceFilter;
            hr = pWindowsMediaSourceFilter_src.Load("mms://vipnrj.yacast.net/encodernostalgie", null);
 
 
            //contruction du graph en automatique
 
            hr = pgraph.Render(GetPin(pWindowsMediaSourceFilter, "Stream 1"));
            IMediaControl control = (IMediaControl)pgraph;
            hr = control.Run();
 
 
        }
    }
}
par avance merci