录音与播放——(AudioRecord & AudioTrack)
作者:追风剑情 发布于:2016-6-13 17:55 分类:Android
添加权限
- <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
- <uses-permission android:name="android.permission.RECORD_AUDIO" />
1、新建活动
fragment_audio_main.xml
- <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:paddingBottom="@dimen/activity_vertical_margin"
- android:paddingLeft="@dimen/activity_horizontal_margin"
- android:paddingRight="@dimen/activity_horizontal_margin"
- android:paddingTop="@dimen/activity_vertical_margin"
- tools:context="com.test.androidtest.AudioMainActivity$PlaceholderFragment" >
- <Button
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="开始录音"
- android:onClick="startRecording" />
- <Button
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="停止录音"
- android:onClick="stopRecording" />
- <Button
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="播放录音"
- android:onClick="playRecording" />
- </LinearLayout>
代码
- package com.test.androidtest;
- import java.io.BufferedInputStream;
- import java.io.BufferedOutputStream;
- import java.io.DataInputStream;
- import java.io.DataOutputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import android.app.Activity;
- import android.media.AudioFormat;
- import android.media.AudioManager;
- import android.media.AudioRecord;
- import android.media.AudioTrack;
- import android.media.MediaRecorder;
- import android.os.Bundle;
- import android.os.Environment;
- import android.util.Log;
- import android.view.View;
- public class AudioMainActivity extends Activity {
- //以下值会影响所录制音频的大小和质量
- //采样频率
- private int frequency = 11025;
- //声道配置
- private int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;
- //音频编码
- private int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
- private boolean isRecording = false;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.fragment_audio_main);
- }
- public void startRecording(View view)
- {
- Log.d("test", "开始录音");
- Thread thread=new Thread(new Runnable()
- {
- @Override
- public void run()
- {
- File file = new File(Environment.getExternalStorageDirectory(), "raw.pcm");//保存在SD卡上
- try{
- file.createNewFile();
- }catch(IOException e){
- Log.e("test", "IO Exception", e);
- }
- try{
- OutputStream os = new FileOutputStream(file);
- BufferedOutputStream bos = new BufferedOutputStream(os);
- DataOutputStream dos = new DataOutputStream(bos);
- int bufferSize = AudioRecord.getMinBufferSize(frequency, channelConfiguration, audioEncoding);
- short[] buffer = new short[bufferSize];
- //创建一个新的AudioRecord对象来录制音频
- AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,//从麦克风录制原始音频
- frequency,
- channelConfiguration,
- audioEncoding, bufferSize);
- audioRecord.startRecording();//开始异步录制
- isRecording = true;
- while(isRecording){
- int bufferReadResult = audioRecord.read(buffer, 0, bufferSize);
- Log.d("test", "bufferReadResult="+bufferReadResult);
- for(int i=0; i<bufferReadResult; i++)
- dos.writeShort(buffer[i]);
- }
- audioRecord.stop();
- dos.flush();
- dos.close();
- }catch(Throwable t){
- Log.e("test", "An error occurred during recording", t);
- }
- }
- });
- thread.start();
- }
- public void stopRecording(View view)
- {
- Log.d("test", "停止录音");
- isRecording = false;
- }
- public void playRecording(View view)
- {
- Log.d("test", "播放录音");
- File file = new File(Environment.getExternalStorageDirectory(), "raw.pcm");
- //用于存储音轨的short数组(每个short占用16位,即2个字节)
- int audioLength = (int)(file.length()/2);
- short[] audio = new short[audioLength];
- try{
- InputStream is = new FileInputStream(file);
- BufferedInputStream bis = new BufferedInputStream(is);
- DataInputStream dis = new DataInputStream(bis);
- int i = 0;
- while(dis.available() > 0){
- audio[i] = dis.readShort();
- i++;
- }
- //关闭输入流
- dis.close();
- //创建和播放新的AudioTrack对象
- //由于录制的原始音频没有关联元数据,因此必须将音频的数据属性设为与录制时相同
- AudioTrack audioTrack = new AudioTrack(
- AudioManager.STREAM_MUSIC,//流模式
- frequency,//频率
- channelConfiguration,//声道配置
- audioEncoding,//音频编码类型
- audioLength,//要播放的音频的长度
- AudioTrack.MODE_STREAM);
- audioTrack.play();//异步播放
- audioTrack.write(audio, 0, audioLength);//将原始音频数据添加到播放缓冲区
- }catch(Throwable t){
- Log.d("test", "An error occurred during playback", t);
- }
- }
- }
运行效果
标签: Android
日历
最新文章
随机文章
热门文章
分类
存档
- 2025年3月(4)
- 2025年2月(3)
- 2025年1月(1)
- 2024年12月(5)
- 2024年11月(5)
- 2024年10月(5)
- 2024年9月(3)
- 2024年8月(3)
- 2024年7月(11)
- 2024年6月(3)
- 2024年5月(9)
- 2024年4月(10)
- 2024年3月(11)
- 2024年2月(24)
- 2024年1月(12)
- 2023年12月(3)
- 2023年11月(9)
- 2023年10月(7)
- 2023年9月(2)
- 2023年8月(7)
- 2023年7月(9)
- 2023年6月(6)
- 2023年5月(7)
- 2023年4月(11)
- 2023年3月(6)
- 2023年2月(11)
- 2023年1月(8)
- 2022年12月(2)
- 2022年11月(4)
- 2022年10月(10)
- 2022年9月(2)
- 2022年8月(13)
- 2022年7月(7)
- 2022年6月(11)
- 2022年5月(18)
- 2022年4月(29)
- 2022年3月(5)
- 2022年2月(6)
- 2022年1月(8)
- 2021年12月(5)
- 2021年11月(3)
- 2021年10月(4)
- 2021年9月(9)
- 2021年8月(14)
- 2021年7月(8)
- 2021年6月(5)
- 2021年5月(2)
- 2021年4月(3)
- 2021年3月(7)
- 2021年2月(2)
- 2021年1月(8)
- 2020年12月(7)
- 2020年11月(2)
- 2020年10月(6)
- 2020年9月(9)
- 2020年8月(10)
- 2020年7月(9)
- 2020年6月(18)
- 2020年5月(4)
- 2020年4月(25)
- 2020年3月(38)
- 2020年1月(21)
- 2019年12月(13)
- 2019年11月(29)
- 2019年10月(44)
- 2019年9月(17)
- 2019年8月(18)
- 2019年7月(25)
- 2019年6月(25)
- 2019年5月(17)
- 2019年4月(10)
- 2019年3月(36)
- 2019年2月(35)
- 2019年1月(28)
- 2018年12月(30)
- 2018年11月(22)
- 2018年10月(4)
- 2018年9月(7)
- 2018年8月(13)
- 2018年7月(13)
- 2018年6月(6)
- 2018年5月(5)
- 2018年4月(13)
- 2018年3月(5)
- 2018年2月(3)
- 2018年1月(8)
- 2017年12月(35)
- 2017年11月(17)
- 2017年10月(16)
- 2017年9月(17)
- 2017年8月(20)
- 2017年7月(34)
- 2017年6月(17)
- 2017年5月(15)
- 2017年4月(32)
- 2017年3月(8)
- 2017年2月(2)
- 2017年1月(5)
- 2016年12月(14)
- 2016年11月(26)
- 2016年10月(12)
- 2016年9月(25)
- 2016年8月(32)
- 2016年7月(14)
- 2016年6月(21)
- 2016年5月(17)
- 2016年4月(13)
- 2016年3月(8)
- 2016年2月(8)
- 2016年1月(18)
- 2015年12月(13)
- 2015年11月(15)
- 2015年10月(12)
- 2015年9月(18)
- 2015年8月(21)
- 2015年7月(35)
- 2015年6月(13)
- 2015年5月(9)
- 2015年4月(4)
- 2015年3月(5)
- 2015年2月(4)
- 2015年1月(13)
- 2014年12月(7)
- 2014年11月(5)
- 2014年10月(4)
- 2014年9月(8)
- 2014年8月(16)
- 2014年7月(26)
- 2014年6月(22)
- 2014年5月(28)
- 2014年4月(15)
友情链接
- Unity官网
- Unity圣典
- Unity在线手册
- Unity中文手册(圣典)
- Unity官方中文论坛
- Unity游戏蛮牛用户文档
- Unity下载存档
- Unity引擎源码下载
- Unity服务
- Unity Ads
- wiki.unity3d
- Visual Studio Code官网
- SenseAR开发文档
- MSDN
- C# 参考
- C# 编程指南
- .NET Framework类库
- .NET 文档
- .NET 开发
- WPF官方文档
- uLua
- xLua
- SharpZipLib
- Protobuf-net
- Protobuf.js
- OpenSSL
- OPEN CASCADE
- JSON
- MessagePack
- C在线工具
- 游戏蛮牛
- GreenVPN
- 聚合数据
- 热云
- 融云
- 腾讯云
- 腾讯开放平台
- 腾讯游戏服务
- 腾讯游戏开发者平台
- 腾讯课堂
- 微信开放平台
- 腾讯实时音视频
- 腾讯即时通信IM
- 微信公众平台技术文档
- 白鹭引擎官网
- 白鹭引擎开放平台
- 白鹭引擎开发文档
- FairyGUI编辑器
- PureMVC-TypeScript
- 讯飞开放平台
- 亲加通讯云
- Cygwin
- Mono开发者联盟
- Scut游戏服务器引擎
- KBEngine游戏服务器引擎
- Photon游戏服务器引擎
- 码云
- SharpSvn
- 腾讯bugly
- 4399原创平台
- 开源中国
- Firebase
- Firebase-Admob-Unity
- google-services-unity
- Firebase SDK for Unity
- Google-Firebase-SDK
- AppsFlyer SDK
- android-repository
- CQASO
- Facebook开发者平台
- gradle下载
- GradleBuildTool下载
- Android Developers
- Google中国开发者
- AndroidDevTools
- Android社区
- Android开发工具
- Google Play Games Services
- Google商店
- Google APIs for Android
- 金钱豹VPN
- TouchSense SDK
- MakeHuman
- Online RSA Key Converter
- Windows UWP应用
- Visual Studio For Unity
- Open CASCADE Technology
- 慕课网
- 阿里云服务器ECS
- 在线免费文字转语音系统
- AI Studio
- 网云穿
- 百度网盘开放平台
- 迅捷画图
- 菜鸟工具
- [CSDN] 程序员研修院
- 华为人脸识别
- 百度AR导航导览SDK
- 海康威视官网
- 海康开放平台
- 海康SDK下载
- git download
- Open CASCADE
- CascadeStudio
交流QQ群
-
Flash游戏设计: 86184192
Unity游戏设计: 171855449
游戏设计订阅号
