11-23 多媒体 MediaPlayer、Camera、MediaRecorder Vitamio 笔记



多媒体

android提供了多媒体框架可以实现音频视频的控制操作,

主要的API类库有:MediaPlayer、Camera、MediaRecorder



1、MediaPlayer的使用



<1>MediaPlayer播放
(1)播放程序本地资源文件
public void playResFileClick(View v){
        mediaPlayer = MediaPlayer.create(this,R.raw.a1);
        mediaPlayer.start();
}
(2)播放SDCard文件
public void playSDcardFileClick(View v){
        mediaPlayer = new MediaPlayer();
        String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC)+"/后会无期.mp3";
        try {
            mediaPlayer.setDataSource(path);
            mediaPlayer.prepare();
        } catch (IOException e) {
            e.printStackTrace();
        }
        mediaPlayer.start();
    }
	
(3)播放网络文件
public void playNetFileClick(View v){
        mediaPlayer = new MediaPlayer();
        String path ="http://cc.stream.qqmusic.qq.com/C100001Orf0q32GTFF.m4a?fromtag=52";
        try {
            mediaPlayer.setDataSource(path);
            mediaPlayer.prepareAsync();//异步缓冲文件
            //异步缓冲监听事件
            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    mp.start();
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }	
	
<2>MediaPlayer状态分析与方法	
参考API文档MediaPlayer的状态图

<3>使用服务控制MediaPlayer


<4>异常事件_唤醒锁_Notification
1>异常事件 implements MediaPlayer.OnErrorListener,在MediaPlayer出现异常时,我们通常
可以重置MediaPlayer对象。在onErrorListener的回调方法中调用mediaPlayer.reset()方法。

2>唤醒锁(了解)
用于保持在媒体播放时,防止屏幕休眠,需要添加权限:
<uses-permission android:name="android.permission.WAKE_LOCK"/>
但需要注意的时,你总是应该在必要的时间解除唤醒锁,否则会消耗电量

3>Notification
播放音乐时,我们可以使用通知的方式,在通知栏添加操作功能,以方便用户控制播放或返回到
播放界面。
   //发一个通知
    private void notification(){

        Notification.Builder builder = new Notification.Builder(this);
        builder.setTicker("我的播放器");
        builder.setSmallIcon(R.mipmap.music_app_80x80);
        builder.setContentTitle("正在播放:后会无期");
        builder.setContentText("邓紫棋");
        Intent intent = new Intent(this,Main2Activity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pi = PendingIntent.getActivity(this,0,intent,0);
        builder.setContentIntent(pi);
        builder.setOngoing(true);
        Notification n = builder.build();
        startForeground(1,n);
        nm.notify(MUSIC_NID,n);
    }

<5>处理音频焦点(了解)
参考PPT

<6>处理噪音
当用户用耳机听音乐时,突然耳机异常中断,导致声音从扬声器中发出,此时可能不是用户想要的
我们把这样的声音理解为噪音,如何处理噪音,我们可以通过系统发出的中断广播来处理:
public class MusicIntentReceiver extends BroadcastReceiver {
    public MusicIntentReceiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if ("android.media.AUDIO_BECOMING_NOISY".equals(action)) {
            Intent service = new Intent(MusicService.ACTION_PAUSE);
            context.startService(service);
        }
    }
}
并在清单文件中注册广播接收器,添加action:
android.media.AUDIO_BECOMING_NOISY

<7>使用CP获取本地媒体
    //初始化音乐数据(从ContentProvider获取本地音乐数据)
    private void initMusicData() {
        ContentResolver cr = getContentResolver();
        Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
        Log.i("MediaUri",uri.toString());
        Cursor c = cr.query(uri,null,
                MediaStore.Audio.Media.IS_MUSIC+"=? and "+MediaStore.Audio.Media.DURATION+">=?" ,
                new String[]{"1","180000"},null);
        if(c==null)return;
        else{
            Music m = null;
            while(c.moveToNext()){
                m = new Music(
                        c.getLong(c.getColumnIndex(MediaStore.Audio.Media._ID)),
                        c.getString(c.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME)),
                        c.getString(c.getColumnIndex(MediaStore.Audio.Media.TITLE)),
                        c.getString(c.getColumnIndex(MediaStore.Audio.Media.ARTIST)));
                musics.add(m);
            }
            c.close();
            if(musics.size()>0){
                musicAdapter.setMusicList(musics);
                musicAdapter.notifyDataSetChanged();
            }
        }
    }


