[多媒体] (急)请大家看看啊:j2me 视频播放的罕见问题

如月王子 2009-06-03
因为不同模拟器是不能将一个好几M的媒体文件一下子加载到播放器的,所以需要分段加载。前段时间看到一个高手的程序,他的思想的用两个 Player 轮流加载播放,但是他没有提供程序分割视频文件的方法。他加载的是自己预先分割好的几段连续的文件。所以我按自己的想法去分割并播放视频,但是不成功,每次都会出现 prefetch error:-6 的错误,我想是不是因为视频分割后还需给每一段文件加视频信息之类的。请大家帮我看看啊,或者是哪位大侠有更好的办法啊。急需用的!!!

//is 是从通过访问文件系统传入的,通过FileConnection.openInputStream()得到,这个不会有问题的。因为我试过只用一个 Player 播放小的视频是没问题的。

InputStream is=null;

public synchronized void run() {
        try {
            int skip = is.available();
            while (skip > 0 && !stop) {
                byte[] forPlay = new byte[skip];
                this.wait();
                is.read(forPlay, 0, forPlay.length);
                ByteArrayInputStream bais = new ByteArrayInputStream(forPlay);
                player = Manager.createPlayer(bais, type);
//                player = Manager.createPlayer(is,type);
                player.realize();
                player.addPlayerListener(this);
                vc = (VideoControl) player.getControl("VideoControl");
                volC = (VolumeControl) player.getControl("VolumeControl");
                player.prefetch();
                is.skip(skip);
                //first 表示是否为刚开始播放,以区别与后来一个个片段的播放
                if (first == true) {
                    first = false;
                } else {
                    this.wait();
                }
                initScreen();
                player.start();
            }
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            releasePlayer();
            videoController.displayError("错误", ex.getMessage(), AlertType.ERROR);
        } catch (MediaException ex) {
            releasePlayer();
            videoController.displayError("错误", ex.getMessage(), AlertType.ERROR);
        }
    }


    public synchronized void start() {
        //通知第一个 Player 开始播放(首次的播放)
        this.notify();
    }


    public synchronized void playerUpdate(Player player, String event, Object eventData) {
        if (event.equals(PlayerListener.STARTED)) {
            //通知另一个 player 读取下段资源
            this.notify();
        } else if (event.equals(PlayerListener.END_OF_MEDIA)) {
            通知另一个 player 开始播放
            this.notify();
            //改变当前的 player 便于在 VideoController 中对当前 Player 进行控制
            VideoController.curPlayer = VideoController.curPlayer == VideoController.FP ? VideoController.SP : VideoController.FP;
        }
    }
LinuxFans 2009-06-03
不要用流创建。。。。。
你用路径创建就可以解决这个问题啦。。。。。。
如月王子 2009-06-04
LinuxFans 写道
不要用流创建。。。。。
你用路径创建就可以解决这个问题啦。。。。。。


你指的就是用 Manager.createPlayer(DataSource url)来创建 player 吗?这样不用分割视频也不会出现加载慢的情况吗?
fonter 2009-06-11
以前也做了分段播放,第一段能成功,但第二段不能成功,这说明第一段有视频头信息!可以考虑服务端做视频分段!
Global site tag (gtag.js) - Google Analytics