Android媒体播放器播放文件,写入文件

时间:2016-03-28 21:03:23

标签: java android android-mediaplayer

我在云服务上有一些mp3文件。链接就像https://dns/mp3filename.mp3?dl=1。我可以使用Vlc媒体播放器播放文件流,我可以用Java编写文件中的字节。但是当我尝试在Android媒体播放器中播放链接时,有时会播放一些错误(1,-1004),即media_error_io。 流媒体代码:

mp.setDataSource(link);
        mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mp.prepareAsync();
        mp.setWakeMode(ctx, PowerManager.PARTIAL_WAKE_LOCK);
        mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                mp.start();
            }
        });

我一直在寻找一个图书馆,但我找不到一个。我刚刚下载了下载文件并在下载时播放它的想法,但媒体播放器只读取我给它播放的第一个字节并调用setOnCompletionListener即使文件已经完全下载。

该代码位于一个帖子中并且可以下载该文件

try {
        File cacheDir = new File(ctx.getCacheDir().getPath()+"/"+"mp3s");
        cacheDir.mkdir();
        File tempFile = File.createTempFile("mp3" + num, ".mp3", cacheDir);

        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(tempFile));

        HttpURLConnection httpURLConnection = (HttpURLConnection) new URL(lien).openConnection();
        httpURLConnection.setDoInput(true);
        BufferedInputStream bufferedInputStream = new BufferedInputStream(httpURLConnection.getInputStream());

        byte bytes[] = new byte[1048576];
        int len = 0;
        int nbre = 0;
        int current = 0;
        while ((len = bufferedInputStream.read(bytes))!=-1){
            bufferedOutputStream.write(bytes,0,len);
            bufferedOutputStream.flush();
            nbre+= len;
            current += len;

            onLoadingListener.onLoading(current, httpURLConnection.getContentLength());

            if(nbre >= 524288){
                nbre = 0;
                onReadyListener.onReady(tempFile);
            }
        }

        bufferedOutputStream.close();
    } catch (Exception e) {
        e.printStackTrace();
    }

onReadyListener.onReady(tempFile);是回调以启动媒体播放器。

playerMediaDownloader.setOnReadyListener(new PlayerMediaDownloader.OnReadyListener() {
            @Override
            public void onReady(final File file) {
                path = file.getPath();
                try {
                    if(!playing) {
                        Log.d(getClass().getSimpleName(), "li ready");
                        mp.setDataSource(file.getPath());
                        mp.prepare();
                        mp.start();
                        Log.d(Player.this.getClass().getSimpleName(), "pos:"+mp.getCurrentPosition());
                        playing = true;
                        for (OnTimeChanged l : onTimeChangeds) {
                            l.onTimeChanged(mp.getCurrentPosition(), mp.getDuration());
                        }
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });

即使文件已完全下载,媒体播放器也会在达到524288字节时播放该文件。

我带来了另一种解决方案,即再次设置文件文件并播放它并且它有效,但声音有点削减并且它不是那样的。

mp.setOnCompletionListener(new OnCompletionListener() {

            @Override
            public void onCompletion(MediaPlayer mp) {

                int currentPosition = mp.getCurrentPosition();
                mp.reset();
                try {
                    Player.this.mp.setDataSource(path);
                    mp.prepare();
                    mp.seekTo(currentPosition);
                    mp.start();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                Log.d(getClass().getSimpleName(), "fini jwe:"+mp.getCurrentPosition());
            }
        });

你有没有更好的解决方案来帮助我让它工作正常,就像异步播放文件一样?

0 个答案:

没有答案