Android 多媒体——音频播放录制、视频播放、相机

音频的播放和录制

之前介绍的音频的播放使用的是MediaPlayer来播放一些歌曲之类的音频文件,而普通的铃声提示音之类的段音频用它来播放就比较浪费资源了,这里提供一个SoundPool的类来进行短音频的播放

这里只需要在界面上显示一个按钮即可,点击时候可以有播放插入进去的提示音即可

package com.example.administrator.mysoundpool;

import android.media.AudioAttributes;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Build;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    private Button mButtonSoundPool;
    private SoundPool pool=null;
    int voiceID=0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        voiceID= soundPoolPlay();
        mButtonSoundPool= (Button) findViewById(R.id.button_soundPool);
        mButtonSoundPool.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                pool.play(voiceID,1,1,0,-1,1);
            }
        });

    }
    private int soundPoolPlay(){
        if (Build.VERSION.SDK_INT>=21){
            SoundPool.Builder builder=new SoundPool.Builder();
            builder.setMaxStreams(2);
            AudioAttributes.Builder attributes=new AudioAttributes.Builder();
            attributes.setLegacyStreamType(AudioManager.STREAM_MUSIC);
            builder.setAudioAttributes(attributes.build());
            pool=builder.build();
        }else{
            pool=new SoundPool(2,AudioManager.STREAM_MUSIC,0);
        }
        return pool.load(getApplicationContext(),R.raw.outgoing,1);
    }
}

soundPoolPlay()方法主要是用来对soundPool进行一系列的限制,这里需要注意的是sdk版本不同方法不同
API21以下的可以使用其对象直接传入三个参数即可,三个参数分别是:

maxStream —— 同时播放的流的最大数量
streamType —— 流的类型,一般为STREAM_MUSIC(具体在AudioManager类中列出)
srcQuality —— 采样率转化质量,当前无效果,使用0作为默认值

API21以上的就比较麻烦了,但是思路还是一样的,都是设置他的参数,需要使用builder方法。
然后通过load方法加载音频资源
final int play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)

priority —— 流的优先级,值越大优先级高,影响当同时播放数量超出了最大支持数时SoundPool对该流的处理;
loop —— 循环播放的次数,0为值播放一次,-1为无限循环,其他值为播放loop+1次(例如,3为一共播放4次).
rate —— 播放的速率,范围0.5-2.0(0.5为一半速率,1.0为正常速率,2.0为两倍速率)

参考:
http://blog.csdn.net/qduningning/article/details/8680575

音频的录制

在界面上设置两个按钮,一个用来开始录制,一个用来停止录制

package com.example.administrator.mymediarecoder;

import android.app.Activity;
import android.media.MediaRecorder;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;

import java.io.IOException;

public class MainActivity extends Activity implements View.OnClickListener{

    private Button mButtonStartRecode;
    private Button mButtonStopRecode;
    private MediaRecorder mediaRecorder;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mButtonStartRecode= (Button) findViewById(R.id.button_startrecode);
        mButtonStartRecode.setOnClickListener(this);
        mButtonStopRecode= (Button) findViewById(R.id.button_stoprecode);
        mButtonStopRecode.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.button_startrecode:
                mediaRecorder=new MediaRecorder();
                //音频来源
                mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                //音频输出格式
                mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
                //音频编码格式
                mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                mediaRecorder.setOutputFile(Environment.getExternalStorageDirectory()+"/MyFirstRecode.MP4");
                try {
                    mediaRecorder.prepare();
                    mediaRecorder.start();
                } catch (IOException e) {
                    e.printStackTrace();
                }

                break;
            case R.id.button_stoprecode:
                if (mediaRecorder!=null){
                    mediaRecorder.stop();
                    mediaRecorder.reset();
                    mediaRecorder.release();
                }

                break;
            default:
                break;
        }
    }
}

视频播放

package com.example.administrator.myvideoplay;

import android.app.Activity;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.MediaController;
import android.widget.VideoView;

public class MainActivity extends Activity {
    private Button mButtonVideoPlay;
    private VideoView mVideoView;
    //VideoView 是android 系统提供的一个媒体播放显示和控制的控件
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mVideoView= (VideoView) findViewById(R.id.videoview);
        mButtonVideoPlay= (Button) findViewById(R.id.button_videoplay);
        mButtonVideoPlay.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //找到视频地址,还可以通过setVideoUri来找到
                mVideoView.setVideoPath(Environment.getExternalStorageDirectory()+"/DCIM/Camera/video_20150803_164216.mp4");
                mVideoView.setMediaController(new MediaController(MainActivity.this));
                mVideoView.start();
            }
        });
    }
}

MediaController包含了一些典型的按钮,像”播放(Play)/暂停(Pause)”, “倒带(Rewind)”, “快进(Fast Forward)”与进度滑动器(progress slider)。它管理媒体播放器(MediaController)的状态以保持控件的同步。
此外我们还可以使用 SurfaceView来播放视频等,SurfaceView 是个非常重要的绘图容器。

package com.example.administrator.mysurfaceview;

import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;

import java.io.IOException;

public class MainActivity extends AppCompatActivity {
    private Button mButtonSurfaceView;
    private SurfaceView mSurfaceView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mButtonSurfaceView= (Button) findViewById(R.id.button_surfaceView);
        mSurfaceView= (SurfaceView) findViewById(R.id.surfaceView);
        mButtonSurfaceView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MediaPlayer player=new MediaPlayer();
                try {
                    player.setDataSource(Environment.getExternalStorageDirectory()+"/DCIM/Camera/20150423_1707326.3gp");
                    player.setAudioStreamType(AudioManager.STREAM_MUSIC);
                    player.setDisplay(mSurfaceView.getHolder());
                    player.prepare();
                    player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                        @Override
                        public void onPrepared(MediaPlayer mp) {
                            mp.start();
                        }
                    });
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

相机

package com.example.administrator.mycarame;

import android.content.Intent;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

import java.io.File;
import java.io.IOException;

public class MainActivity extends AppCompatActivity {
    private Button mButtonCamera;
    private ImageView mImageView;
    private File file;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mButtonCamera= (Button) findViewById(R.id.button_startcamera);
        mImageView= (ImageView) findViewById(R.id.image_photo);
        mButtonCamera.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent();
                intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
                file=new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".jpg");
                if (file==null){
                    try {
                        file.createNewFile();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));//告诉相机图片保存的位置
                startActivityForResult(intent,0x23);
            }
        });

    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode==0x23){
            if(resultCode==RESULT_OK){
                mImageView.setImageURI(Uri.fromFile(file));
            }
        }

    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值