Android MediaRecorder录制播放音频
2024-08-31 09:26:12
1、请求录制音频权限
<user-permission android:name="android.permission.RECORD_AUDIO"/>
RECORD_AUDIO 权限从6.0后需要进行用户授权,通过ActivityCompat.requestPermissions();
2、创建运行MediaRecorder
2.1 设置音频源setAudioSource(int audio_source) ,多少情况使用MediaRecorder.AudioSource.MIC
2.2 设置输出音频文件格式 setOutputFormat(int output_format)
*(Android 8.0 开始支持MPEG2_TS 格式)
2.3 设置输出文件名 setOutputFile(String filepath)
2.4 设置音频编码器 setAudioEncoder(int audio_encoder)
2.5 通过完成初始化 prepare()
2.6 start()
3 停止释放资源
stop() release()
4、创建MediaPlayer
MediaPlayer mediaPlayer=new MediaPlayer();
mediaPlayer.setDataSource(recordFile.getPath());
mediaPlayer.prepare();
mediaPlayer.start();
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.reset();
}
});
package com.rexkell.mediaapplication; import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button; import java.io.File;
import java.io.IOException; /**
* author: rexkell
* explain:MediaRecord 录制音频
*/
public class MediaRecordActivity extends AppCompatActivity {
private boolean isRecording=false;
MediaRecorder mediaRecorder;
MediaPlayer mediaPlayer;
File recordFile;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ac_mediarecord);
init();
}
public void init(){
mediaRecorder=new MediaRecorder();
//设置音频的来源
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
//设置音频的输出格式
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_WB);
//设置音频文件的编码
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_WB);
mediaPlayer=new MediaPlayer();
recordFile=new File(getExternalFilesDir(null).getPath()+"/test.amr"); }
public void record(View v){
isRecording=!isRecording;
String text=isRecording?"暂停":"录制";
((Button)v).setText(text);
if (isRecording){
startRecord();
}else {
stopRecord();
}
}
public void play(View v){ if (mediaPlayer.isPlaying()){
return;
}
//设置数据源
try {
mediaPlayer.setDataSource(recordFile.getPath());
mediaPlayer.prepare();
mediaPlayer.start();
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.reset();
}
});
} catch (IOException e) {
e.printStackTrace();
} }
public void startRecord(){
if (recordFile.exists()){
recordFile.delete();
}
try {
recordFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
} mediaRecorder.setOutputFile(recordFile.getPath());
try {
mediaRecorder.prepare();
mediaRecorder.start();
} catch (IOException e) {
e.printStackTrace();
}
}
public void stopRecord(){
if (mediaRecorder!=null&&isRecording){
mediaRecorder.stop();
mediaRecorder.release();
mediaRecorder=null;
}
}
public void stopPlay(){
if(mediaPlayer!=null){
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer=null;
}
}
}
最新文章
- SVN部署和使用
- LNMP虚拟机开发环境配置--vagrant+virtualbox+ubuntu14.04
- python——常用功能之文本处理
- 约瑟夫(环)问题(Josephus problem)
- python之fabric(二):执行模式(转)
- JQuery replace 替换全部
- 外卖的撕‘哔’大战 CSU 1559
- Servlet转发和重定向的区别
- VPS 上ubuntu 里搭建VPN服务器
- Linux基础常用命令
- call(),apply()方法解析(一)
- 数据结构:关键路径,利用DFS遍历每一条关键路径JAVA语言实现
- 让自己的开源项目支持CocoaPods
- Educational Codeforces Round 63 (Rated for Div. 2) D. Beautiful Array(动态规划.递推)
- android TextView加载html 过滤所有标签,保留换行标签
- Dynamics 365设置错误通知首选项的方法
- CMDB服务器管理系统【s5day92】:服务器管理回顾
- jQuery 事件 - ready() 方法
- Count the Colors---zoj1610线段树
- CentOS 7.0 防火墙操作
热门文章
- python爬虫爬小说网站涉及到(js加密,CSS加密)
- Java学习 1.2——简述JVM,JRE,JDK的关系
- 易优CMS:if的基础用法
- JS基础语法---arguments对象伪数组
- Dynamics 365 CE Update消息PostOperation阶段Image的尝试
- 【实习第一天】odoo开发基础(一)
- 网络编程~~~ socket(套字节)
- 【转载】Java中的多线程超详细的总结
- 如何使用 TRANSPORTABLE = ALWAYS 将PDB移回Non-CDB (Doc ID 2027352.1)
- SQL注入:POST注入