blackberry - 如何在Blackberry中一个接一个地播放音频文件?

标签 blackberry audio java-me

我设法在Blackberry中创建了一个播放音频文件的应用程序,但只能播放一个文件。我尝试使用for循环播放一些音频文件。

我设法播放了它,但是它没有播放音频文件的全部声音,它只播放第一个音频文件,然后播放第二个音频文件几秒钟,然后停止播放。播放过的文件也播放声音会相互重叠,这是不应该发生的。

如何在Blackberry中不停地播放音频文件的完整声音?

这是我使用for循环创建的应用程序的代码:

    package mypackage;

import javax.microedition.media.Manager;
import javax.microedition.media.MediaException;
import javax.microedition.media.Player;
import java.lang.Class;
import javax.microedition.rms.RecordStore;
import java.io.InputStream;
import java.io.ByteArrayInputStream;
import net.rim.device.api.media.protocol.ByteArrayInputStreamDataSource;
import net.rim.device.api.system.*;
import net.rim.device.api.ui.*;
import net.rim.device.api.ui.component.*;
import net.rim.device.api.ui.container.MainScreen;
import net.rim.device.api.ui.extension.container.*;
import net.rim.device.api.ui.UiApplication;
import java.io.IOException;

public class PlayMedia extends UiApplication{
    /**
     * Entry point for application
     * @param args Command line arguments (not used)
     */ 
    public static void main(String[] args){

        PlayMedia theApp = new PlayMedia();
        theApp.enterEventDispatcher();
    }

    public PlayMedia()
    {

        pushScreen(new PlayMediaScreen());


    }
    /**
     * A class extending the MainScreen class, which provides default standard
     * behavior for BlackBerry GUI applications.
     */
    final class PlayMediaScreen extends MainScreen
    {
        /**
         * Creates a new PlayMediaScreen object
         */
        PlayMediaScreen()
        {
            String test1 = "Test(2seconds).mp3";
            String test2 = "Test(2seconds)2.mp3";
            String test3 = "Test(2seconds)3.mp3";
            String test4 = "Test(2seconds)4.mp3";
            String test5 = "blind_willie.mp3";
            String mp3 = null;

            for(int i=0;i<5;i++){
                if(i == 0){
                    mp3 = test1;
                }
                else if(i == 1){
                    mp3 = test2;
                }
                else if(i == 2){
                    mp3 = test3;
                }
                else if(i == 3){
                    mp3 = test4;
                }
                else if(i == 4){
                    mp3 = test5;
                }
                play(mp3);
            }
        }

        private void play(String mp3){

        Player p = null;

        InputStream stream = (InputStream)this.getClass().getResourceAsStream("/" + mp3);

            try {
                //p = Manager.createPlayer(source);
                p = Manager.createPlayer(stream, "audio/mpeg");
                p.realize();
                p.prefetch();

                //testing
                System.out.println("Creating Players!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
                System.out.println("The mp3 is " + mp3 + "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();

                //testing
                System.out.println("IO Exeception!!!!!!!!!!!!!!!!1 " + e);

                //testing 
                System.out.println(p);

            } catch (MediaException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();

            //testing
            System.out.println("Media Exeception!!!!!!!!!!!!!!!!1" + e);

            //testing 
            System.out.println(p);
            }
            /*
             * Best practice is to invoke realize(), then prefetch(), then start().
             * Following this sequence reduces delays in starting media playback.
             *
             * Invoking start() as shown below will cause start() to invoke  prefetch(0),
             * which invokes realize() before media playback is started.
             */
            try {
                p.start();
            } catch (MediaException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();

                //testing
                System.out.println("Media Exeception for starting!!!!!!!!!!!!!!!!1" + e);

                //testing 
                System.out.println(p);
            }

            /*try {
                p.stop();
            } catch (MediaException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }*/
            //p.deallocate();
            //p.close();



        }
    }
} 

最佳答案

I managed to play it, but it did not play the whole sound of the audio files, it just play the first audio files and second for a few seconds, and stop playing after that. The files that played also play the sound overlap each other which should not be happening.



请仔细阅读BB API docs以获取Player:

Simple Playback

A Player can be created from one of the Manager's createPlayer methods. After the Player is created, calling start will start the playback as soon as possible. The method will return when the playback is started. The playback will continue in the background and will stop automatically when the end of media is reached.

Simple playback example illustrates this:


try {
    Player p = Manager.createPlayer("http://abc.wav");
    p.start();
} catch (MediaException pe) {
} catch (IOException ioe) {
}

请注意文档说The method will return when the playback is started. The playback will continue in the background ..。这就是您得到“声音重叠”的原因。

为了克服这个问题,您需要在播放器Player.addPlayerListener(PlayerListener playerListener)上附加一个侦听器。当媒体文件播放到最后时,将从后台“播放”线程通知监听器。现在正是时候开始下一个媒体文件的新播放了。请不要指望我的代码,我只是给您一个想法。

关于blackberry - 如何在Blackberry中一个接一个地播放音频文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7218532/

相关文章:

javascript - HTML5 : How to get currentTime and duration of Audio Tag in milliseconds

c# - 如何在 C# 中用原始音频样本创建波流?

audio - 在 J2ME 中停止声音循环

黑莓 - 平台版本和软件版本

javascript - 移动浏览器(Android、iPhone 和 BlackBerry)的模态弹出表单

iphone - 比较移动设备作为开发人员。平台 iPhone、Blackberry Windows Mobile

android - Android-单击按钮即可播放随机声音

java - LWUIT 中 TextArea 的滚动问题

blackberry - 是否可以在 blackberry OS 6,7 和 7.1 中运行 blackberry OS 10

java - 在 BlackBerry 上验证 Twitter OAuth