Аудио на J2ME, я не знаю, где это не так? - PullRequest
2 голосов
/ 10 июля 2011

Я хочу сделать 2 задачи одновременно:

  • Воспроизведение аудиофайла.

  • Считать необработанные данные, чтобы что-то сделать

Вот мой код:

String wavPath = "file:///" + currentPath + fileName;
FileConnection fc;
try {
    fc = (FileConnection) Connector.open( wavPath );

    if ( !fc.exists() ) {
        throw new IOException( "File does not exists." );
    }

    InputStream is = fc.openInputStream();
    // to do something with raw data as print samples of it

    Player player = Manager.createPlayer( wavPath );
    player.realize();
    player.prefetch();
    player.start();
} catch ( IOException e1 ) {
    e1.printStackTrace();
}

Но ничего не запускается, аудиофайл не запускается. Если я уберу строку:

InputStream is = fc.openInputStream();

Аудио файл работает очень хорошо. Но я хочу сделать 2 задачи одновременно, я не знаю, как это сделать. Кто-нибудь может мне помочь?

Я попытался использовать поток 2, но он все еще не работает, аудиофайл запущен (поток 1), но поток 2 не запущен:

new Thread( new Runnable() {
    public void run() {
        try {
            Manager.createPlayer( "file:///E:/" + fileName ).start();
        } catch ( MediaException e ) {
            e.printStackTrace();
        } catch ( IOException e ) {
            e.printStackTrace();
        }
    }
}).start();

new Thread( new Runnable() {
    public void run() {
        FileConnection fc;
        try {
            fc = (FileConnection) Connector.open( "file:///E:/" + fileName );
            InputStream is = fc.openInputStream();

            byte[] b = new byte[10];
            int length = is.read( b, 0, 10 );
            for ( int i = 0; i < length; i++ ) {
                form.append( b[i] + "" );
            }
        } catch ( IOException e ) {
            e.printStackTrace();
        }
    }
}).start();

Ответы [ 2 ]

3 голосов
/ 10 июля 2011

почему вы не используете потоки ... создайте поток для воспроизведения файла wav и используйте другой поток для чтения файла ...

см. здесь для получения дополнительной информациина потоках в J2ME


public class View_PlayMidlet extends MIDlet {

    PlayerThread musicPlayer = new PlayerThread();

    public void startApp() {
        String fileName = "file://e:/abcd.wav";
        musicPlayer.setPlayableFile(fileName);
        FileConnection fc = null;
        InputStream is = null;
        String fileContent = null;
        try {
            fc = (FileConnection) Connector.open("file:///E:/" + fileName);
            is = fc.openInputStream();

            byte[] b = new byte[10];
            int length = is.read(b, 0, 10);

            fileContent = new String(b);

            // display the content of fileContent variable in a form.
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (is != null) {
                try {
                    is.close();
                } catch (IOException ex) {
                }
            }
            if (fc != null) {
                try {
                    fc.close();
                } catch (IOException ex) {
                }
            }
        }
        // by this time the file is displayed & you can start playing the file.
        Thread t = new Thread(musicPlayer);
        t.start();

    }

    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
    }
}

public class PlayerThread implements Runnable {

    private String fileName;
    private Player player;

    public PlayerThread() {
    }

    public void run() {
        try {
            player = Manager.createPlayer(fileName);
            player.prefetch();
            player.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void stopMusic() {
        try {
            player.stop();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void setPlayableFile(String fileName) {
        this.fileName=fileName;
    }
}

это примерно то, что вы ищете.

2 голосов
/ 11 июля 2011

Ваши экземпляры Player собраны мусором. Кроме того, доступ к файлам во время воспроизведения, скорее всего, будет зависеть от реализации, то есть будет работать на некоторых моделях, а не на других. Поэтому сначала прочитайте данные, скопируйте их в другой файл и т. Д., Если вы хотите что-то твердое.

Вы всегда можете перейти Источник данных -path тоже.

...