Android MediaRecorder录音与播放

上一篇讲到了使用意图录音,这篇文章将使用MediaRecorder类来录音,从而提供更多的灵活性。

效果图:

源代码奉上:

<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" >

    <TextView
        android:id="@+id/statusTextView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Status"
        android:gravity="center_horizontal" />

    <Button
        android:id="@+id/button_startRecording"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="开始录音" />

    <Button
        android:id="@+id/button_stopRecording"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="停止录音" />

    <Button
        android:id="@+id/button_playRecording"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="播放录音" />

    <Button
        android:id="@+id/button_finish"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="完成" />

</LinearLayout>

package com.multimediademo9mediarecorder;

import java.io.File;

import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity implements OnClickListener,
		OnCompletionListener {
	private TextView statusTextView;
	private Button button_startRecording, button_stopRecording,
			button_playRecording, button_finish;
	private MediaRecorder recorder;
	private MediaPlayer player;
	private File audioFile;

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

		init();
	}

	/**
	 * 实例化组件
	 */
	private void init() {
		statusTextView = (TextView) findViewById(R.id.statusTextView);
		// 当运行Activity时,将statusTextView的文本设置为“Ready”。
		statusTextView.setText("Ready");

		button_startRecording = (Button) findViewById(R.id.button_startRecording);
		button_playRecording = (Button) findViewById(R.id.button_playRecording);
		button_stopRecording = (Button) findViewById(R.id.button_stopRecording);
		button_finish = (Button) findViewById(R.id.button_finish);

		button_startRecording.setOnClickListener(this);
		button_playRecording.setOnClickListener(this);
		button_stopRecording.setOnClickListener(this);
		button_finish.setOnClickListener(this);

		button_playRecording.setEnabled(false);
		button_stopRecording.setEnabled(false);

		player = new MediaPlayer();
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.button_startRecording:
			try {
				/**
				 * 当点击开始录音按钮时,将构造一个新的MediaRecorder,并调用setAudioSource、
				 * setOutputFormat和setAudioEncoder方法。
				 */
				recorder = new MediaRecorder();
				recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
				recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
				recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
				/**
				 * 然后在SD卡上创建一个新的File对象,并调用MediaRecorder对象上的setOutputFile方法。
				 */
				File path = new File(Environment.getExternalStorageDirectory()
						.getAbsoluteFile() + "/files/");
				path.mkdir();
				audioFile = File.createTempFile("recording", ".3gp", path);
				recorder.setOutputFile(audioFile.getAbsolutePath());
				/**
				 * 调用MediaRecorder上的prepare方法,并开始录制。
				 */
				recorder.prepare();
				recorder.start();
				/**
				 * 最后更新statusTextView,并且更改那些按钮会被启用或禁用。
				 */
				statusTextView.setText("Recording");
				button_playRecording.setEnabled(false);
				button_stopRecording.setEnabled(true);
				button_startRecording.setEnabled(false);
			} catch (Exception e) {
				e.printStackTrace();
			}
			break;
		case R.id.button_playRecording:
			/**
			 * 播放录音,使用MediaPlayer构造的对象player
			 */
			player.start();
			statusTextView.setText("playing");
			button_playRecording.setEnabled(false);
			button_stopRecording.setEnabled(false);
			button_startRecording.setEnabled(false);
			break;
		case R.id.button_stopRecording:
			/**
			 * 停止录制,并释放MediaRecorder对象。
			 */
			try {
				recorder.stop();
				recorder.release();

				player.setOnCompletionListener(this);
				player.setDataSource(audioFile.getAbsolutePath());
				player.prepare();
				statusTextView.setText("Ready to Play!!");
				button_playRecording.setEnabled(true);
				button_stopRecording.setEnabled(false);
				button_stopRecording.setEnabled(false);
			} catch (Exception e) {
				e.printStackTrace();
			}
			break;
		case R.id.button_finish:
			finish();
			break;
		default:
			break;
		}
	}

	@Override
	public void onCompletion(MediaPlayer mp) {
		button_playRecording.setEnabled(true);
		button_startRecording.setEnabled(true);
		button_stopRecording.setEnabled(false);
		statusTextView.setText("Ready...");
	}

}

源代码下载:

点击下载源码

Android MediaRecorder录音与播放

时间: 2024-10-18 20:23:40

Android MediaRecorder录音与播放的相关文章

Android 音频录音与播放

