Hello,大家晚上好,终于又相聚了,分别的这几天里我正在忙于一个叫做加密记事本的小项目,虽然直到今天还没有完善的很好,但是真心说很想大家,所以来和你们分享一下接下来的新知识吧!

今天这一篇就讲讲Android的多媒体吧,我想这一定是大家都很感兴趣的地方吧,是不是有些迫不及待了呢,那就快快开始吧!


一.Android的多媒体基础

1.基本类:有两个基本类是Android框架中用来播放音视频的类;

(1)MediaPlayer:提供了Android播放音视频所需要的所有API;

(2)AudioManager:用来管理音视频资源和音频输出设备;


2.这里详细说一下MediaPlayer的相关知识:

(1)MediaPlayer对象的生命周期:

(2)常用方法:

方法:create(Context context, Uri uri) 方法:create(Context context, Uri uri)
解释:静态方法,通过Uri创建一个多媒体播放器。

方法:create(Context context, int resid)
解释:静态方法,通过资源ID创建一个多媒体播放器

方法:create(Context context, Uri uri, SurfaceHolder holder)
解释:静态方法,通过Uri和指定 SurfaceHolder 【抽象类】 创建一个多媒体播放器

方法: getCurrentPosition()
解释:返回 Int, 得到当前播放位置

方法: getDuration()
解释:返回 Int,得到文件的时间

方法:getVideoHeight()
解释:返回 Int ,得到视频的高度

方法:getVideoWidth()
解释:返回 Int,得到视频的宽度

方法:isLooping()
解释:返回 boolean ,是否循环播放

方法:isPlaying()
解释:返回 boolean,是否正在播放

方法:pause()
解释:无返回值 ,暂停

方法:prepare()
解释:无返回值,准备同步

方法:prepareAsync()
解释:无返回值,准备异步

方法:release()
解释:无返回值,释放 MediaPlayer 对象

方法:reset()
解释:无返回值,重置 MediaPlayer 对象

方法:seekTo(int msec)
解释:无返回值,指定播放的位置(以毫秒为单位的时间)

方法:setAudioStreamType(int streamtype)
解释:无返回值,指定流媒体的类型

方法:setDataSource(String path)
解释:无返回值,设置多媒体数据来源【根据 路径】

方法:setDataSource(FileDescriptor fd, long offset, long length)
解释:无返回值,设置多媒体数据来源【根据 FileDescriptor】

方法:setDataSource(FileDescriptor fd)
解释:无返回值,设置多媒体数据来源【根据 FileDescriptor】

方法:setDataSource(Context context, Uri uri)
解释:无返回值,设置多媒体数据来源【根据 Uri】

方法:setDisplay(SurfaceHolder sh)
解释:无返回值,设置用 SurfaceHolder 来显示多媒体

方法:setLooping(boolean looping)
解释:无返回值,设置是否循环播放

事件:setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListener listener)
解释:监听事件,网络流媒体的缓冲监听

事件:setOnCompletionListener(MediaPlayer.OnCompletionListener listener)
解释:监听事件,网络流媒体播放结束监听

事件:setOnErrorListener(MediaPlayer.OnErrorListener listener)
解释:监听事件,设置错误信息监听

事件:setOnVideoSizeChangedListener(MediaPlayer.OnVideoSizeChangedListener listener)
解释:监听事件,视频尺寸监听

方法:setScreenOnWhilePlaying(boolean screenOn)
解释:无返回值,设置是否使用 SurfaceHolder 显示

方法:setVolume(float leftVolume, float rightVolume)
解释:无返回值,设置音量

方法:start()
解释:无返回值,开始播放

方法:stop()
解释:无返回值,停止播放


二.音频的播放

其实除了这个类还有一个音乐播放类那就是SoundPool,这两个类各有不同分析一下便于大家理解

1.MediaPlayer:

此类适合播放较大文件,此类文件应该存储在SD卡上,而不是在资源文件里,还有此类每次只能播放一个音频文件。

此类用法如下:

(1)从资源文件中播放

MediaPlayer   player  =   new MediaPlayer.create(this,R.raw.test);              player.start();

(2)从文件系统播放

MediaPlayer   player  =   new MediaPlayer();             String  path   =  "/sdcard/test.mp3";              player.setDataSource(path);              player.prepare();              player.start();

(3)从网络播放

(1)通过URI的方式:

String path="http://**************.mp3";     //这里给一个歌曲的网络地址就行了                Uri  uri  =  Uri.parse(path);                MediaPlayer   player  =   new MediaPlayer.create(this,uri);                player.start();

(2)通过设置数据源的方式:

MediaPlayer   player  =   new MediaPlayer.create();            String path="http://**************.mp3";          //这里给一个歌曲的网络地址就行了            player.setDataSource(path);            player.prepare();            player.start();

2.SoundPool:

此类特点就是低延迟播放,适合播放实时音实现同时播放多个声音,如游戏中炸弹的爆炸音等小资源文件,此类音频比较适合放到资源文件夹 res/raw下和程序一起打成APK文件。

用法如下:

