导航:首页 > 程序命令 > 程序员播放器

程序员播放器

发布时间:2023-08-17 13:03:31

1. android开发音乐播放器MediaPlayer.prepare()

MediaPlayer类可用于控制音频/视频文件或流的播放,我曾在《Android开发之基于Service的音乐播放器》一文中介绍过它的使用。下面让我们看一下MediaPlayer类的详细介绍。
一、类结构:

java.lang.Object



android.media.MediaPlayer

二、构造方法和公有方法
构造方法:

Public Constructors

MediaPlayer()
默认构造方法。

公有方法:

Public Methods

static MediaPlayer

create(Context context, Uri uri, SurfaceHolder holder)
指定从资源ID对应的资源文件中来装载音乐文件,同时指定了SurfaceHolder对象并返回MediaPlyaer对象。

static MediaPlayer

create(Context context, int resid)
指定从资源ID对应的资源文件中来装载音乐文件,并返回新创建的MediaPlyaer对象。

static MediaPlayer

create(Context context, Uri uri)
从指定Uri装在音频文件,并返回新创建的MediaPlayer对象。

int

getCurrentPosition()
获取当前播放的位置。

int

getDuration()
获取音频的时长。

int

getVideoHeight()
获取视频的高度。

int

getVideoWidth()
获取视频的宽度。

boolean

isLooping()
判断MediaPlayer是否正在循环播放。

boolean

isPlaying()
判断MediaPlayer是否正在播放。

void

pause()
暂停播放。

void

prepare()
准备播放(装载音频),调用此方法会使MediaPlayer进入Prepared状态。

void

prepareAsync()
准备播放异步音频。

void

release()
释放媒体资源。

void

reset()
重置MediaPlayer进入未初始化状态。

void

seekTo(int msec)
寻找指定的时间位置。

void

setAudioStreamType(int streamtype)
设置音频流的类型。

void

setDataSource(String path)
指定装载path路径所代表的文件。

void

setDataSource(Context context, Uri uri, Map<String, String headers)
指定装载uri所代表的文件。

void

setDataSource(Context context, Uri uri)
指定装载uri所代表的文件。

void

setDataSource(FileDescriptor fd, long offset, long length)
指定装载fd所代表的文件中从offset开始长度为length的文件内容。

void

setDataSource(FileDescriptor fd)
指定装载fd所代表的文件。

void

setDisplay(SurfaceHolder sh)
设置显示方式。

void

setLooping(boolean looping)
设置是否循环播放。

void

setNextMediaPlayer(MediaPlayer next)
设置当前流媒体播放完毕,下一个播放的MediaPlayer。

void

setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListener listener)
注册一个回调函数,在网络视频流缓冲变化时调用。

void

setOnCompletionListener(MediaPlayer.OnCompletionListener listener)
为Media Player的播放完成事件绑定事件监听器。

void

setOnErrorListener(MediaPlayer.OnErrorListener listener)
为MediaPlayer的播放错误事件绑定事件监听器。

void

setOnPreparedListener(MediaPlayer.OnPreparedListener listener)
当MediaPlayer调用prepare()方法时触发该监听器。

void

setOnSeekCompleteListener(MediaPlayer.OnSeekCompleteListener listener)
当MediaPlayer调用seek()方法时触发该监听器。

void

setOnVideoSizeChangedListener(MediaPlayer.OnVideoSizeChangedListener listener)
注册一个用于监听视频大小改变的监听器。

void

setScreenOnWhilePlaying(boolean screenOn)
置是否使用SurfaceHolder来显示。

void

setSurface(Surface surface)
设置Surface。

void

setVideoScalingMode(int mode)
设置视频缩放的模式。

void

setVolume(float leftVolume, float rightVolume)
设置播放器的音量。

void

setWakeMode(Context context, int mode)
为MediaPlayer设置低级电源管理行为。.

void

start()
开始或恢复播放。

void

stop()
停止播放。

