多媒体概述SoundPool播放音效


package com.example.tyxiong.myapplication;

import android.app.Activity;
import android.content.res.AssetManager;
import android.media.AudioAttributes;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.SoundPool;
import android.os.Build;
import android.os.Bundle;
import android.view.View;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/*多媒体应用开发...
    1 概述:Android提供了常见的音频和视频编码解码机制...
    2 MediaPlayer用来播放音频.
        2缺点:
            1 资源占用量较高,延迟.
            2 无法同时多个音频同时播放
    2静态方法:create()从指定Uri/resid来装载音频文件,并返回MediaPlayer对象.-->start()/stop()/pause()可以进行控制了.

    8实例方法(new对象):4个setDataSource()方法加载音频文件+3个控制方法+ prepare()/真正加载音频文件
        prepareAsync()/异步的不阻塞线程-->start()...可循环加载音频.

    4个注册监听.MediaPlayer还有监听方法...播放完成监听器/播放错误监听器/当调用prepare()监听器/当调用seek()方法监听器.


  常见播放4种资源来源音频文件步骤:
    一 播放应用的资源文件:2步.
        1 create()静态方法,加载资源文件,生成MediaPlayer对象.
        2 start()...

    二 应用原始资源assets目录文件6步:
        1 获取AssetsManager对象, context getAssets()
        2 AssetFileDescriptor对象 实例方法openFd()
        3 FileDescriptor  实例方法getFileDescriptor()
        4 setSourceData()加载音频文件(未真正加载)
        5 prepare()/prepareAsync()加载音频
        6 start()...

    三 SD卡上的资源文件(SD卡上文件访问步骤不包括):31 new MediaPlayer对象,setSourceData()加载资源
        2 prepare()
        3 stat()

    四 网络上的音频文件:31  创建Uri对象; 加载网络资源create()静态方法/setDataSource()实例方法(以下为该方式)
        2  prepare()
        3 start()

//除了原始资源,,,全部为3步..(用create()就无须prepare()2步; 用setSourceData()就要prepare()3步)

音乐特效控制--均衡器 重低音 音场 音乐波形 都依赖于AudioEffect及其子类...

SoundPool 使用场景为密集,播放短促的音效..
4个特点:
    1 利用音乐池来管理多个音效.一开始可加载多个音效
    2 资源占用小
    3 根据音效的Id来播放
    4 可自行设置声音品质,音量,播放比率.

 4个实例方法load()加载资源,--返回值为该音效的ID +1个play(soundId,leftVolume,rightVolume,priority,loop,rate)播放.
 ---通过其内部类Builder来构造实例, 通常用HashMap<int int>来管理声音.
  使用步骤4步:
    1 AudioAttributes对象(利用Builder,设置对象属性(指定用处/指定音效类型),build()对象)
    2 SoundPool.Builder对象, 为SoundPool设置属性(如最大音频数,音效池属性(需要AudioAttributes参数))..),build() SoundPool对象.
    3 对象方法load()返回值为该音效的ID加载资源--HashMap<int,int>来管理
    4 play()插入指定ID音效.

VideoView:与ImageView相似,同为widget包下的组件.. 继承了SurfaceView---View
5个实例方法: setVideoPath()/setVideoURI()加载指定视频+ 3个控制方法
    使用步骤3步:
        1 VideoView实例化,(布局文件中/new)
        2 setVideoXxx()加载视频资源
        3 start()方法...
   以上第3步可,结合MediaController类(提供了友好的图形控制界面,控制视频播放)
        videoView.setMediaController(mController);
        mController.setMediaPlayer(videoView);//播放对象与控制对象相互绑定...

  -推荐--也可以通过MediaPlayer和SurfaceView结合来播放视频,,MediaPlayer可播放音频和视频--没有提供图像输出界面(借助SurfaceView)


  MediaRecorder录制音频: 通过麦克风来录制音频...
  使用步骤8步(3-4顺序)
    1 创建MediaRecorder对象.
    2 对象的setAudioSource()设置声音来源--MediaRecorder.AudioSource.MIC
    3 setOutputFormat()设置音频输出格式
    4 setAudioEncoder()/setAudioEncodingBitRate() 编码格式/编码位率/采样率
    5 setOutputFile() 设置输出路径
    6 prepare()准备
    7 start()开始
    8 stop()停止--release()释放资源.
    ---RECORD_AUDIO录制声音权限






   以下演示soundPool播放音效....

* */
public class MainActivity extends Activity {

    MediaPlayer mediaPlayer;
    SoundPool.Builder builder;
    private AudioAttributes attributes;
    private SoundPool soundPool;
    private AssetManager assets;
    private Map<Integer, Integer> map = new HashMap<>();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//SoundPool.Builder AudioAuttributes 5.0出的.
            builder = new SoundPool.Builder();
            attributes = new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_GAME)
                    .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                    .build();
            builder.setAudioAttributes(attributes);
            soundPool = builder.setMaxStreams(10)
                    .build();

        } else {
            soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 1);

        }


        assets = getAssets();
        try {
            int i = 0;
            String[] list = assets.list("");//assets下有sounds webkit image目录  ""代表assets目录
            //  "abc"代表assets下的abc目录
            for (String temp : list
                    ) {
                if (temp.endsWith(".mp3"))
                    map.put(i++, soundPool.load(assets.openFd(temp), 1));
//                map.size();
            }

        } catch (IOException e) {
            e.printStackTrace();
        }


    }

    public void play0(View view) {
        soundPool.play(map.get(0), 1.0f, 1.0f, 1, 0, 1);
    }


    public void play1(View view) {
        soundPool.play(map.get(1), 1.0f, 1.0f, 1, 0, 1);

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (soundPool != null) {
            soundPool.release();
            soundPool = null;
        }
    }


}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋葵好吃吗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值