SoundPool soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 100);        HashMap<Integer, Integer> soundPoolMap = new HashMap<Integer, Integer>();         soundPoolMap.put(1, soundPool.load(this, R.raw.dingdong1, 1));               soundPoolMap.put(2, soundPool.load(this, R.raw.dingdong2, 2));             public void playSound(int sound, int loop) {            AudioManager mgr = (AudioManager)this.getSystemService(Context.AUDIO_SERVICE);              float streamVolumeCurrent = mgr.getStreamVolume(AudioManager.STREAM_MUSIC);              float streamVolumeMax = mgr.getStreamMaxVolume(AudioManager.STREAM_MUSIC);                 float volume = streamVolumeCurrent/streamVolumeMax;             soundPool.play(soundPoolMap.get(sound), volume, volume, 1, loop, 1f);           //参数:1、Map中取值   2、当前音量     3、最大音量  4、优先级   5、重播次数   6、播放速度}        this.playSound(1, 0);


三.视频播放

1.使用VideoView控件:

(1)MainActivity.java

package com.example.l0905_videoview;import java.io.File;import android.app.Activity;import android.net.Uri;import android.os.Bundle;import android.widget.VideoView;public class MainActivity extends Activity {    private VideoView vv;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        vv=(VideoView) findViewById(R.id.videoView1);        vv.setVideoURI(Uri.fromFile(new File("D:\\english.mp4")));        vv.start();    }}

(2)activitymain.xml

<VideoView    android:id="@+id/videoView1"    android:layout_width="match_parent"    android:layout_height="wrap_content" />

2.SurfaceView+MediaPlayer

(1)MainActivity.java

package com.example.l0905_videoplayer;import java.io.File;import java.io.IOException;import android.app.Activity;import android.media.MediaPlayer;import android.net.Uri;import android.os.Bundle;import android.os.Environment;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MainActivity extends Activity implements OnClickListener{    private Button start,pause,set,stop;    private SurfaceView sv;    private MediaPlayer mp;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        sv=(SurfaceView) findViewById(R.id.surfaceView1);        start=(Button) findViewById(R.id.button1);        pause=(Button) findViewById(R.id.button2);        set=(Button) findViewById(R.id.button3);        stop=(Button) findViewById(R.id.button4);        start.setOnClickListener(this);        pause.setOnClickListener(this);        set.setOnClickListener(this);        stop.setOnClickListener(this);    }    public void play(){        sv.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);        try {            mp.setDataSource(this, Uri.fromFile(new File(/*Environment.getExternalStorageDirectory().getAbsoluteFile()+*/"d:/english.mp4")));            mp.setDisplay(sv.getHolder());            mp.prepare();            mp.start();        } catch (IllegalArgumentException e) {            e.printStackTrace();        } catch (SecurityException e) {            e.printStackTrace();        } catch (IllegalStateException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }    }    public void getPosition(){        if(mp.isPlaying()){            int timeAll=mp.getDuration();            System.out.println(timeAll);            int time=mp.getCurrentPosition();            System.out.println(time);        }    }    @Override    public void onClick(View v) {        switch (v.getId()) {        case R.id.button1:            play();            getPosition();            break;        case R.id.button2:            if(mp.isPlaying()){                mp.pause();            }else{                mp.start();            }            getPosition();            break;        case R.id.button3:            mp.seekTo(60000);            getPosition();            break;        case R.id.button4:            mp.stop();            getPosition();            break;        }    }}

(2)xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    tools:context=".MainActivity" >    <SurfaceView        android:id="@+id/surfaceView1"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_weight="1"/>    <LinearLayout        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:orientation="horizontal" >        <Button            android:id="@+id/button1"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_weight="1"            android:text="开始" />        <Button            android:id="@+id/button2"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_weight="1"            android:text="暂停" />        <Button            android:id="@+id/button3"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_weight="1"            android:text="指定" />        <Button            android:id="@+id/button4"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_weight="1"            android:text="停止" />    </LinearLayout></LinearLayout>


更多相关文章

  1. 关于 android app 返回键模拟 home键 功能的介绍_仿QQ返回键 又
  2. Android热修复(一):底层替换、类加载原理总结 及 DexClassLoader类
  3. 浅析RxJava 1.x&2.x版本区别及原理(三):1.x 版本 Scheduler调度线程
  4. Android(安卓)进阶之了解源码——Activity启动
  5. Android中AsyncTask的简单用法及实现网络图片下载的实例
  6. 查看Android(安卓)API文档的正确方式
  7. Android手势源码浅析-----手势绘制(GestureOverlayView)
  8. Android性能优化篇:Android中如何避免创建不必要的对象
  9. android高仿微信视频编辑页-视频多张图片提取

随机推荐

  1. android 弹出带输入框的对话框
  2. Android(安卓)Crash日志抓取及保存
  3. android中log的使用
  4. Android中对于Geometry对象的字符串化
  5. Android(安卓)启动线程OOM
  6. Android(安卓)三角标签(自定义Textview控
  7. android实现多线程
  8. android apk安装结束的系统广播的监听
  9. Using Intent in an Android(安卓)applic
  10. android之实现各个组件点击事件监听