三、常用方法分析:
1.使用进度条:
进度条SeekBar可以用来显示播放进度,用户也可以利用SeekBar的滑块来控制音乐的播放。
SeekBar需要使用的一些方法:
setProgress(int value):设置滑块的位置方法为。
setMax(int value):设置进度条的最大长度。
setOnSeekBarChangeListener(OnSeekBarChangeListener l):设置SeekBar的进度改变事件。
MusicPlayer需要使用的一些方法:
getDuration():获得音乐长度为。
getCurrentPosition():获得现在播放的位置。
seekTo(int msec):调用seekTo()方法可以调整播放的位置。
seekTo(int)方法是异步执行的,所以它可以马上返回,但是实际的定位播放操作可能需要一段时间才能完成,尤其是播放流形式的音频/视频。当实际的定位播放操作完成之后,内部的播放引擎会调用客户端程序员提供的OnSeekComplete.onSeekComplete()回调方法。可以通过setOnSeekCompleteListener(OnSeekCompleteListener)方法注册。
seekTo(int)方法也可以在其它状态下调用,比如Prepared,Paused和PlaybackCompleted状态。此外,目前的播放位置,实际可以调用getCurrentPosition()方法得到,它可以帮助如音乐播放器的应用程序不断更新播放进度。
创建并使用进度条的步骤:
第一步:创建一个进度条

//进度条
static SeekBarskbMusic;
skbMusic=(SeekBar)findViewById(R.id.skbMusic);

第二步:为进度条的改变事件注册并添加监听器

skbMusic.setOnSeekBarChangeListener(sChangeListener);
/**
* SeekBar进度改变事件
*/
=new OnSeekBarChangeListener() {
@Override
publicvoid onStopTrackingTouch(SeekBar seekBar) {
//TODO Auto-generated method stub
//当拖动停止后,控制mediaPlayer播放指定位置的音乐
MusicService.mediaPlayer.seekTo(seekBar.getProgress());
MusicService.isChanging=false;
}
@Override
publicvoid onStartTrackingTouch(SeekBar seekBar) {
//TODO Auto-generated method stub
MusicService.isChanging=true;
}
@Override
publicvoid onProgressChanged(SeekBar seekBar,int progress,
boolean fromUser) {
//TODO Auto-generated method stub
}
};

第三步:设置进度条的最大长度:

//getDuration()方法要在prepare()方法之后,否则会出现Attempt to call getDuration without a valid mediaplayer异常
MusicBox.skbMusic.setMax(mediaPlayer.getDuration());//设置SeekBar的长度

第四步:更新进度条

//----------定时器记录播放进度---------//
mTimer =new Timer();
mTimerTask =new TimerTask() {
@Override
publicvoid run() {
isTimerRunning=true;
if(isChanging==true)//当用户正在拖动进度进度条时不处理进度条的的进度
return;
MusicBox.skbMusic.setProgress(mediaPlayer.getCurrentPosition());
}
};
//每隔10毫秒检测一下播放进度
mTimer.schele(mTimerTask, 0, 10);

2.装载音频文件:
为了让MediaPlayer来装载指定音频文件,MediaPlayer提供了如下简单的静态方法。
static MediaPlayer create(Context context, Uri uri):从指定Uri来装载音频文件,并返回新创建的MediaPlayer对象。
static MediaPlayer create(Context context, int resid):从 resid资源 ID对应的资源文件中装载音频文件,并返回新创建的MediaPlayer对象。
提示:上而这两个方法用起来非常方便,但这两个方法每次都会返回新创建的MediaPlayer对象,如来程序需要使用MediaPlayer循环播放多个音频文件,使用MediaPlayer的静态create方法就不太合适了,此时可通过MediaPlayer的setDataSource()方法来装载指定的音频文件。MediaPlayer提供了如下方法来指定装载相应的音频文件。
setDataSource(String path):指定装载path路径所代表的文件。
setDataSource(FileDescriptor fd, long offset,long length):指定装载fd所代表的文件中从offset开始长度为length的文件内容。
setDataSource(FileDescriptor fd):指定装载fd所代表的文件。
setDataSource(Context context, Uri uri):指定装载uri所代表的文件。
提示:执行上面所示的setDataSource()方法之后,MediaPlayer并未真正去装载那些音频文件,还需要调用MediaPlayer的prepare()方法去准备音频,所谓“准备”,就是让MediaPlayer真正去装载音频文件。
使用已有的MediaPlayer对象装载“一首”歌曲的代码模板为:

mPlayer.reset();
//装战下一竹歌曲
mPlayer.setDataSource(M/mnt/sdcard/next.mp3);
//准备声音 mPlayer.prepare();
"播放
mPlayer.start();
}
catch (IOException e)
e.printStackTrace();
}

