IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Multimédia Java Discussion :

[Video] [JMF] Lire un video image par image avec jmf


Sujet :

Multimédia Java

  1. #1
    Candidat au Club
    Inscrit en
    Avril 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut [Video] [JMF] Lire un video image par image avec jmf
    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";
        }
        }
    }

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 87
    Points : 89
    Points
    89
    Par défaut
    Oui je pense que c'est à cause de la compression, il est encodée en quel format ton avi?
    Tu peux le voir avec vlc en allant dans vue, informations sur le flux.
    jmf ne décode pas le divx, xvid et tous les nouveaux formats de compressions video de microsoft.
    JMF n'est plus maintenu depuis 2004.

    Tu peux voir ici les formats supportés par jmf : http://http://java.sun.com/products/...1/formats.html

    Actuellement, il n'existe pas vraiment d'alternative à JMF en Java pur, je sais qu'IBM avait travaillé sur un système un peu similaire.

    Une solution bien plus adaptée au multimédia reste un binding avec JNI.

  3. #3
    Candidat au Club
    Inscrit en
    Avril 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Oui vous avez raison il est encoder en div3 mais le prbm c'est que le meme video peut etre lu avec d'autre classe en utilisant les classes jmf comme LudoMediaPlayer et MediaPlayerDemo.tout ces classes disponible sur internet utilise les classe player de jmf. je pense que le prbm reste seul lors de l'utilisation de la classe processor

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/01/2010, 16h16
  2. Insérer une décomposition image par image avec base de temps en légende
    Par guifon1000 dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 2
    Dernier message: 09/06/2008, 10h07
  3. clip image par image en flash
    Par patrickdu26 dans le forum Flash
    Réponses: 3
    Dernier message: 07/12/2007, 20h36
  4. [FLASH 8] Image par Image automatique
    Par ArHacKnIdE dans le forum Flash
    Réponses: 24
    Dernier message: 13/12/2006, 23h16
  5. Affichage d'une image par JS avec Mozilla
    Par renaud26 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 16/08/2006, 15h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo