bonjour à tous,
j'ai un prbm lors de l'utilisation le la classe FrameAccess pour lire un video,
une exeption est elevé:
javax.media.NoProcessorException: Cannot find a Processor for: C:\test.avi
je ne sais pas si c'est à cause du type de compression ou quoi...
merci pour votre reponse
voici mon code:



Code :
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
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
 
 
/*
 * @(#)FrameAccess.java    1.5 01/03/13
 *
 * Copyright (c) 1999-2001 Sun Microsystems, Inc. All Rights Reserved.
 *
 * Sun grants you ("Licensee") a non-exclusive, royalty free, license to use,
 * modify and redistribute this software in source and binary code form,
 * provided that i) this copyright notice and license appear on all copies of
 * the software; and ii) Licensee does not utilize the software in a manner
 * which is disparaging to Sun.
 *
 * This software is provided "AS IS," without a warranty of any kind. ALL
 * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
 * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
 * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
 * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
 * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
 * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
 * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
 * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
 * OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGES.
 *
 * This software is not designed or intended for use in on-line control of
 * aircraft, air traffic, aircraft navigation or aircraft communications; or in
 * the design, construction, operation or tenance of any nuclear
 * facility. Licensee represents and warrants that it will not use or
 * redistribute the Software for such purposes.
 */
 
import java.awt.*;
import javax.media.*;
import javax.media.control.TrackControl;
import javax.media.Format;
import javax.media.format.*;
 
 
/**
 * Sample program to access individual video frames by using a 
 * "pass-thru" codec.  The codec is inserted into the data flow
 * path.  As data pass through this codec, a callback is invoked
 * for each frame of video data.
 */
public class FrameAccess extends Frame implements ControllerListener {
 
    Processor p;
    Object waitSync = new Object();
    boolean stateTransitionOK = true;
 
 
    /**
     * Given a media locator, create a processor and use that processor
     * as a player to playback the media.
     *
     * During the processor's Configured state, two "pass-thru" codecs,
     * PreAccessCodec and PostAccessCodec, are set on the video track.  
     * These codecs are used to get access to individual video frames 
     * of the media.
     *
     * Much of the code is just standard code to present media in JMF.
     */
    public boolean open(MediaLocator ml) {
 
    try {
        p = Manager.createProcessor(ml);
    } catch (Exception e) {
        System.err.println("Failed to create a processor from the given url: " + e);
        return false;
    }
 
    p.addControllerListener(this);
 
    // Put the Processor into configured state.
    p.configure();
    if (!waitForState(p.Configured)) {
        System.err.println("Failed to configure the processor.");
        return false;
    }
 
    // So I can use it as a player.
    p.setContentDescriptor(null);
 
    // Obtain the track controls.
    TrackControl tc[] = p.getTrackControls();
 
    if (tc == null) {
        System.err.println("Failed to obtain track controls from the processor.");
        return false;
    }
 
    // Search for the track control for the video track.
    TrackControl videoTrack = null;
 
    for (int i = 0; i < tc.length; i++) {
        if (tc[i].getFormat() instanceof VideoFormat) {
        videoTrack = tc[i];
        break;
        }
    }
 
    if (videoTrack == null) {
        System.err.println("The input media does not contain a video track.");
        return false;
    }
 
    System.err.println("Video format: " + videoTrack.getFormat());
 
    // Instantiate and set the frame access codec to the data flow path.
    try {
        Codec codec[] = { new PreAccessCodec(),
                new PostAccessCodec()};
        videoTrack.setCodecChain(codec);
    } catch (UnsupportedPlugInException e) {
        System.err.println("The process does not support effects.");
    }
 
    // Realize the processor.
    p.prefetch();
    if (!waitForState(p.Prefetched)) {
        System.err.println("Failed to realize the processor.");
        return false;
    }
 
    // Display the visual & control component if there's one.
 
    setLayout(new BorderLayout());
 
    Component cc;
 
    Component vc;
    if ((vc = p.getVisualComponent()) != null) {
        add("Center", vc);
    }
 
    if ((cc = p.getControlPanelComponent()) != null) {
        add("South", cc);
    }
 
    // Start the processor.
    p.start();
 
    setVisible(true);
 
    return true;
    }
 
    public void addNotify() {
    super.addNotify();
    pack();
    }
 