原文链接:https://www.jianshu.com/p/5966ed7c5baf 介绍音频的采集.编码.生成文件.转码等操作,通过 AudioRecord 采集音频,生成三种格式的文件格式(pcm.wav.aac),用 AudioStack 来播放这个音频. 一.PCM .WAV.AAC 的文件头介绍 这里简单的介绍一下常见的三种音频格式: PCM :PCM(Pulse Code Modulation--脉码调制录音).所谓 PCM 录音就是将声音等模拟信号变成符号化的脉冲列,使用三个參数

Android 自定义录音、播放动画View,让你的录音浪起来

最近公司项目有一个录音的录制和播放动画需求,然后时间是那么紧,那么赶紧开撸. 先看效果图 嗯,然后大致就是这样,按住录音,然后有一个倒计时,最外层一个进度条,还有一个类似模拟声波的动画效果(其实中间的波浪会根据声音的大小浪起来的~) 2 实现思路 然后,我们适当的来分析一下这个录音动画的实现方式.这个肯定是通过自定义控件,咱们来把这个效果完完全全画出来. 大致包括以下几个点: 1. 最外层的进度条,最坑的就是一开始的一个渐变的效果 2. 然后进度条最前方是有一个点的(我肯定选择用图片来实现) 3

Android 录音(MediaRecorder)与播放(MediaPlayer)

通过MediaRecorder和MediaPlayer实现声音的录制和播放,代码比较简单,直接贴代码.xml文件里面只有四个按钮就不贴了. UI 代码: VoiceActivity.class package com.zy.ione; import com.zy.media.UPlayer; import com.zy.media.URecorder; import android.app.Activity; import android.os.Bundle; import android.os

Android开发教程 录音和播放

首先要了解andriod开发中andriod多媒体框架包含了什么,它包含了获取和编码多种音频格式的支持,因此你几耍轻松把音频合并到你的应用中,若设备支持,使用MediaRecorder APIs便可以完成录音. 本文将会为你展示一下,如何写一个应用从设备上的microphone获取音频,并进行保存和回放.注意哈Android模拟器,是不具有录音的功能的,不过呢真实的设备一般都具有此功能. 如何进行音频获取 从设备获取音频比回放音频或视频要复杂一点,但是也还算简单: 创建一个android.med

Android 实时录音和回放,边录音边播放 (KTV回音效果)

1.AndioRecord类介绍 AndioRecord类的主要功能是让各种JAVA应用能够管理音频资源,以便它们通过此类能够录制平台的声音输入硬件所收集的声音.此功能的实现就是通过”pulling同步”(reading读取)AudioRecord对象的声音数据来完成的.在录音过程中,应用所需要做的就是通过后面三个类方法中的一个去及时地获取AudioRecord对象的录音数据. AudioRecord类提供的三个获取声音数据的方法分别是read(byte[], int, int), read(s

Android 使用MediaRecorder录音

package com.example.HyyRecord; import android.app.Activity; import android.content.Intent; import android.media.MediaRecorder; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.view.View; import java.io.F

Android调用手机摄像头使用MediaRecorder录像并播放

最近在项目开发中需要调用系统的摄像头录像并播放. 在开发中遇到了两个问题,记录下: (1)开发过程中出现摄像头占用,启动失败,报错.但是我已经在onDestory()中关闭了资源. 报错原因:打开程序,调用摄像头,按Home键再打开程序调用,报错摄像头被占用. 解决:在onStop()中关闭资源,在onResume()中判断是否为null,否则实例化资源. (2)其中我录像播放的代码写在Fragment+ViewPager中,在来回切换Fragment的时候,摄像头只能调用一次,并且所在的Fra

MT6737 Android N 平台 Audio系统学习----录音到播放录音流程分析

http://blog.csdn.net/u014310046/article/details/54133688 本文将从主mic录音到播放流程来进行学习mtk audio系统架构.  在AudioFlinger::RecordThread::threadLoop中会调用mInput->stream->read读取数据,stream就是audio_stream_in_t类型的指针,在执行open_input_stream时被初始化,先在它其实是一个legacy_stream_in类型的指针.当

Android MediaRecorder实现暂停断点录音功能

基本原理如下:MediaRecorder通过MIC录音,系统没有自带的pause功能,每次暂停录音,都会结束本次的录音.现在本人的设计思路是:MediaRecorder录音暂停时,保存这段所录下的音频A,继续录音后,再次暂停,保留录音音频B:以此类推直到最终的录音结束时,依次读取之前保存的A.B……的录音文件,并将其合并在一起.涉及的技术:文件的保存读取.音频的合并等 音频的合并:设置MediaRecorder的音频输出格式mMediaRecorder01.setOutputFormat(Med