`

播放网络流文件

 
阅读更多
public class AudioPlayer implements OnErrorListener, OnBufferingUpdateListener,


MediaPlayer.OnCompletionListener {

private static final String TAG = "AudioPlayer";

private MediaPlayer mPlayer;

private String current;

private static final int MIN_BUFF = 100 * 1024;

private int totalKbRead = 0;

private Handler handler = new Handler();

private File DLTempFile;

private File BUFFTempFile;

private final String TEMP_DOWNLOAD_FILE_NAME = "tempMediaData";

private final String TEMP_BUFF_FILE_NAME = "tempBufferData";

private final String FILE_POSTFIX = ".dat";

private final int PER_READ = 1024;

private boolean pause;

private boolean stop;

private final int UNKNOWN_LENGTH = -1;

private Handler mHandler = null;


public void setHandler(Handler handler) {

mHandler = handler;

}


public void play(final String path) {

downloadOver = false;

totalKbRead = 0;

try {

Log.v(TAG, "playing: " + path);

if (path.equals(current) && mPlayer != null) {

mPlayer.start();

return;

}


current = path;

mPlayer = null;

new PlayThread(current).start();

} catch (Exception e) {

}

}


private void setListener() {

if (mPlayer != null) {

mPlayer.setOnErrorListener(this);

mPlayer.setOnBufferingUpdateListener(this);

mPlayer.setOnCompletionListener(this);

}

}



/**

* 下载数据,分段下载

* todo:联网方式和分段

* @param mediaUrl

* @param start

* @param end

*/


private void playFromNet(String mediaUrl, int start, int end) {

URLConnection cn = null;

FileOutputStream out = null;

InputStream is = null;

try {

cn = new URL(mediaUrl).openConnection();

cn.connect();

is = cn.getInputStream();

int mediaLength = cn.getContentLength();


if (is == null) {

return;

}


deleteTempFile(true);

DLTempFile = File.createTempFile(TEMP_DOWNLOAD_FILE_NAME,FILE_POSTFIX);


out = new FileOutputStream(DLTempFile);

byte buf[] = new byte[PER_READ];

int readLength = 0;


while (readLength != -1 && !stop) {

if (pause) {

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

continue;

}

readLength = is.read(buf);



if (readLength > 0) {

try {

out.write(buf, 0, readLength);

totalKbRead += readLength;

} catch (Exception e) {

Log.e(TAG, e.toString());

}

}

dealWithBufferData();


}


if (totalKbRead == mediaLength) {

downloadOver = true;

dealWithLastData();



// 删除临时文件

if (DLTempFile != null && DLTempFile.exists()) {

DLTempFile.delete();

}

}

} catch (MalformedURLException e) {

Log.e(TAG, e.toString());

} catch (IOException e) {

Log.e(TAG, e.toString());

} finally {

if (out != null) {

try {

out.close();

} catch (IOException e) {

e.printStackTrace();

}


}


if (is != null) {

try {

is.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}


private boolean downloadOver = false;

private boolean wasPlayed = false;


private void dealWithBufferData() {

if (mPlayer == null || !wasPlayed) {

if (totalKbRead >= MIN_BUFF) {

try {

startMediaPlayer();

} catch (Exception e) {

}

}

} else if (mPlayer.getDuration() - mPlayer.getCurrentPosition() <= 1000) {

deleteTempFile(true);

transferBufferToMediaPlayer();

}

}


private void startMediaPlayer() {

try {

deleteTempFile(true);

BUFFTempFile = File.createTempFile(TEMP_BUFF_FILE_NAME,FILE_POSTFIX);

FileSystemUtil.copyFile(DLTempFile, BUFFTempFile);

mPlayer = new MediaPlayer();

setListener();

mPlayer.setDataSource(BUFFTempFile.getAbsolutePath());

mPlayer.prepare();

mPlayer.start();

wasPlayed = true;

} catch (IOException e) {

}

}


private void transferBufferToMediaPlayer() {

try {

boolean wasPlaying = mPlayer.isPlaying();

int curPosition = mPlayer.getCurrentPosition();

mPlayer.pause();

BUFFTempFile = File.createTempFile(TEMP_BUFF_FILE_NAME,FILE_POSTFIX);

FileSystemUtil.copyFile(DLTempFile, BUFFTempFile);

mPlayer = new MediaPlayer();

mPlayer.setDataSource(BUFFTempFile.getAbsolutePath());

mPlayer.prepare();

mPlayer.seekTo(curPosition);

boolean atEndOfFile = mPlayer.getDuration()- mPlayer.getCurrentPosition() <= 1000;

if (wasPlaying || atEndOfFile) {

mPlayer.start();

}

} catch (Exception e) {

}

}


private void dealWithLastData() {

Runnable updater = new Runnable() {

public void run() {

transferBufferToMediaPlayer();

}

};

handler.post(updater);

}


public void onCompletion(MediaPlayer mp) {

if (mHandler != null) {

mHandler.sendEmptyMessage(Preferences.MEDIA_ENDED);

}

}


public boolean onError(MediaPlayer mediaPlayer, int what, int extra) {

if (mediaPlayer != null) {

mediaPlayer.stop();

mediaPlayer.release();

}

if (mHandler != null) {

mHandler.sendEmptyMessage(Preferences.MEDIA_ERROR);

}

return true;

}


public void onBufferingUpdate(MediaPlayer arg0, int percent) {

Log.d(TAG, "onBufferingUpdate called --->

percent:" + percent);

if (mHandler != null) {

mHandler.sendEmptyMessage(Preferences.EMDIA_BUFF_CHANGE);

}

}


private class PlayThread extends Thread {

private String url;

PlayThread(String url) {

this.url = url;

}


public void run() {

if (!URLUtil.isNetworkUrl(url)) {

mPlayer = new MediaPlayer();

setListener();

try {

// if (url.startsWith("content://")) {

// mPlayer.setDataSource(MediaPlayService.this, Uri

// .parse(url));

// } else {

mPlayer.setDataSource(url);

// }

mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

setVolume(0f);

mPlayer.prepare();

mPlayer.start();

} catch (IllegalArgumentException e) {

Log.e(TAG, e.toString());

} catch (IllegalStateException e) {

Log.e(TAG, e.toString());

} catch (IOException e) {

Log.e(TAG, e.toString());

}

} else {

playFromNet(url, 0, UNKNOWN_LENGTH);

}

}

}


}
分享到:
评论

相关推荐

    引用VLC库使用流畅的播放网络流RTSP 视频

    它可以播放本地文件或网络流,但对某些特定的流协议支持可能不足,如RTSP。因此,在需要更强大功能时,通常会结合其他库如VLC进行扩展。 4. **MediaPlayer**: MediaPlayer是Android SDK中的另一个关键组件,用于...

    网络视频流文件的播放和传输

    网络视频,流文件的播放和传输,很不错的网络多媒体参考程序

    VLC播放流媒体arr文件

    LibVLC支持多种编码格式,包括H.264、MPEG-4、VP9等,并且能够处理网络流,如HTTP、RTSP、MMS和HLS。在Android设备上,VLC能够直接播放网络上的视频流,无需先下载到本地。 对于"arr"文件的使用,开发者通常会在...

    C++ 播放音频流(PCM裸流)

    这意味着可以将音频数据从网络接收端实时解码并发送到播放线程,保证音频流的连续性,避免因为网络延迟导致的播放中断。 在提供的文件“PcmPlayer”中,可能包含了实现上述功能的源代码。具体实现可能包括定义一个...

    vlc万能流媒体播放器支持网络URL播放

    安装此程序后,用户可以在Windows系统上享受到VLC提供的所有功能,包括播放本地媒体文件、网络流媒体内容,以及设置自定义播放参数等。 总的来说,VLC作为一款开源的网络流媒体播放器,其强大的功能、广泛的支持...

    通过url获取网络位置上的文件流

    以下是一个详细的知识点介绍,关于如何在Java中通过URL获取网络位置上的文件流。 1. **URL对象**:首先,我们需要创建一个`java.net.URL`对象,它表示统一资源定位符,即我们所说的网址。例如: ```java URL url = ...

    jaris flv player本地文件播放、网络媒体文件播放、rtmp流播放示例

    Jaris flv player官方网站只给出了网络音视频文件播放的示例,对于初次接触网页播放器的开发人员,配对本地音视频文件播放、rtmp流媒体播放比较困难,网上相关介绍资料很少,需要跟踪源码、追根溯源才能正确配置。...

    ijkplayer实现网络视频流播放

    在本文中,我们将深入探讨如何利用ijkplayer实现在网络上播放视频流,并对其部分功能进行优化。 首先,ijkplayer的核心是FFmpeg库,它提供了丰富的多媒体处理能力,包括解码、编码、复用、解复用等功能。ijkplayer...

    live 555 支持播放mp4 文件流

    特别地,它支持播放mp4 格式的文件流,这意味着可以通过live555 实现基于网络的mp4 视频流传输。” 【知识点详解】: 1. **live555 媒体服务器**:live555 是一个跨平台的开源库,主要用于实时多媒体流处理。它...

    android MediaPlayer播放视频网络URL,asset目录下文件,本地视频文件

    在本教程中,我们将深入探讨如何使用`MediaPlayer`播放网络URL、Asset目录下的文件以及本地视频文件。 一、播放网络URL视频 1. 首先,我们需要获取到网络视频的URL。这通常是一个HTTP或HTTPS链接,例如:`...

    MFC调用VLC SDK播放网络流

    本项目是基于VS2010环境,利用VLC SDK 3.0.4版本,实现了在网络流播放的功能。以下是对这一知识点的详细解释: 首先,我们要了解MFC(Microsoft Foundation Classes),这是微软为C++开发Windows应用程序提供的一套...

    Unity实时播放音频流文件保证播放效率

    在Unity引擎中,实时播放音频流文件是一项关键的技术,它涉及到游戏音频的高效处理和优化。Unity提供了多种方法来处理音频资源,包括预加载、缓存和流式播放。本篇将深入探讨如何在Unity中确保音频流文件的高效播放...

    VLC播放RTSP流实例

    1. **VLC播放器**: VLC不仅能够播放本地文件,还支持网络流媒体,包括RTSP流。它内置了多种解码器,可以处理各种编码格式,无需额外安装插件。 2. **RTSP协议**: RTSP是一种实时传输协议,它允许客户端通过控制...

    vlc播放rtsp取流文件,安装包及实例demo。主流rtsp取流协议集合

    1. **VLC播放器**:VLC不仅能够播放本地媒体文件,还能直接处理网络流。通过内置对RTSP的支持,VLC可以连接到提供RTSP服务的服务器,播放实时视频流。`vlc-2.2.6-win32.exe`是VLC针对Windows 32位系统的安装程序,...

    Qt播放PCM音频(裸流)文件

    详细介绍参考博客: http://blog.csdn.net/caoshangpa/article/details/51224678 测试用PCM音频文件链接: http://download.csdn.net/detail/caoshangpa/9497751

    中维录像文件播放及中维流媒体网络插件.ra

    《中维录像文件播放及中维流媒体网络插件详解》 在当今信息化时代,视频监控已经成为日常生活和工作中不可或缺的一部分,而中维(JCVid)作为国内知名的安防设备提供商,其产品广泛应用于各种场景。本文将围绕"中维...

    HTML播放rtmp流 直播+回放

    HTML播放RTMP流直播加回放的技术涉及到网络流媒体传输协议、HTML5视频播放和多媒体内容处理等多个领域。RTMP(Real-Time Messaging Protocol)是由Adobe Systems开发的一种用于音视频数据实时传输的协议,广泛应用于...

    C# 使用VLC流媒体播放,rtsp流,视频流

    1.使用时VS2017,低版本打不开的话,新建一个...2.自己找了很多种播放rtsp流的方法,也在网上找了好几个VLC的demo,但是都会报各种错误,例如:试图加载格式不正确的程序,后发现可能是VLC的资源调用的路径可能有问题等

    live555MediaServer 循环播放文件

    总的来说,使用live555MediaServer循环播放文件涉及了流媒体服务器的部署、RTSP协议的运用以及网络传输的知识。通过理解这些概念,开发者可以构建自己的实时媒体流服务,满足各种应用场景的需求。

    行业分类-设备装置-播放网络媒体文件的方法和系统.zip

    1. **流媒体技术**:在播放网络媒体文件时,流媒体技术起着关键作用。它允许数据在传输过程中被即时解码和播放,而无需等待整个文件下载完毕。常见的流媒体协议有RTMP(Real-Time Messaging Protocol)、HLS...

Global site tag (gtag.js) - Google Analytics