3.与MediaPlayer有关的事件监听器:
MediaPlayer提供了一些绑定事件监听器的方法,用于监听MediaPlayer播放过程中所发生的特定事件,绑定事件监听器的方法如下。
setOnCompletionListener(MediaPlayer.OnCompletionListener listener):为 Media Player的播放完成事件绑定事件监听器。
setOnErrorListener(MediaPlayer.OnErrorListener listener):为MediaPlayer的播放错误事件绑定事件监听器。
setOnPreparedListener(MediaPlayer.OnPreparedListener listener):当 MediaPlayer调用prepare()方法时触发该监听器。
setOnSeekCompleteListener(MediaPlayer.OnSeekCompleteListener listener):当MediaPlayer调用seek()方法时触发该监听器。
因此可以在创建一个MediaPlayer对象之后,通过为该MediaPlayer绑定监听器来监听相应的事件,例如如下代码:

//为MediaPlayer的播放完成事件绑定事件监听器
mPlayer.setOnErrorListener(new OnErrorListener() {
@Override
publicboolean onError(MediaPlayer mp,int what,int extra) {
//TODO Auto-generated method stub
//针对错误进行相应的处理
// ... ...
}
});
//为MediaPlayer的播放完成讲件绑定市件监听器
mPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
publicvoid onCompletion(MediaPlayer mp) {
//TODO Auto-generated method stub
current++;
prepareAndPlay(current);
}
});

四、MediaPlayer播放不同来源的音频文件:
1.播放应用的资源文件
播放应用的资源文件需要两步即:
1) 调用MediaPlayer的create(Context context,int resid)方法加指定资源文件。
2) 调用 MediaPlayer的 start()、pause()、stop()等方法控制播放即可。
例如如下代码:

MediaPlayer mPlayer=new MediaPlayer();
mPlayer.create(this, R.raw.music);

2. 播放应用的原始资源文件
播放应用的资源文件按如下步骤执行。
1) 调用 Context的 getAssets()方法获取应用的 AssetManager。
2) 调用AssetManager对象的openFd(String name)方法打开指定的原生资源,该方法返回一个AssetFileDescriptor对象。
3) 调用 AssetFileDescriptor的 getFileDescriptor()、getStartOffset()和 getLength()方法来获取音频文件的FileDescriptor、开始位置、长度等。
4) 创建MediaPlayer对象(或利用已有的MediaPlayer对象),并调用MediaPlayer对象的setDataSource(FileDescriptor fd,long offset, long length)方法来装载音频资源。
5) 调用MediaPlayer对象的prepare()方法准备音频。
6) 调用MediaPlayer的start()、pause()、stop()等方法控制播放即可。
例如如下代码片段:

//获取assets目录下指定文件的AssetFileDescriptor对象
AssetFileDescriptor assetFileDescriptor=assetManager.openFd(musics[current]);
mediaPlayer.reset();//初始化mediaPlayer对象
mediaPlayer.setDataSource(assetFileDescriptor.getFileDescriptor(), assetFileDescriptor.getStartOffset(), assetFileDescriptor.getLength());
//准备播放音乐
mediaPlayer.prepare();
//播放音乐
mediaPlayer.start();

3. 播放外部存储器上音频文件
播放外部存储器上音频文件按如下步骤执行。
1) 创建MediaPlayer对象(或利用已有的MediaPlayer对象),并调用MediaPlayer对象的setDateSource(String path)方法装载指定的音频文件。
2) 调用MediaPlayer对象的prepare()方法准备音频。
3) 调用MediaPlayer的start()、pause()、stop()等方法控制播放即可。
例如如下代码:

//加载SD卡上的指定资源音频文件
mPlayer.setDataSource("/mnt/You Are The One.mp3");
mPlayer.prepare();//准备因音频
mPlayer.start();//播放音频

4.播放来自网络的音频文件
播放来自网络的音频文件冇两种方式:1.直接使用MediaPlayer的静态create(Context context, Uri uri)方法;2.调用 MediaPlayer的setDataSource(Context context,Uri uri)装载指定Uri对应的音频文件。
以第二种方式播放来自网络的音频文件的步骤如下。
1. 根据网络上的音频文件所在的位置创建Uri对象。
2. 创建MediaPlayer对象(或利用己有的MediaPlayer对象),并调用MediaPlayer对象的 setDateSource(Context context,Uri uri)方法装载Uri对应的音频文件。
3. 调用MediaPlayer对象的prepare()方法准备音频。
4. 调用MediaPlayer的start()、pause()、stop()等方法控制播放即可。

