Android多媒体-MediaRecorder 录制音视频
不多说,直接上代码,有具体凝视
MyAudioRecord.java
import java.io.File;
import java.io.IOException;
import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
/**
* 这个是利用MediaRecorder类来实现自己的音频录制程序
*
* 为了能够录制音频我们须要RECORD_AUDIO权限
* 为了能够写入SDCard,我们须要WRITE_EXTERNAL_STORAGE权限
* @author Administrator
*
*/
public class MyAudioRecord extends Activity { private TextView stateView; private Button btnStart,btnStop,btnPlay,btnFinish; private MediaRecorder recorder; private MediaPlayer player; private File audioFile; private Uri fileUri; public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.my_audio_record); stateView = (TextView)this.findViewById(R.id.view_state);
stateView.setText("准备開始");
btnStart = (Button)this.findViewById(R.id.btn_start);
btnStop = (Button)this.findViewById(R.id.btn_stop);
btnPlay = (Button)this.findViewById(R.id.btn_play);
btnFinish = (Button)this.findViewById(R.id.btn_finish); btnStop.setEnabled(false);
btnPlay.setEnabled(false); } public void onClick(View v){
int id = v.getId();
switch(id){
case R.id.btn_start:
//開始录制
//我们须要实例化一个MediaRecorder对象,然后进行对应的设置
recorder = new MediaRecorder();
//指定AudioSource 为MIC(Microphone audio source ),这是最长用的
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//setAudioSource/setVedioSource
//指定OutputFormat,我们选择3gp格式
//其它格式,MPEG-4:这将指定录制的文件为mpeg-4格式
//RAW_AMR:录制原始文件,这仅仅支持音频录制,同一时候要求音频编码为AMR_NB
//THREE_GPP:录制后文件是一个3gp文件,支持音频和视频录制
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
//指定Audio编码方式,眼下仅仅有AMR_NB格式
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
//接下来我们须要指定录制后文件的存储路径
File fpath = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/data/files/");
fpath.mkdirs();//创建目录
try {
//创建暂时文件
audioFile = File.createTempFile("recording", ".3gp", fpath);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} recorder.setOutputFile(audioFile.getAbsolutePath()); //以下就開始录制了
try {
recorder.prepare();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} recorder.start(); stateView.setText("正在录制");
btnStart.setEnabled(false);
btnPlay.setEnabled(false);
btnStop.setEnabled(true); break;
case R.id.btn_stop:
recorder.stop();
recorder.release(); //然后我们能够将我们的录制文件存储到MediaStore中
ContentValues values = new ContentValues();
values.put(MediaStore.Audio.Media.TITLE, "this is my first record-audio");
values.put(MediaStore.Audio.Media.DATE_ADDED, System.currentTimeMillis());
values.put(MediaStore.Audio.Media.DATA, audioFile.getAbsolutePath());
fileUri = this.getContentResolver().insert(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, values);
//录制结束后,我们实例化一个MediaPlayer对象,然后准备播放
player = new MediaPlayer();
player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override
public void onCompletion(MediaPlayer arg0) {
//更新状态
stateView.setText("准备录制");
btnPlay.setEnabled(true);
btnStart.setEnabled(true);
btnStop.setEnabled(false);
}
}); //准备播放
try {
player.setDataSource(audioFile.getAbsolutePath());
player.prepare();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} //更新状态
stateView.setText("准备播放");
btnPlay.setEnabled(true);
btnStart.setEnabled(true);
btnStop.setEnabled(false);
break;
case R.id.btn_play:
//播放录音
//注意,我们在录音结束的时候,已经实例化了MediaPlayer,做好了播放的准备
player.start();
//更新状态
stateView.setText("正在播放");
btnStart.setEnabled(false);
btnStop.setEnabled(false);
btnPlay.setEnabled(false); //在播放结束的时候也要更新状态
break;
case R.id.btn_finish:
//完毕录制,返回录制的音频的Uri
Intent intent = new Intent();
intent.setData(fileUri);
this.setResult(RESULT_OK, intent);
this.finish();
break; }
}
}
AndroidManifest.xml
<uses-permission android:name="android.permission.RECORD_AUDIO" />
Android多媒体-MediaRecorder 录制音视频的更多相关文章
- Android 用MediaRecorder录制视频太短崩的问题
具体表现: 调用MediaRecorder的start()与stop()间隔不能小于1秒(有时候大于1秒也崩),否则必崩. 错误信息: java.lang.RuntimeException: stop ...
- Android音视频之MediaRecorder音视频录制
前言: 公司产品有很多地方都需要上传音频视频,今天抽空总结一下音频视频的录制.学习的主角是MediaRecorder类. MediaRecorder类介绍: MediaRecorder类是Androi ...
- Android多媒体录制--MediaRecorder视频录制
Android使用MediaRecorder类进行视频的录制. 需要注意,使用MediaRecorder 录音录像 的设置代码步骤一定要按照API指定的顺序来设置,否则报错 步骤为: 1.设置视频源, ...
- Android 开发 MediaRecorder视频录制入门
前言 MediaRecorder是Android SDK提供用于录制音视频,关于音频的录制在我另一篇博客里已经介绍.传送门: https://www.cnblogs.com/guanxinjing/p ...
- Android 音视频开发(七): 音视频录制流程总结
在前面我们学习和使用了AudioRecord.AudioTrack.Camera.MediaExtractor.MediaMuxer API.MediaCodec. 学习和使用了上述的API之后,相信 ...
- android音视频点/直播模块开发
音视频 版权声明:本文为博主原创文章,未经博主允许不得转载. 前言 随着音视频领域的火热,在很多领域(教育,游戏,娱乐,体育,跑步,餐饮,音乐等)尝试做音视频直播/点播功能,那么作为开发一个小白, ...
- Android 音视频开发学习思路
Android 音视频开发这块目前的确没有比较系统的教程或者书籍,网上的博客文章也都是比较零散的.只能通过一点点的学习和积累把这块的知识串联积累起来. 初级入门篇: Android 音视频开发(一) ...
- Android音视频点/直播模块开发实践总结-zz
随着音视频领域的火热,在很多领域(教育,游戏,娱乐,体育,跑步,餐饮,音乐等)尝试做音视频直播/点播功能.那么作为开发一个小白,如何快速学习音视频基础知识,了解音视频编解码的传输协议,编解码方式,以及 ...
- Android开发 音视频开发需要了解的专业术语知识
前言 在摸索一段时间的音视频开发后,越来越发现这个坑的深度真是特别的深. 除了了解Android自带的音视频处理API以外,还得了解一些视频与音频方面的知识.这篇博客就是主要讲解这方面的专业术语.内容 ...
随机推荐
- boostrap-非常好用但是容易让人忽略的地方------modal
使用bootstrap框架好久了,在开发中也用到了或者遇到了很多的问题,所以跟大家分享一下 bootstrap modal 组件的样式 .modal-lg .modal-sm 说明:这个是bootst ...
- Bob大叔观OO原则
Bob大叔观OO原则 上篇总结了经典的23种 设计模式,详细的解读后期会陆续的详细揭开.使用设计模式的根本原因就是为了增强代码的复用性和可维护性.而面向对象是实现代码复用的有效途径,所以这里有必要了解 ...
- CentOS7 安装spark集群
Spark版本 1.6.0 Scala版本 2.11.7 Zookeeper版本 3.4.7 配置虚拟机 3台虚拟机,sm,sd1,sd2 1. 关闭防火墙 systemctl stop firewa ...
- Scrum总结
Scrum总结一个轻量级的软件开发方法 Scrum是一个敏捷开发框架,是一个增量迭代的开发过程..在这个框架整个开发周期由若干个小的跌代周期,每个小的的跌代周期称为一个Sprint,每个Sprint的 ...
- Meteor全栈开发平台
Meteor全栈开发平台 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,博客地址为http://www.cnblogs.com/jasonno ...
- 【Hibernate步步为营】--复合主键映射具体解释
上篇文章讨论了继承映射,它是对象模型中最主要的特性,对于继承映射它的主要区分是字段类型的不同,所以在生成表结构时须要有新列来标识数据的类型,能够使用<subclass>标签并在标签中加入d ...
- Windows 8 – Reason 442: Failed to enable Virtual Adapter
Cisco VPN on Windows 8.1 – Reason 442: Failed to enable Virtual Adapter https://supertekboy.com/2013 ...
- 解决opengl计算顶点的法线问题
因为需要的论文,最近开始学习OpenGL.由于刚入门的初学者有这么总会遇到很多问题,. 这些天,好不容易才OpenGL个问题弄明确了. 几点迷惑: 在网上百度.发现非常多求平面法向量的介绍以及程序.后 ...
- 【剑指offer】堆栈推弹出序列
转载请注明出处:http://blog.csdn.net/ns_code/article/details/26077863 剑指offer上的第22题,九度OJ上AC. 题目描写叙述: 输入两个整数序 ...
- 【 D3.js 入门系列 --- 9.1 】 生产饼图
我个人的博客: www.ourd3js.com csdn博客为: blog.csdn.net/lzhlzz 转载请注明出处.谢谢. 这一节用 Layout 做一个饼状图.第9节中说过, Layout ...