    /**
     * Block until the processor has transitioned to the given state.
     * Return false if the transition failed.
     */
    boolean waitForState(int state) {
    synchronized (waitSync) {
        try {
        while (p.getState() != state && stateTransitionOK)
            waitSync.wait();
        } catch (Exception e) {}
    }
    return stateTransitionOK;
    }
 
 
    /**
     * Controller Listener.
     */
    public void controllerUpdate(ControllerEvent evt) {
 
    if (evt instanceof ConfigureCompleteEvent ||
        evt instanceof RealizeCompleteEvent ||
        evt instanceof PrefetchCompleteEvent) {
        synchronized (waitSync) {
        stateTransitionOK = true;
        waitSync.notifyAll();
        }
    } else if (evt instanceof ResourceUnavailableEvent) {
        synchronized (waitSync) {
        stateTransitionOK = false;
        waitSync.notifyAll();
        }
    } else if (evt instanceof EndOfMediaEvent) {
        p.close();
        System.exit(0);
    }
    }
 
 
 
    /**
     * Main program
     */
    public static void main(String [] args) {
 
    /*if (args.length == 0) {
        prUsage();
        System.exit(0);
     }*/
 
    String url = new String("C:\\test.avi");
 
    if (url.indexOf(":") < 0) {
        prUsage();
        System.exit(0);
    }
 
    MediaLocator ml;
 
    if ((ml = new MediaLocator(url)) == null) {
        System.err.println("Cannot build media locator from: " + url);
        System.exit(0);
    }
 
    FrameAccess fa = new FrameAccess();
 
    if (!fa.open(ml))
        System.exit(0);
    }
 
    static void prUsage() {
    System.err.println("Usage: java FrameAccess <url>");
    }
 
 
 
    /*********************************************************
     * Inner class.
     *
     * A pass-through codec to access to individual frames.
     *********************************************************/
 
    public class PreAccessCodec implements Codec {
 
    /**
         * Callback to access individual video frames.
         */
    void accessFrame(Buffer frame) {
 
        // For demo, we'll just print out the frame #, time &
        // data length.
 
        long t = (long)(frame.getTimeStamp()/10000000f);
 
        System.err.println("Pre: frame #: " + frame.getSequenceNumber() + 
            ", time: " + ((float)t)/100f + 
            ", len: " + frame.getLength());
    }
 
 
    /**
      * The code for a pass through codec.
     */
 
    // We'll advertize as supporting all video formats.
    protected Format supportedIns[] = new Format [] {
        new VideoFormat(null)
    };
 
    // We'll advertize as supporting all video formats.
    protected Format supportedOuts[] = new Format [] {
        new VideoFormat(null)
    };
 
    Format input = null, output = null;
 
    public String getName() {
        return "Pre-Access Codec";
    }
 
    // No op.
        public void open() {
    }
 
    // No op.
    public void close() {
    }
 
    // No op.
    public void reset() {
    }
 
    public Format [] getSupportedInputFormats() {
        return supportedIns;
    }
 
    public Format [] getSupportedOutputFormats(Format in) {
        if (in == null)
        return supportedOuts;
        else {
        // If an input format is given, we use that input format
        // as the output since we are not modifying the bit stream
        // at all.
        Format outs[] = new Format[1];
        outs[0] = in;
        return outs;
        }
    }
 
    public Format setInputFormat(Format format) {
        input = format;
        return input;
    }
 
    public Format setOutputFormat(Format format) {
        output = format;
        return output;
    }
 
    public int process(Buffer in, Buffer out) {
 
        // This is the "Callback" to access individual frames.
        accessFrame(in);
 
        // Swap the data between the input & output.
        Object data = in.getData();
        in.setData(out.getData());
        out.setData(data);
 
        // Copy the input attributes to the output
        out.setFormat(in.getFormat());
        out.setLength(in.getLength());
        out.setOffset(in.getOffset());
 
        return BUFFER_PROCESSED_OK;
    }
 
    public Object[] getControls() {
        return new Object[0];
    }
 
    public Object getControl(String type) {
        return null;
    }
    }
 
    public class PostAccessCodec extends PreAccessCodec {
    // We'll advertize as supporting all video formats.
    public PostAccessCodec() {
        supportedIns = new Format [] {
        new RGBFormat()
        };
    }
 
    /**
         * Callback to access individual video frames.
         */
    void accessFrame(Buffer frame) {
 
        // For demo, we'll just print out the frame #, time &
        // data length.
 
        long t = (long)(frame.getTimeStamp()/10000000f);
 
        System.err.println("Post: frame #: " + frame.getSequenceNumber() + 
            ", time: " + ((float)t)/100f + 
            ", len: " + frame.getLength());
    }
 
    public String getName() {
        return "Post-Access Codec";
    }
    }
}