2. MKV格式的电影用什么播放器放

可以用迅雷影音播放,具体的操作方法和步骤如下:

1、首先,找到要打开的mkv格式的电影文件,如下图所示。

3. c++编写了一个播放器 用的picture控件,想双击它全屏显示,再双击回到原来的状态,

可以参考下面的技术

摘要:本文对在VC下单文档程序的全屏显示及其恢复的实现过程作了介绍。

关键字:窗体、全屏显示、Visual C++

一、 引言

在编辑类软件或程序代码编辑程序中经常要遇到一些长度特别大的文本或代码,尤其是对于程序源码的编辑,如果编辑界面太小,则需要频繁拉动滚动条,对于程序员而言是很不情愿的,因为这样会打断程序的设计思路、影响编程的效果。因此不少软件都具备了全屏放大的功能,将编辑界面放大到全屏幕,尽最大限度地减少对滚动条的依赖程度。相信不少程序员一定非常喜欢在VC的全屏编辑状态下编程,本文就以Visual C++ 6.0为开发环境将普通的单文档编辑视图程序扩展为全屏编辑功能。

二、 程序的设计思路

普通常规程序之所以在最大化的情况下没能实现全屏,是由于状态条、工具条、系统菜单、标题栏等几个窗口分别占据了一部分屏幕空间,所以实现视图的全屏显示首先要把以上几个窗体隐藏起来,然后才可以考虑将视图最大化的问题。

隐藏状态栏、工具条,可以将其当作一个浮动的窗体,只需通过各自的句柄将ShowWindow()函数的参数设成SW_HIDE即可将这几个窗体隐藏,同视图非常类似,在需要显示的时候可以用SW_SHOW标志将其显示出来。在此需要说明的是在进行全屏操作之前需要将当前的视图设置保存好,这在从全屏恢复为原始状态时需要用到。该操作也比较简单,只需简单调用API函数GetWindowRect()即可。至于标题栏的隐藏就不是简单的隐藏窗口了,这涉及到窗体风格的修改,要把WS_CAPTION风格从现有的窗体风格中剥离出来。这可以先用GetWindowLong()获取到当前的窗体风格,然后通过逻辑运算将WS_CAPTION风格从中剥离开来,最后再用SetWindowLong()函数将修改后的窗体风格设置为当前的窗体风格。至于系统菜单的隐藏也可以很方便的加以实现:先保存当前菜单,然后将菜单设置为"空"就实现了菜单的隐藏。各个窗体都隐藏好后剩下的工作就是将编辑视图放大到满屏,可以用this来获取当前的视图指针,并把ShowWindow ()函数的参数设为SW_SHOWMAXIMIZED就最终完成了整个全屏放大的全过程。

至于从全屏恢复到初始状态则完全是上述过程的逆操作:通过逻辑运算把WS_CAPTION风格加入到窗体风格中,恢复标题栏的显示;通过将状态条和工具条的ShowWindow()函数的标志参数设成WM_SHOW将其分别予以恢复;系统菜单也可以通过从保存好的原始菜单中读取并重新设置来恢复其原始面貌。现在仅把隐藏的各个窗体显示了出来,窗体还是处于满屏状态,所以还要通过MoveWindow()函数把窗体的位置恢复到全屏前的状态,这也是我们为何在全屏时要保存窗体的一些原始参数的原因。
三、 程序的具体实现

前面部分在大体思路上对程序的设计实现进行了粗略的分析,但在实际编程中有不少的细节还未考虑进去,下面就根据前面的程序设计思路对其进行编码,并结合其部分关键代码进行讲解说明,以便于更好的理解本程序的实现方法:

全屏显示部分:

