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));
            }
        }

    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章