麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > OS > 安卓 > 正文

Android實(shí)現(xiàn)使用流媒體播放遠(yuǎn)程mp3文件的方法

2024-09-11 17:15:13
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

本文實(shí)例講述了Android實(shí)現(xiàn)使用流媒體播放遠(yuǎn)程mp3文件的方法。分享給大家供大家參考,具體如下:

package com.shadow.util;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.URL;import java.net.URLConnection;import java.util.ArrayList;import java.util.List;import com.shadow.service.AudioPlayService.LocalBinder;import android.app.Service;import android.content.Context;import android.content.Intent;import android.media.MediaPlayer;import android.os.Binder;import android.os.Handler;import android.os.IBinder;import android.util.Log;import android.widget.Button;import android.widget.ImageButton;import android.widget.ProgressBar;import android.widget.TextView;import android.widget.Toast;/** * MediaPlayer does not yet support streaming from external URLs so this class provides a pseudo-streaming function * by downloading the content incrementally & playing as soon as we get enough audio in our temporary storage. */public class StreamingMediaPlayer extends Service{  private static final int INTIAL_KB_BUFFER = 96*10/8;//assume 96kbps*10secs/8bits per byte  private TextView textStreamed;  private ImageButton playButton;  private ProgressBar  progressBar;  // Track for display by progressBar  private long mediaLengthInKb, mediaLengthInSeconds;  private int totalKbRead = 0;  // Create Handler to call View updates on the main UI thread.  private final Handler handler = new Handler();  private MediaPlayer   mediaPlayer;  private File downloadingMediaFile;  private boolean isInterrupted;  private Context context;  private int counter = 0;  private static Runnable r;  private static Thread playerThread;  private LocalBinder localBinder = new LocalBinder();  private MediaPlayer player;  private boolean isPause = false;   //播放器是否處于暫停狀態(tài)  private boolean isSame = false;   //所點(diǎn)播歌曲是否是當(dāng)前播放歌曲  private Integer position = -1;    //設(shè)置播放標(biāo)記  private List<String> music_name;   //歌曲列表  private List<String> music_path;   public StreamingMediaPlayer(Context context,TextView textStreamed, ImageButton  playButton, Button  streamButton,ProgressBar  progressBar)   {     this.context = context;    this.textStreamed = textStreamed;    this.playButton = playButton;    this.progressBar = progressBar;  }  /**   * Progressivly download the media to a temporary location and update the MediaPlayer as new content becomes available.   */  public void startStreaming(final String mediaUrl, long  mediaLengthInKb, long  mediaLengthInSeconds) throws IOException {    this.mediaLengthInKb = mediaLengthInKb;    this.mediaLengthInSeconds = mediaLengthInSeconds;    r = new Runnable() {      public void run() {        try {          Log.i("downloadAudioIncrement", "downloadAudioIncrement");          downloadAudioIncrement(mediaUrl);        } catch (IOException e) {          Log.e(getClass().getName(), "Unable to initialize the MediaPlayer for fileUrl=" + mediaUrl, e);          return;        }      }    };    playerThread = new Thread(r);    playerThread.start();    //new Thread(r).start();  }  /**   * Download the url stream to a temporary location and then call the setDataSource   * for that local file   */  public void downloadAudioIncrement(String mediaUrl) throws IOException {    URLConnection cn = new URL(mediaUrl).openConnection();    cn.addRequestProperty("User-Agent","NSPlayer/10.0.0.4072 WMFSDK/10.0");    cn.connect();    InputStream stream = cn.getInputStream();    if (stream == null) {      Log.e(getClass().getName(), "Unable to create InputStream for mediaUrl:" + mediaUrl);    }    downloadingMediaFile = new File(context.getCacheDir(),"downloadingMedia.dat");    // Just in case a prior deletion failed because our code crashed or something, we also delete any previously    // downloaded file to ensure we start fresh. If you use this code, always delete    // no longer used downloads else you'll quickly fill up your hard disk memory. Of course, you can also    // store any previously downloaded file in a separate data cache for instant replay if you wanted as well.    if (downloadingMediaFile.exists()) {      downloadingMediaFile.delete();    }    FileOutputStream out = new FileOutputStream(downloadingMediaFile);    byte buf[] = new byte[16384];    int totalBytesRead = 0, incrementalBytesRead = 0;    do {      int numread = stream.read(buf);      if (numread <= 0)        break;      out.write(buf, 0, numread);      totalBytesRead += numread;      incrementalBytesRead += numread;      totalKbRead = totalBytesRead/1000;      testMediaBuffer();        fireDataLoadUpdate();    } while (validateNotInterrupted());        stream.close();    if (validateNotInterrupted()) {        fireDataFullyLoaded();    }  }  private boolean validateNotInterrupted() {    if (isInterrupted) {      if (mediaPlayer != null) {        mediaPlayer.pause();        //mediaPlayer.release();      }      return false;    } else {      return true;    }  }  /**   * Test whether we need to transfer buffered data to the MediaPlayer.   * Interacting with MediaPlayer on non-main UI thread can causes crashes to so perform this using a Handler.   */  private void testMediaBuffer() {    Runnable updater = new Runnable() {      public void run() {        if (mediaPlayer == null) {          // Only create the MediaPlayer once we have the minimum buffered data          if ( totalKbRead >= INTIAL_KB_BUFFER) {            try {              startMediaPlayer();            } catch (Exception e) {              Log.e(getClass().getName(), "Error copying buffered conent.", e);            }          }        } else if ( mediaPlayer.getDuration() - mediaPlayer.getCurrentPosition() <= 1000 ){          // NOTE: The media player has stopped at the end so transfer any existing buffered data          // We test for < 1second of data because the media player can stop when there is still          // a few milliseconds of data left to play          transferBufferToMediaPlayer();        }      }    };    handler.post(updater);  }  private void startMediaPlayer() {    try {      File bufferedFile = new File(context.getCacheDir(),"playingMedia" + (counter++) + ".dat");      // We double buffer the data to avoid potential read/write errors that could happen if the      // download thread attempted to write at the same time the MediaPlayer was trying to read.      // For example, we can't guarantee that the MediaPlayer won't open a file for playing and leave it locked while      // the media is playing. This would permanently deadlock the file download. To avoid such a deadloack,      // we move the currently loaded data to a temporary buffer file that we start playing while the remaining      // data downloads.      moveFile(downloadingMediaFile,bufferedFile);      Log.e(getClass().getName(),"Buffered File path: " + bufferedFile.getAbsolutePath());      Log.e(getClass().getName(),"Buffered File length: " + bufferedFile.length()+"");      mediaPlayer = createMediaPlayer(bufferedFile);      // We have pre-loaded enough content and started the MediaPlayer so update the buttons & progress meters.      mediaPlayer.start();      startPlayProgressUpdater();      playButton.setEnabled(true);    } catch (IOException e) {      Log.e(getClass().getName(), "Error initializing the MediaPlayer.", e);      return;    }  }  public void pausePlayer(){    try {      getMediaPlayer().pause();    } catch (Exception e) {      e.printStackTrace();    }  }  public void startPlayer(){    getMediaPlayer().start();  }  public void stopPlayer(){    getMediaPlayer().stop();  }  /**   * 根據(jù)文件創(chuàng)建一個(gè)mediaplayer對(duì)象   */  private MediaPlayer createMediaPlayer(File mediaFile)  throws IOException {    MediaPlayer mPlayer = new MediaPlayer();    mPlayer.setOnErrorListener(        new MediaPlayer.OnErrorListener() {          public boolean onError(MediaPlayer mp, int what, int extra) {            Log.e(getClass().getName(), "Error in MediaPlayer: (" + what +") with extra (" +extra +")" );            return false;          }        });    // It appears that for security/permission reasons, it is better to pass a FileDescriptor rather than a direct path to the File.    // Also I have seen errors such as "PVMFErrNotSupported" and "Prepare failed.: status=0x1" if a file path String is passed to    // setDataSource(). So unless otherwise noted, we use a FileDescriptor here.    FileInputStream fis = new FileInputStream(mediaFile);    mPlayer.setDataSource(fis.getFD());    mPlayer.prepare();    return mPlayer;}
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 精品国产一区二区三区四区在线 | 极品大长腿啪啪高潮露脸 | 欧美成人国产va精品日本一级 | 日韩中字幕 | 免费久久精品 | jizzjizzjizz少妇 | 中文字幕国产欧美 | 中文字幕在线观看免费视频 | av免费在线观看国产 | 大号bbwassbigav头交 | 免费看操片 | 亚洲精品在线观看免费 | av电影网站在线观看 | 最新久久免费视频 | 久久96国产精品久久久 | 精品一区二区三区免费毛片爱 | 欧美一级毛片一级毛片 | 日韩理论电影网 | 欧美久久久久久久久 | 欧美一级免费在线观看 | 久久av免费 | 欧美片一区二区 | 一级电影在线观看 | 深夜免费福利视频 | 免费国产成人高清在线看软件 | 精选久久 | av成人在线免费观看 | 久色精品视频 | 色婷婷av一区二区三区久久 | 男女生羞羞视频网站在线观看 | 国产三级在线视频观看 | 精品国产91久久久 | 久久久久久久久亚洲精品 | 91久久国产综合久久91精品网站 | 日本欧美一区二区三区在线播 | 免费一区区三区四区 | 成人精品视频网站 | 海外中文字幕在线观看 | 国产乱弄 | 久久久精品视频免费看 | 久久精热 |