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);
}
}
}
}
分享到:
相关推荐
它可以播放本地文件或网络流,但对某些特定的流协议支持可能不足,如RTSP。因此,在需要更强大功能时,通常会结合其他库如VLC进行扩展。 4. **MediaPlayer**: MediaPlayer是Android SDK中的另一个关键组件,用于...
网络视频,流文件的播放和传输,很不错的网络多媒体参考程序
LibVLC支持多种编码格式,包括H.264、MPEG-4、VP9等,并且能够处理网络流,如HTTP、RTSP、MMS和HLS。在Android设备上,VLC能够直接播放网络上的视频流,无需先下载到本地。 对于"arr"文件的使用,开发者通常会在...
这意味着可以将音频数据从网络接收端实时解码并发送到播放线程,保证音频流的连续性,避免因为网络延迟导致的播放中断。 在提供的文件“PcmPlayer”中,可能包含了实现上述功能的源代码。具体实现可能包括定义一个...
安装此程序后,用户可以在Windows系统上享受到VLC提供的所有功能,包括播放本地媒体文件、网络流媒体内容,以及设置自定义播放参数等。 总的来说,VLC作为一款开源的网络流媒体播放器,其强大的功能、广泛的支持...
以下是一个详细的知识点介绍,关于如何在Java中通过URL获取网络位置上的文件流。 1. **URL对象**:首先,我们需要创建一个`java.net.URL`对象,它表示统一资源定位符,即我们所说的网址。例如: ```java URL url = ...
Jaris flv player官方网站只给出了网络音视频文件播放的示例,对于初次接触网页播放器的开发人员,配对本地音视频文件播放、rtmp流媒体播放比较困难,网上相关介绍资料很少,需要跟踪源码、追根溯源才能正确配置。...
在本文中,我们将深入探讨如何利用ijkplayer实现在网络上播放视频流,并对其部分功能进行优化。 首先,ijkplayer的核心是FFmpeg库,它提供了丰富的多媒体处理能力,包括解码、编码、复用、解复用等功能。ijkplayer...
特别地,它支持播放mp4 格式的文件流,这意味着可以通过live555 实现基于网络的mp4 视频流传输。” 【知识点详解】: 1. **live555 媒体服务器**:live555 是一个跨平台的开源库,主要用于实时多媒体流处理。它...
在本教程中,我们将深入探讨如何使用`MediaPlayer`播放网络URL、Asset目录下的文件以及本地视频文件。 一、播放网络URL视频 1. 首先,我们需要获取到网络视频的URL。这通常是一个HTTP或HTTPS链接,例如:`...
本项目是基于VS2010环境,利用VLC SDK 3.0.4版本,实现了在网络流播放的功能。以下是对这一知识点的详细解释: 首先,我们要了解MFC(Microsoft Foundation Classes),这是微软为C++开发Windows应用程序提供的一套...
在Unity引擎中,实时播放音频流文件是一项关键的技术,它涉及到游戏音频的高效处理和优化。Unity提供了多种方法来处理音频资源,包括预加载、缓存和流式播放。本篇将深入探讨如何在Unity中确保音频流文件的高效播放...
1. **VLC播放器**: VLC不仅能够播放本地文件,还支持网络流媒体,包括RTSP流。它内置了多种解码器,可以处理各种编码格式,无需额外安装插件。 2. **RTSP协议**: RTSP是一种实时传输协议,它允许客户端通过控制...
1. **VLC播放器**:VLC不仅能够播放本地媒体文件,还能直接处理网络流。通过内置对RTSP的支持,VLC可以连接到提供RTSP服务的服务器,播放实时视频流。`vlc-2.2.6-win32.exe`是VLC针对Windows 32位系统的安装程序,...
详细介绍参考博客: http://blog.csdn.net/caoshangpa/article/details/51224678 测试用PCM音频文件链接: http://download.csdn.net/detail/caoshangpa/9497751
《中维录像文件播放及中维流媒体网络插件详解》 在当今信息化时代,视频监控已经成为日常生活和工作中不可或缺的一部分,而中维(JCVid)作为国内知名的安防设备提供商,其产品广泛应用于各种场景。本文将围绕"中维...
HTML播放RTMP流直播加回放的技术涉及到网络流媒体传输协议、HTML5视频播放和多媒体内容处理等多个领域。RTMP(Real-Time Messaging Protocol)是由Adobe Systems开发的一种用于音视频数据实时传输的协议,广泛应用于...
1.使用时VS2017,低版本打不开的话,新建一个...2.自己找了很多种播放rtsp流的方法,也在网上找了好几个VLC的demo,但是都会报各种错误,例如:试图加载格式不正确的程序,后发现可能是VLC的资源调用的路径可能有问题等
总的来说,使用live555MediaServer循环播放文件涉及了流媒体服务器的部署、RTSP协议的运用以及网络传输的知识。通过理解这些概念,开发者可以构建自己的实时媒体流服务,满足各种应用场景的需求。
1. **流媒体技术**:在播放网络媒体文件时,流媒体技术起着关键作用。它允许数据在传输过程中被即时解码和播放,而无需等待整个文件下载完毕。常见的流媒体协议有RTMP(Real-Time Messaging Protocol)、HLS...