//通过设置SW_HIDE参数隐藏当前的工具条、任务栏
m_bToolBarWasVisible=(m_wndToolBar.IsWindowVisible()!=0);
m_wndToolBar.ShowWindow(SW_HIDE);
m_bStatusBarWasVisible=(m_wndStatusBar.IsWindowVisible()!=0);
m_wndStatusBar.ShowWindow(SW_HIDE);
……
//由于在全屏状态下没有系统菜单和工具条,所以需要显示一个浮动的工具条按钮用于//从全屏状态下返回到正常状态。
//首先创建一个工具条对象,并把一个工具条资源装载进来,同时对工具条的风格进行//设置:
m_pwndFullScreenBar=new CToolBar;
m_pwndFullScreenBar->Create(this);
m_pwndFullScreenBar->LoadToolBar(IDR_FULLSCREEN);
m_pwndFullScreenBar->SetBarStyle(m_pwndFullScreenBar->GetBarStyle() |
CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
//浮动按钮的效果
m_pwndFullScreenBar->ModifyStyle(0, TBSTYLE_FLAT);
m_pwndFullScreenBar->EnableDocking(0);
//设置返回到正常状态下的按钮的位置
CPoint pt(300,200);
FloatControlBar(m_pwndFullScreenBar,pt);
//在放大到满屏前预先保存当前的窗口位置
GetWindowRect(&m_mainRect);
//通过改变窗口风格来隐藏标题栏
LONG style=::GetWindowLong(m_hWnd,GWL_STYLE);
style&=~WS_CAPTION;
::SetWindowLong(m_hWnd,GWL_STYLE,style);
int screenx=GetSystemMetrics(SM_CXSCREEN);
int screeny=GetSystemMetrics(SM_CYSCREEN);
//重新改变大小:
SetWindowPos(NULL,0,0,screenx,screeny,SWP_NOZORDER);
style=::GetWindowLong(m_hWnd,GWL_STYLE);
m_bChildMax=(style & WS_MAXIMIZE)?true:false;
//保存原有的系统菜单,并将当前菜单设置为空
CMenu* pOldMenu=GetMenu();
m_OrgMenu.Attach(pOldMenu->Detach());
SetMenu((CMenu*)NULL);
//在其他窗体隐藏好后,将编辑视图放大到满屏
this->ShowWindow (SW_SHOWMAXIMIZED);
……

至于从全屏恢复到初始状态的这部分代码则相对比较简单,只需依次将隐藏的各个窗体和菜单恢复出来并将视图移动到原来大小即可,该段代码许多地方同放大到全屏时的代码相似,只是参数有所差异而已。下面就是恢复部分的主要代码:

……
//将保存的系统菜单恢复出来
SetMenu(&m_OrgMenu);
m_OrgMenu.Detach();
//释放掉在全屏时创建的工具条指针对象,由于是用new创建的,在系统堆中为指针分//配地址空间,在程序退出时不能自动释放,所以必须要用delete显式地进行释放
delete m_pwndFullScreenBar;
//把前面剥离出去的WS_CAPTION风格在加入到窗体风格中。
LONG style=::GetWindowLong(m_hWnd,GWL_STYLE);
style|=WS_CAPTION;
::SetWindowLong(m_hWnd,GWL_STYLE,style);
//显示工具条、任务栏
if(m_bToolBarWasVisible)
m_wndToolBar.ShowWindow(SW_SHOW);
if(m_bStatusBarWasVisible)
m_wndStatusBar.ShowWindow(SW_SHOW);
MoveWindow(&m_mainRect);
RecalcLayout();
……

小结:

本文主要是针对单文档框架的程序进行设计的,由于不涉及到子窗体,因此比较简单。对于多文档的全屏放大,实现方法在总体思路上是与之相一致的。只是在处理全屏显示与恢复时需要将程序子框架也响应的进行放大与缩小,标题栏也要通过改变窗口风格的方式来隐藏与恢复显示。本程序对于其他基于非编辑视图的程序也是适用的。本文所述程序在Windows 2000 Professional下由Microsoft Visual C++ 6.0编译通过。

阅读全文

与程序员播放器相关的资料

热点内容
印度外卖小哥是程序员 浏览:411
绍兴程序员开发驻场流程 浏览:541
索纳塔8的压缩比 浏览:14
私有云主要服务器 浏览:939
为什么主题解压那么慢 浏览:860
怎么下载扫描二维码的手机app 浏览:727
云服务器创建私有镜像的时候一定要关机吗 浏览:115
php开发学习门户 浏览:385
传奇游戏服务器怎么设置 浏览:823
敲击东西解压完整版 浏览:401
刺络学pdf 浏览:868
怎么给手机文件夹设置封面 浏览:931
汽车保养app怎么用 浏览:62
线程javalock 浏览:897
c语言编译运行结果查看器 浏览:112
androidpx转dip 浏览:842
西藏编译局是什么级别 浏览:1001
php提交代码 浏览:598
如何用命令查找并删除代码块 浏览:584
python初学路线图 浏览:536