Android基础_多媒体
一.MediaPlayer
Android的MediaPlayer包含了Audio和video的播放功能,在Android的界面上,Music和Video两个应用程序都是调用MediaPlayer实现的
MediaPlayer在底层是基于OpenCore(PacketVideo)的库实现的
二.创建MediaPlayer实例
1:MediaPlayer mp = new MediaPlayer();
mp.setDataSource("/sdcard/test.mp3");
2:MediaPlayer mp = MediaPlayer.create(this, R.raw.test);
三.MediaPlayer API
Android通过控制播放器的状态的方式来控制媒体文件的播放
prepare()和prepareAsync() 提供了同步和异步两种方式设置播放器进入prepare状态,需要注意的是,如果MediaPlayer实例是由create方法创建的,那么第一次启动播放前不需要再调用prepare()了,因为create方法里已经调用过了。
start()是真正启动文件播放的方法,pause()和stop()比较简单,起到暂停和停止播放的作用,
seekTo()是定位方法,可以让播放器从指定的位置开始播放,需要注意的是该方法是个异步方法,也就是说该方法返回时并不意味着定位完成,尤其是播放的网络文件,真正定位完成时会触发OnSeekComplete.onSeekComplete(),如果需要是可以调用setOnSeekCompleteListener(OnSeekCompleteListener)设置监听器来处理的。
release()可以释放播放器占用的资源,一旦确定不再使用播放器时应当尽早调用它释放资源。
reset()可以使播放器从Error状态中恢复过来,重新会到Idle状态。
四.例子,代码
4.1播放音乐
public class PlayMusicActivity extends Activity {
private SeekBar sb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_play_music);
sb=(SeekBar)findViewById(R.id.sb);
sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
if(mp!=null)
mp.seekTo(seekBar.getProgress());
}
});
}
//播放音乐
MediaPlayer mp;
boolean isRun=true;
public void doPlay(View view){
if(mp!=null)
return;
isRun=true;
mp=new MediaPlayer();//构建一个播放器对象
mp.reset();//点击播放重置
String path= Environment.getExternalStorageDirectory().getAbsolutePath()+"/nobody.mp3";//歌曲的路径
try {
mp.setDataSource(path);//设置要播放的文件路径
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);//设置多媒体类型
mp.prepare();//准备就绪
sb.setMax(mp.getDuration());//设置进度条最大值为音频文件的持续时间
mp.start();//开始播放
//更新进度
new Thread(new Runnable() {
@Override
public void run() {
while(isRun&&mp.getCurrentPosition()<=sb.getMax()){
sb.setProgress(mp.getCurrentPosition());
SystemClock.sleep(200);
}
}
}).start();
} catch (IOException e) {
e.printStackTrace();
}
}
public void doPause(View view){
if(mp==null)
return;
if(mp.isPlaying()){
mp.pause();
((Button)view).setText("继续播放");
}else{
mp.start();
((Button)view).setText("暂停");
}
}
public void doStop(View view){
if(mp!=null&&mp.isPlaying()){
isRun=false;
mp.stop();
mp.release();
mp=null;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
doStop(null);
}
}
4.2播放视频
1.方法一:
//播放视频一
public void playVedio_1(View view){
Intent intent=new Intent(Intent.ACTION_VIEW);
Uri uri= Uri.parse("file:///sdcard/goodmm.mp4");//更换为你自己的路径
intent.setDataAndType(uri,"video/mp4");
startActivity(intent);
}
2.方法二:
//播放视频二
public void playVedio_2(View view){
Intent intent=new Intent(this,PlayVideoActivity.class);
startActivity(intent);
}
public class PlayVideoActivity extends Activity {
private VideoView videoView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_play_video);
videoView=(VideoView)findViewById(R.id.videoView);
videoView.setMediaController(new MediaController(this));
Uri uri= Uri.parse("file:///sdcard/goodmm.mp4");
videoView.setVideoURI(uri);
new Thread(new Runnable() {
@Override
public void run() {
SystemClock.sleep(5000);
runOnUiThread(new Runnable() {
@Override
public void run() {
videoView.setBackground(null);
videoView.start();
}
});
}
}).start();
}
}
3.方法三:
//播放视频三
public void playVedio_3(View view){
Intent intent=new Intent(this,PlayVideo_2Activity.class);
startActivity(intent);
}
public class PlayVideo_2Activity extends Activity {
private MediaPlayer mp;
private SurfaceView sfView;
private SurfaceHolder holder;
private SeekBar sb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_play_video_2);
sb=(SeekBar)findViewById(R.id.sb);
sfView=(SurfaceView)findViewById(R.id.sfView);
holder=sfView.getHolder();
sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
if(mp!=null)
mp.seekTo(seekBar.getProgress());
}
});
}
boolean isRun=true;
public void doPlay(View view){
if(mp!=null)
return;
isRun=true;
mp=new MediaPlayer();
mp.reset();
String path= Environment.getExternalStorageDirectory().getAbsolutePath()+"/goodmm.mp4";
try {
mp.setDataSource(path);//设置数据源
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp.setDisplay(holder);//设置显示位置
mp.prepare();
sb.setMax(mp.getDuration());
sfView.setBackground(null);
mp.start();
new Thread(new Runnable() {
@Override
public void run() {
while (isRun&&mp.getCurrentPosition()<=sb.getMax()){
sb.setProgress(mp.getCurrentPosition());
SystemClock.sleep(200);
}
}
}).start();
} catch (IOException e) {
e.printStackTrace();
}
}
public void doPause(View view){
if(mp==null)
return;
if(mp.isPlaying()){
mp.pause();
((Button)view).setText("继续播放");
}else{
mp.start();
((Button)view).setText("暂停");
}
}
public void doStop(View view){
if(mp!=null&&mp.isPlaying()){
isRun=false;
mp.stop();
mp.release();
mp=null;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
doStop(null);
}
}
4.3录制
MediaRecorder:
Android的MediaRecorder包含了Audio和video的记录功能,在Android的界面上,Music和Video两个应用程序都是调用MediaRecorder实现的。
MediaRecorder在底层是基于OpenCore(PacketVideo)的库实现的。
4.3.1录制音频并播放
//录制音频
public void recorder_test(View view){
Intent intent=new Intent(this,RecorderActivity.class);
startActivity(intent);
}
public class RecorderActivity extends Activity {
private MediaRecorder recorder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recorder);
}
//开始录音
public void doStart(View view){
if(recorder!=null)
return;
recorder=new MediaRecorder();//构建了一个录音设备
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//设置声音来源
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//设置录音文件格式
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);//设置声音编码类型
String path= Environment.getExternalStorageDirectory().getAbsolutePath()+"/luyin.3gp";
recorder.setOutputFile(path);//设置输出文件位置
try {
recorder.prepare();//录音设备就绪
recorder.start();//开始录音
} catch (IOException e) {
e.printStackTrace();
}
}
//录音结束
public void doStop(View view){
if(recorder!=null){
recorder.stop();
recorder.release();
recorder=null;
}
}
//播放录音
MediaPlayer mp;
public void doPlay(View view){
if(mp!=null)
return;
mp=new MediaPlayer();
mp.reset();
String path= Environment.getExternalStorageDirectory().getAbsolutePath()+"/luyin.3gp";
try {
mp.setDataSource(path);
mp.prepare();
mp.start();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
doStop(null);
}
}
4.3.2录制视频并播放
//录制视频
public void recorder_video_test(View view){
Intent intent=new Intent(this,Recorder_VideoActivity.class);
startActivity(intent);
}
public class Recorder_VideoActivity extends Activity {
private MediaPlayer mp;
private SurfaceView sfView;
private SurfaceHolder holder;
private MediaRecorder recorder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recorder__video);
sfView=(SurfaceView)findViewById(R.id.sfView);
holder=sfView.getHolder();
}
//开始录像
public void doStart(View view){
recorder=new MediaRecorder();
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
String path= Environment.getExternalStorageDirectory().getAbsolutePath()+"/luxiang.mp4";
recorder.setOutputFile(path);
recorder.setPreviewDisplay(holder.getSurface());
try {
recorder.prepare();
recorder.start();
} catch (IOException e) {
e.printStackTrace();
}
}
public void doStop(View view){
if(recorder!=null){
try{
recorder.stop();
}catch (Exception ex){
ex.printStackTrace();
}
}
}
public void doPlay(View view){
if(mp!=null)
return;
mp=new MediaPlayer();
mp.reset();
String path= Environment.getExternalStorageDirectory().getAbsolutePath()+"/luxiang.mp4";
try {
mp.setDataSource(path);//设置数据源
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp.setDisplay(holder);//设置显示位置
mp.prepare();
sfView.setBackground(null);
mp.start();
}catch (Exception ex){
ex.printStackTrace();
}
}
}
Android基础_多媒体的更多相关文章
- Android基础_一次上传多张图片
获取权限 <uses-permission android:name="android.permission.CAMERA"/> <uses-permission ...
- 【Xamarin开发 Android 系列 4】 Android 基础知识
原文:[Xamarin开发 Android 系列 4] Android 基础知识 什么是Android? Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Li ...
- Android基础新手教程——4.4.1 ContentProvider初探
Android基础新手教程--4.4.1 ContentProvider初探 标签(空格分隔): Android基础新手教程 本节引言: 本节给大家带来的是Android四大组件中的最后一个--Con ...
- Android基础测试题(四)
看了前两道题大家有没有发现,测试题少了(一),大家猜猜测试题(一)是什么? Android基础测试题(四): 需求: 建一个方法,格式化输出2016-11-14 10:15:26格式的当前时间,然后截 ...
- Android基础测试题(二)
今天给大家带来的是Android基础测试题(二) 题目要求: 定义一个5位长度的整型数组并初始化,然后构建方法根据用户传入的数字判断是否存在数组中,如果存在,返回所在位置,如果不存在,返回-1 首先第 ...
- Mono.Android 基础
Mono.Android 基础 (地址) Mono.Android项目结构是 — Project + Assets + Resources + drawable + layout + values R ...
- 深入理解gradle编译-Android基础篇
深入理解gradle编译-Android基础篇 导读 Gradle基于Groovy的特定领域语言(DSL)编写的一种自动化建构工具,Groovy作为一种高级语言由Java代码实现,本文将对Gradle ...
- android基础---->JSON数据的解析
上篇博客,我们谈到了XML两种常用的解析技术,详细可以参见我的博客(android基础---->XMl数据的解析).网络传输另外一种数据格式JSON就是我们今天要讲的,它是比XML体积更小的数据 ...
- 基础4 Android基础
基础4 Android基础 1. Activity与Fragment的生命周期. Activity生命周期 打开应用 onCreate()->onStart()->onResume 按BA ...
随机推荐
- iOS设计模式之懒加载
一.为什么要懒加载? 答: iPhone设备内存有限,如果在程序在启动后就一次性加载将来会用到的所有资源,那么久可能会耗尽iOS设备的内存.这些资源例如大量的数据,图片,音频,过多的控件等. 二.懒加 ...
- python_web----------数据可视化从0到1的过程
一.数据可视化项目配置 1. django + Echarts 2. 服务器(linux:Ubuntu 17.04 (GNU/Linux 4.10.0-40-generic x86_64)) 3. I ...
- 初次使用Python脚本,proto协议文件转Lua代码
使用IntelliJ IDEA编辑器编写Lua脚本的时候,安装一个插件 "EmmyLua" 可以对有代码提示功能 想把protoBuf协议文件转成Lua代码,然后给出代码提示 第一 ...
- Python 项目实践二(生成数据)第二篇之随机漫步
接着上节继续学习,在本节中,我们将使用Python来生成随机漫步数据,再使用matplotlib以引人瞩目的方式将这些数据呈现出来.随机漫步是这样行走得到的路径:每次行走都完全是随机的,没有明确的方向 ...
- iOS超全开源框架、项目和学习资料汇总--数据库、缓存处理、图像浏览、摄像照相视频音频篇
iOS超全开源框架.项目和学习资料汇总--数据库.缓存处理.图像浏览.摄像照相视频音频篇 感谢:Ming_en_long 的分享 大神超赞的集合,http://www.jianshu.com/p/f3 ...
- 关于Qt Designer程序/UI文件打开未响应的解决方法
最近完成一个项目,到最后关头用QtCreator无法打开UI文件,每次都未响应,用QtDesigner也无法启动 这个问题把我折磨了半天,最后才知道原来是要删除C:\Users\Administrat ...
- windows server 2008 R2服务器安装IIS并添加网站
一.连接远程计算机 1.因为我的电脑是win7系统,故这里以win7为例,其他windows系统大同小异,首先点开开始菜单栏,在windows附件下找到远程桌面连接 或者采用通用的方法,利用快捷键wi ...
- Linux发行版 CentOS6.5 修改默认主机名
修改前准备 我们将主机名修改为comexchan.cnblogs.com(本文发布于http://comexchan.cnblogs.com/) 备份相关配置文件,以便回滚 cp /etc/sysco ...
- python3 python2 import 的区别
https://stackoverflow.com/questions/12172791/changes-in-import-statement-python3
- vim 当前用户显示行号
在 -/.vimrc 中添加 set nu 如果文件不存在可以直接新建这个文件 -表示当前用户的主目录