2、Camera



使用摄像头,需要添加权限:
<uses-permission android:name="android.permission.CAMERA" />
SDCard读写:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />


public class CameraActivity extends AppCompatActivity {

	//通过两个类型分别生成保存图片和视频的文件位置 
    private static final int TYPE_CAPTURE_IMAGE = 0x1;
    private static final int TYPE_CAPTURE_VIDEO = 0x2;
	
	//请求编码(用于startActivityForResult方法)
    private static final int REQUEST_CODE_IMAGE = 0x3;
    private static final int REQUEST_CODE_VIDEO = 0x4;
    private ImageView imageView_image_capture;
    private TextView textView_path;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_camera);
        imageView_image_capture = (ImageView) findViewById(R.id.imageView3_image_capture);
        textView_path = (TextView) findViewById(R.id.textView_video_path);
    }

    private File file;
    public void imageCaptureClick(View view){
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        file = getCaptureFile(TYPE_CAPTURE_IMAGE);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
        startActivityForResult(intent,REQUEST_CODE_IMAGE);
    }
    public void videoCaptureClick(View view){
        Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
        file = getCaptureFile(TYPE_CAPTURE_VIDEO);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
        startActivityForResult(intent,REQUEST_CODE_VIDEO);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (resultCode){
            case RESULT_OK:
                if(requestCode==REQUEST_CODE_IMAGE){
                    if(data==null){
                        Log.i("image",file.getAbsolutePath());
                        Log.i("image",file.length()+"");
                        BitmapFactory.Options options = new BitmapFactory.Options();
                        options.inSampleSize = 4;
                        Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath(),options);

                        imageView_image_capture.setImageBitmap(bitmap);
                    }else{
                        Bitmap bitmap = (Bitmap) data.getExtras().get("data");
                        imageView_image_capture.setImageBitmap(bitmap);
                    }
                }else if(requestCode==REQUEST_CODE_VIDEO){
                    textView_path.setText(file.toString());
                }
                break;
        }
    }

    private File getCaptureFile(int type){
        String path = null;
        DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
        String fileName = df.format(new Date());
        switch (type){
            case TYPE_CAPTURE_IMAGE:
                path = Environment.getExternalStoragePublicDirectory(
                        Environment.DIRECTORY_PICTURES)+"/"+fileName+".jpg";
                break;
            case TYPE_CAPTURE_VIDEO:
                path = Environment.getExternalStoragePublicDirectory(
                        Environment.DIRECTORY_MOVIES)+"/"+fileName+".mp4";
                break;
        }
        return new File(path);
    }
}


3、音频录制(了解)



    private void init(){
        mr.reset();
        mr.setAudioSource(MediaRecorder.AudioSource.MIC);//设置音源
        mr.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//文件格式
        mr.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//文件编码
        String path = Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_MUSIC)+"/"+ System.currentTimeMillis()+".mp3";
        mr.setOutputFile(path);
        try {
            mr.prepare();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.button7_start:
                init();
                mr.start();
                button_stop.setEnabled(true);
                button_start.setEnabled(false);
                break;
            case R.id.button8_stop:
                mr.stop();
                button_stop.setEnabled(false);
                button_start.setEnabled(true);
                break;
        }
    }

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

4、Vitamio框架



一个功能强大的多媒体框架,可以支持常用的媒体文件格式,和流媒体。
在项目中集成:
<1>使用AS的添加第三方依赖包:
    compile 'me.neavo:vitamio:4.2.2'
	
<2>在项目的libs目录(注意一定要是libs目录)下添加so库,可以从vitamio源码中的
dist\arm_x86_mips\libs 下把文件复制中libs中

<3>打开工程的清单文件,添加权限:
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

<4>配置一个用于初始化的Activity(由vitamio提供)
        <!-- Don't forgot InitActivity -->
        <activity
            android:name="io.vov.vitamio.activity.InitActivity"
            android:configChanges="orientation|screenSize|smallestScreenSize|keyboard|keyboardHidden|navigation"
            android:launchMode="singleTop"
            android:theme="@android:style/Theme.NoTitleBar"
            android:windowSoftInputMode="stateAlwaysHidden" />
<5>在程序启动时,添加检查是否加载lib库的代码:
通过可以在Activity的基类中的onCreate方法添加以下代码

 if (!LibsChecker.checkVitamioLibs(this))
            return;


API的使用可以参:
https://www.vitamio.org 官网
示例可以参考源码中自带的示例:
vitamio-sample









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值