tutorials.de Buch-Aktion 02/2012
ERLEDIGT
JA
ANTWORTEN
2
ZUGRIFFE
1434
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Rodio Rodio ist offline Rookie
    Registriert seit
    Jul 2010
    Beiträge
    5
    Hallo zusammen!

    Ich schreibe derzeit einen kleinen MP3-Player und verwende dazu JLayer von javazoom.net.

    Das Abspielen einer MP3 funktioniert perfekt, wenn ich allerdings nach einer MP3 eine weitere aufrufe, wird dieser "Aufruf" ignoriert und somit nichts abgespielt.

    Erwähnenswert ist evtl. noch, dass die MP3s aus dem Internet "gestreamt" werden, siehe AsynchronousBufferedInputStreamWrapper.java.

    So, hier mal mein Code:

    Klasse MP3Player.java
    Code java:
    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
    
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
     
    /**
     *
     * @author Christoph
     */
     
    import java.net.URL;
    import javazoom.jl.player.*;
     
     
    public class MP3Player
    {
        boolean debug = true;
        MP3Thread thread = null;
        Player player;
        AsynchronousBufferedInputStreamWrapper w;
     
        public MP3Player ()
        {
            if (debug)
                System.out.println ("MP3Player: Konstruktor");
        }
     
        public void play (String url)
        {
            if (thread != null)
            {
                stop ();
            }
            
            if (thread == null)
            {
                try
                {
                    w= new AsynchronousBufferedInputStreamWrapper(new URL(url).openStream(), 10 * 96 * 1024);
                    player = new Player (w);
     
                    thread = new MP3Thread(player);
                    thread.start();
                }
                catch (Exception e)
                {
                    System.out.println ("ERROR: MP3Player: play ="+e);
                }
            }
        }
     
        public void pause ()
        {
            
        }
     
        public void stop ()
        {
            try
            {
                w.close();
                player.close ();
            }
            catch (Exception e)
            {
                System.out.println ("ERROR: MP3Player: stop ="+e);
            }
        }
     
        public int getPosition ()
        {
            return 0;
        }
    }
     
    /*******************************************************/
    /***********************MP3THREAD***********************/
    /*******************************************************/
     
    class MP3Thread extends Thread
    {
        private volatile Player player;
        
        MP3Thread (Player player)
        {
            this.player = player;
        }
     
        @Override
        public void run ()
        {
            try
            {
                player.play();
            }
            catch (Exception e)
            {
                System.out.println ("ERROR: MP3Thread run = "+e);
            }
        }
    }

    Klasse AsynchronousBufferedInputStreamWrapper.java

    Code java:
    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
    
    /*
     * Copyright (c)  2008  Johannes Schüth.
     * This file is part of SNPlayer
     *
     * SNPlayer is free software: you can redistribute it and/or modify
     * it under the terms of the GNU General Public License as published by
     * the Free Software Foundation, either version 3 of the License, or
     * (at your option) any later version.
     *
     * SNPlayer is distributed in the hope that it will be useful,
     * but WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     * GNU General Public License for more details.
     *
     * You should have received a copy of the GNU General Public License
     * along with SNPlayer.  If not, see <http://www.gnu.org/licenses/>.
     */
     
     
    import java.io.BufferedInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.concurrent.ConcurrentLinkedQueue;
    import java.util.concurrent.TimeUnit;
     
    public class AsynchronousBufferedInputStreamWrapper extends InputStream {
     
        Thread thread;
        BufferingThread buffering;
     
        public AsynchronousBufferedInputStreamWrapper(InputStream inputStream,
                int bufferSizeInBytes) {
     
            buffering = new BufferingThread(this, new BufferedInputStream(
                    inputStream, bufferSizeInBytes), bufferSizeInBytes);
        }
     
        public float getBufferLevel() {
            return buffering.getBufferLevel();
        }
     
        public void startBuffering() {
            System.out.println("Buffering started");
            thread = new Thread(buffering);
            thread.start();
        }
     
        @Override
        public synchronized void reset() throws IOException {
            System.out.println("Reset Called");
        }
     
        @Override
        public int read() throws IOException {
     
            if (this.thread == null) {
                System.out.println("MANUAL OVERRIDE!");
                startBuffering();
            }
            waitForCurrentByteBuffer();
            if (reachedEndOfStream()) {
                return -1;
            }
     
            byte b = buffering.currentByteBuffer[buffering.currentBufferPosition];
            buffering.currentBufferPosition++;
            buffering.overallBytesConsumed++;
            return b & 0xFF;
        }
     
        private boolean reachedEndOfStream() {
            return buffering.overallBytesConsumed == buffering.overallBytesBuffered;
        }
     
        private void waitForCurrentByteBuffer() {
            if (buffering.currentByteBuffer == null
                    || buffering.currentBufferPosition > buffering.currentByteBuffer.length - 1) {
                buffering.currentByteBuffer = null;
                while (buffering.currentByteBuffer == null && !reachedEndOfStream()) {
                    // System.out.println("Getting Queue element");
                    buffering.currentByteBuffer = buffering.dataQueue.poll();
                    buffering.currentBufferPosition = 0;
                    try {
                        TimeUnit.MILLISECONDS.sleep(5L);
                    } catch (InterruptedException e) {
                        System.out.println(e);
                    }
                }
            }
        }
     
        @Override
        public void close() throws IOException {
            super.close();
            this.thread.stop();
        }
    }
     
    class BufferingThread implements Runnable {
     
        AsynchronousBufferedInputStreamWrapper reference;
     
        public static final int DEFAULT_BUFFER_SEGMENTSIZE = 128 * 1024;
        volatile boolean eof = false;
     
        volatile BufferedInputStream wrappedInputStream;
        volatile ConcurrentLinkedQueue<byte[]> dataQueue;
        int maxDataQueueSize;
        volatile int overallBytesConsumed = 0;
        int currentBufferPosition;
     
        volatile int totalBufferSizeInBytes;
        volatile int bufferSizeInBytes;
        volatile int overallBytesBuffered;
        int lastCurrentBytesBuffered;
        int currentBytesBuffered;
        byte[] currentByteBuffer;
     
        public BufferingThread(AsynchronousBufferedInputStreamWrapper reference,
                BufferedInputStream wrappedInputStream, int totalBufferSizeInBytes) {
     
            this.reference = reference;
            this.wrappedInputStream = wrappedInputStream;
            this.dataQueue = new ConcurrentLinkedQueue<byte[]>();
     
            this.totalBufferSizeInBytes = totalBufferSizeInBytes;
            this.maxDataQueueSize = totalBufferSizeInBytes
                    / DEFAULT_BUFFER_SEGMENTSIZE;
            this.bufferSizeInBytes = DEFAULT_BUFFER_SEGMENTSIZE;
     
            System.out.println("totalBufferSizeInBytes: " + totalBufferSizeInBytes);
            System.out.println("maxDataQueueSize: " + maxDataQueueSize);
            System.out.println("bufferSizeInBytes: " + bufferSizeInBytes);
     
        }
     
        public float getBufferLevel() {
            System.out.println("overallBytesBuffered: " + overallBytesBuffered);
            System.out.println("overallBytesConsumed: " + overallBytesConsumed);
            System.out.println("dataQueue.size(): " + dataQueue.size());
            System.out.println("totalBufferSizeInBytes: " + totalBufferSizeInBytes);
            if (overallBytesBuffered == 0
                    || (overallBytesBuffered == overallBytesConsumed)) {
                return 0;
            }
     
            return (((float) overallBytesConsumed / (float) overallBytesBuffered) - 1)
                    * -1;
     
        }
     
        public void run() {
     
            currentBytesBuffered = overallBytesBuffered - overallBytesConsumed;
     
            while (!eof) {
     
                try {
     
                    // check if buffer is not full
                    if (dataQueue.size() < maxDataQueueSize) {
     
                        // System.out.println("Buffering...");
                        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
     
                        // check if buffer is not full
                        while (currentBytesBuffered < bufferSizeInBytes) {
                            byte[] buffer = new byte[bufferSizeInBytes];
                            int bytesRead = wrappedInputStream.read(buffer);
     
                            if (bytesRead == -1) {
                                // EOF
                                System.out.println("EOF");
                                wrappedInputStream.close();
                                eof = true;
                                break;
                            }
     
                            // writing bytes to os
                            byteArrayOutputStream.write(buffer, 0, bytesRead);
                            overallBytesBuffered += bytesRead;
     
                            currentBytesBuffered = overallBytesBuffered
                                    - overallBytesConsumed;
     
                        }
     
                        if (!eof) {
                            // Adding byte array to queue
                            dataQueue.add(byteArrayOutputStream.toByteArray());
                            currentBytesBuffered = 0;
                        }
     
                    } else {
                        TimeUnit.MILLISECONDS.sleep(4L);
                    }
                } catch (Exception e) {
                    System.out.println(e);
                }
            }
     
            System.out.println("Finished Buffering");
        }
    }

    Aufrufsyntax:

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
                    MP3Player mp3player = new MP3Player ();
            //gui = new Gui (wg, db, mp3player);
                    try
                    {
                        mp3player.play("url zur musik (muss mp3 sein)");
     
                        Thread.sleep (2000);
                        mp3player.stop ();
                        mp3player = null;
                        mp3player = new MP3Player ();
                        Thread.sleep (5000);
                        mp3player.play ("url zur musik (muss mp3 sein)");
                    }
                    catch (Exception e)
                    {
                        System.out.println (e);
                    }


    So. Nun zur Frage:

    Weiß jemand woran es liegt, dass immer nur eine MP3 Datei abgespielt werden kann?

    Ich bin natürlich selbst schon stundenlang auf Fehlersuche gegangen, allerdings ohne Erfolg.

    Allerdings war eines auffällig:
    Ich habe mir die Klasse Player oder AdvancedPlayer mal angeschaut.

    Klasse AdvancedPlayer.java:

    Code java:
    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
    
    /*
     * 11/19/04     1.0 moved to LGPL. 
     *-----------------------------------------------------------------------
     *   This program is free software; you can redistribute it and/or modify
     *   it under the terms of the GNU Library General Public License as published
     *   by the Free Software Foundation; either version 2 of the License, or
     *   (at your option) any later version.
     *
     *   This program is distributed in the hope that it will be useful,
     *   but WITHOUT ANY WARRANTY; without even the implied warranty of
     *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     *   GNU Library General Public License for more details.
     *
     *   You should have received a copy of the GNU Library General Public
     *   License along with this program; if not, write to the Free Software
     *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
     *----------------------------------------------------------------------
     */
     
    package javazoom.jl.player.advanced;
     
    import java.io.InputStream;
     
    import javazoom.jl.decoder.Bitstream;
    import javazoom.jl.decoder.BitstreamException;
    import javazoom.jl.decoder.Decoder;
    import javazoom.jl.decoder.Header;
    import javazoom.jl.decoder.JavaLayerException;
    import javazoom.jl.decoder.SampleBuffer;
    import javazoom.jl.player.AudioDevice;
    import javazoom.jl.player.FactoryRegistry;
     
    /**
     * a hybrid of javazoom.jl.player.Player tweeked to include <code>play(startFrame, endFrame)</code>
     * hopefully this will be included in the api
     */
    public class AdvancedPlayer
    {
        /** The MPEG audio bitstream.*/
        private Bitstream bitstream;
        /** The MPEG audio decoder. */
        private Decoder decoder;
        /** The AudioDevice the audio samples are written to. */
        private AudioDevice audio;
        /** Has the player been closed? */
        private boolean closed = false;
        /** Has the player played back all frames from the stream? */
        private boolean complete = false;
            private boolean playing = true;
        private int lastPosition = 0;
        /** Listener for the playback process */
        private PlaybackListener listener;
     
     
        /**
         * Creates a new <code>Player</code> instance.
         */
        public AdvancedPlayer(InputStream stream) throws JavaLayerException
        {
            this(stream, null);
        }
     
        public AdvancedPlayer(InputStream stream, AudioDevice device) throws JavaLayerException
        {
            bitstream = new Bitstream(stream);
     
            if (device!=null) audio = device;
            else audio = FactoryRegistry.systemRegistry().createAudioDevice();
            audio.open(decoder = new Decoder());
        }
     
        public void play() throws JavaLayerException
        {
            play(Integer.MAX_VALUE);
        }
     
            public void pause () throws JavaLayerException
            {
                playing = !playing;
            }
     
        /**
         * Plays a number of MPEG audio frames.
         *
         * @param frames    The number of frames to play.
         * @return  true if the last frame was played, or false if there are
         *          more frames.
         */
        public boolean play(int frames) throws JavaLayerException
        {
            boolean ret = true;
     
            // report to listener
            if(listener != null) listener.playbackStarted(createEvent(PlaybackEvent.STARTED));
     
            while (frames-- > 0 && ret)
            {
                        if (playing)
                        {
                ret = decodeFrame();
                        }
                        else
                        {
                            try
                            {
                                Thread.sleep (10);
                            }
                            catch (Exception e)
                            {
                                
                            }
                        }
            }
     
    //      if (!ret)
            {
                // last frame, ensure all data flushed to the audio device.
                AudioDevice out = audio;
                if (out != null)
                {
    //              System.out.println(audio.getPosition());
                    out.flush();
    //              System.out.println(audio.getPosition());
                    synchronized (this)
                    {
                        complete = (!closed);
                        close();
                    }
     
                    // report to listener
                    if(listener != null) listener.playbackFinished(createEvent(out, PlaybackEvent.STOPPED));
                }
            }
            return ret;
        }
     
        /**
         * Cloases this player. Any audio currently playing is stopped
         * immediately.
         */
        public synchronized void close()
        {
            AudioDevice out = audio;
            if (out != null)
            {
                closed = true;
                audio = null;
                // this may fail, so ensure object state is set up before
                // calling this method.
                out.close();
                lastPosition = out.getPosition();
                try
                {
                    bitstream.close();
                }
                catch (BitstreamException ex)
                {}
            }
        }
     
        /**
         * Decodes a single frame.
         *
         * @return true if there are no more frames to decode, false otherwise.
         */
        protected boolean decodeFrame() throws JavaLayerException
        {
            try
            {
                AudioDevice out = audio;
                if (out == null) return false;
     
                Header h = bitstream.readFrame();
                if (h == null) return false;
     
                // sample buffer set when decoder constructed
                SampleBuffer output = (SampleBuffer) decoder.decodeFrame(h, bitstream);
     
                synchronized (this)
                {
                    out = audio;
                    if(out != null)
                    {
                        out.write(output.getBuffer(), 0, output.getBufferLength());
                    }
                }
     
                bitstream.closeFrame();
            }
            catch (RuntimeException ex)
            {
                throw new JavaLayerException("Exception decoding audio frame", ex);
            }
            return true;
        }
     
        /**
         * skips over a single frame
         * @return false    if there are no more frames to decode, true otherwise.
         */
        protected boolean skipFrame() throws JavaLayerException
        {
            Header h = bitstream.readFrame();
            if (h == null) return false;
            bitstream.closeFrame();
            return true;
        }
     
        /**
         * Plays a range of MPEG audio frames
         * @param start The first frame to play
         * @param end       The last frame to play
         * @return true if the last frame was played, or false if there are more frames.
         */
        public boolean play(final int start, final int end) throws JavaLayerException
        {
            boolean ret = true;
            int offset = start;
            while (offset-- > 0 && ret) ret = skipFrame();
            return play(end - start);
        }
     
        /**
         * Constructs a <code>PlaybackEvent</code>
         */
        private PlaybackEvent createEvent(int id)
        {
            return createEvent(audio, id);
        }
     
        /**
         * Constructs a <code>PlaybackEvent</code>
         */
        private PlaybackEvent createEvent(AudioDevice dev, int id)
        {
            return new PlaybackEvent(this, id, dev.getPosition());
        }
     
        /**
         * sets the <code>PlaybackListener</code>
         */
        public void setPlayBackListener(PlaybackListener listener)
        {
            this.listener = listener;
        }
     
        /**
         * gets the <code>PlaybackListener</code>
         */
        public PlaybackListener getPlayBackListener()
        {
            return listener;
        }
     
        /**
         * closes the player and notifies <code>PlaybackListener</code>
         */
        public void stop()
        {
            listener.playbackFinished(createEvent(PlaybackEvent.STOPPED));
            close();
        }
    }

    Beim 1. Aufruf einer MP3 meldet decodeFrame () immer "true" zurück, beim 2. immer false.

    Das false tritt wegen
    Code java:
    1
    
    if (out == null) return false;
    in der decodeFrame() Funktion auf.

    Hoffentlich kann mir ein Java Experte helfen :bahnhof:

    Gruß

    Rodi

    Edit: Alternativen für Javazoom sind natürlich auch gern gesehen.
    Edit 2: Problem tritt nur bei Verwendung des AsynchronousBufferedInputStreamWrapper auf
    Geändert von Rodio (15.07.10 um 12:35 Uhr)
     

  2. #2
    Steiner_B Steiner_B ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Ort
    Wien
    Beiträge
    573
    Ich habe JavaZoom bis jetzt nur mit Files verwendet, aber da war das kein Problem. Versuch mal .close aufzurufen bevor du einen neuen Player erstellst, vielleicht hilft das.
     

  3. #3
    Rodio Rodio ist offline Rookie
    Registriert seit
    Jul 2010
    Beiträge
    5
    Zitat Zitat von Steiner_B Beitrag anzeigen
    Ich habe JavaZoom bis jetzt nur mit Files verwendet, aber da war das kein Problem. Versuch mal .close aufzurufen bevor du einen neuen Player erstellst, vielleicht hilft das.
    Hi!

    Das habe ich bereits schon gemacht. Aber dein Einwurf gab mir den LÖSENDEN Denkanstoß, deshalb vielen vielen Dank

    Da es bestimmt viele interessiert, wie das Problem gelöst wurde:

    Der "Fehler" lag daran, dass neben dem Player und dem AsynchronBufferedInputStreamWrapper auch der Thread gestoppt und das Threadobjekt aufgelöst werden muss, bevor eine neue MP3 Datei abgespielt werden kann.

    Komischerweise muss man beim nächsten Auffruf eines Mp3 Streams erst ein wenig warten, bevor dieser abgespielt werden kann. D.h. im Thread muss vor dem "player.play" aufruf etwas gewartet werden.

    Hier die funktionierenden Klassen:

    AsynchronBufferedInputStreamWrapper (keine Änderung, siehe oben)

    MP3Player.java:
    Code java:
    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
    
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
     
    /**
     *
     * @author Christoph
     */
     
    import java.io.BufferedInputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.InputStream;
    import java.net.URL;
    import javazoom.jl.decoder.Bitstream;
    import javazoom.jl.player.*;
     
     
    public class MP3Player
    {
        boolean debug = true;
        MP3Thread thread = null;
        Player player;
        AsynchronousBufferedInputStreamWrapper w;
     
        public MP3Player ()
        {
            if (debug)
                System.out.println ("MP3Player: Konstruktor");
        }
     
        public void play (String url)
        {
            if (thread != null)
            {
                stop ();
            }
            
            if (thread == null)
            {
                try
                {
                    w= new AsynchronousBufferedInputStreamWrapper(new URL(url).openStream(), 10 * 96 * 1024);
                    player = new Player (w);
     
                    thread = new MP3Thread(player);
                    thread.start();
                }
                catch (Exception e)
                {
                    System.out.println ("ERROR: MP3Player: play ="+e);
                }
            }
        }
     
        public void play (InputStream is)
        {
            if (thread != null)
            {
                stop ();
            }
     
            if (thread == null)
            {
                try
                {
                    //w= new AsynchronousBufferedInputStreamWrapper(new URL(url).openStream(), 10 * 96 * 1024);
                    player = new Player (is);
     
                    thread = new MP3Thread(player);
                    thread.start();
                }
                catch (Exception e)
                {
                    System.out.println ("ERROR: MP3Player: play ="+e);
                }
            }
        }
        /*
        public void play ()
        {
            try
            {
                FileInputStream fis     = new FileInputStream(new URL (getClass().getResource("http://main.dance-tunes.com/idt/pk_site_api.request?p_message=%3Ctun_id%3E607900%3C%2Ftun_id%3E%3Ccmd%3Eget_preview%3C%2Fcmd%3E%3Csessie%3E1DZ0X1AXF7CDJR5667511854USB6QF%3C%2Fsessie%3E%3Csit_id%3E2%3C%2Fsit_id%3E%3Cuse_id%3E%3C%2Fuse_id%3E%3Cord_id%3E%3C%2Ford_id%3E%3Ctaal%3EENG%3C%2Ftaal%3E").getFile());
                BufferedInputStream bis = new BufferedInputStream(fis);
                player = new Player(bis);
                Bitstream bitstream = new Bitstream(bis);
                                thread = new MP3Thread(player);
                    thread.start();
            }
            catch (Exception e) {System.out.println (e);}
        }
        */
        public void pause ()
        {
            
        }
     
        public void stop ()
        {
            System.out.print ("MP3Player: stop()");
            try
            {
                if (w != null)
                {
                    w.close();          
                    System.out.print ("MP3Player: stop: w stopped");
                }
                if (player != null)
                {
                    player.close ();
                    System.out.print ("MP3Player: stop: player stopped");
                }
                if (thread != null)
                {
                    thread.stop ();
                    thread = null;
                    System.out.print ("MP3Player: stop: thread stopped");
                }
                System.out.println ();
            }
            catch (Exception e)
            {
                System.out.println ("ERROR: MP3Player: stop ="+e);
            }
        }
     
        public int getPosition ()
        {
            return player.getPosition();
        }
     
        public boolean getPlaying ()
        {
            return false;
        }
     
        public boolean getThreadActivity ()
        {
            if (thread != null)
                return true;
            else
                return false;
        }
    }
     
    /*******************************************************/
    /***********************MP3THREAD***********************/
    /*******************************************************/
     
    class MP3Thread extends Thread
    {
        private volatile Player player;
        private volatile boolean firstTime = true;
        
        MP3Thread (Player player)
        {
            this.player = player;
        }
     
        @Override
        public void run ()
        {
            if (firstTime)
            {
                try
                {
                    Thread.sleep (1000);
                    firstTime = false;
                }
                catch (Exception e)
                {
                    System.out.println ("ERROR: MP3Thread run = "+e);
                }
            }
            try
            {
                player.play();
            }
            catch (Exception e)
            {
                System.out.println ("ERROR: MP3Thread run = "+e);
            }
        }
    }

    Aufrufsyntax:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
                        if (mp3player.getThreadActivity ())
                        {
                            try
                            {
                                mp3player.stop ();
                            }
                            catch (Exception i)
                            {
                                System.out.println (i);
                            }
                        }
                        if (!mp3player.getThreadActivity())
                        {
                            try
                            {
                                mp3player.play(url zur mp3 als String);
                            }
                           catch (Exception e)
                           {
                                System.out.println (e);
                           }
                       }

    Ich hoffe, dass ich hiermit vielen verzeifelten Leuten helfen konnte.

    Gruß

    Rodi
     

Ähnliche Themen

  1. JLayer Problem
    Von dodlhuat im Forum Java
    Antworten: 6
    Letzter Beitrag: 28.08.09, 12:04
  2. swf Datei spielt nicht
    Von alaniarisss im Forum Flash Plattform
    Antworten: 23
    Letzter Beitrag: 14.07.04, 03:37
  3. WICHTIG - Spielt die Reihenfolge eine Rolle ?
    Von tantor im Forum VisualStudio & MFC
    Antworten: 2
    Letzter Beitrag: 04.06.04, 20:17
  4. Antworten: 2
    Letzter Beitrag: 01.02.04, 22:11
  5. Antworten: 5
    Letzter Beitrag: 19.07.01, 00:31