利用MediaRecoder类进行音频录制,自己试试哦

Media-Recorder-API-Demo:MediaStream Recording API的实现 Media Recorder API演示 (新) (也称为MediaStream Recording API)的演示实现。 工作于: Firefox 30+ Chrome 47,48(仅视频,启用chrome:// flags的实验性Web平台功能) Chrome49+ 容器和编解码器: Chrome 52+:webm,VP8 / VP9 / H.264,Opus @ 48kHz Chrome 49+:webm,VP8 / VP9,Opus @ 48kHz Firefox 30+:webm,VP8,Vorbis @ 44.1 kHz 问题: 暂停不会停止Chrome 49,50上的音频录制 链接: 立即下载

媒体录制类:android.media.MediaRecoder类,可以实现音频和视频文件的录制。生命周期:

a.Initial状态:当用户通过MediaRecoder类的构造方法实例化MediaRecoder类对象时出于初始化状态,即便此时没有任何操作,MediaRecoder也会占用系统资源,而所有的状态都可以通过reset()方法返回到此状态。

b.Initialized状态:当用户使用setAudioSource()或setVideoSource()方法后将进入音频录制或视频录制状态,并可以指定一些音频或视频的文件属性,设置完成后将进入DataSourceConfigured状态。

c.Prepared状态:就绪状态。当用户使用MediaRecoder类中的prepare()方法时将进入就绪状态,表示录制前的状态已经准备就绪。

d.Recording状态:录制状态。当用户使用MediaRecoder类中的start()方法时将进入录制状态,并且一直持续到录音或录像操作完毕。


代码:

(1)定义列表显示布局管理器----recordfiles.xml

<?xmlversion="1.0" encoding="utf-8"?>

<TableLayout

    xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent">

    <TableRow>

        <ImageView

            android:id="@+id/icon"

            android:layout_width="fill_parent"

            android:layout_height="wrap_content"

            android:src="@drawable/file_icon"/>

        <TextView

            android:id="@+id/filename"

            android:textSize="16px"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"/>

    </TableRow>

</TableLayout>

(2)main.xml

<?xmlversion="1.0" encoding="utf-8"?>

<LinearLayout

    xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent">

    <LinearLayout 

xmlns:android="http://schemas.android.com/apk/res/android"

        android:orientation="horizontal"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content">

        <ImageButton

            android:id="@+id/record"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:src="@drawable/record"/>

        <ImageButton

            android:id="@+id/stop"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:src="@drawable/stop"/>

    </LinearLayout>

    <TextView

        android:id="@+id/info"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:text="文字提示信息..." />

    <ListView

        android:id="@+id/reclist"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"/>

</LinearLayout>

(3)主程序:

publicclass MyMediaRecorderDemo extends Activity {

    private ImageButton record = null;

    private ImageButton stop = null;

    private TextView info = null;

    private ListView reclist = null;//定义列表视图

    private SimpleAdapter recordSimpleAdapter =null;//适配器

    private MediaRecorder mediaRecorder = null;

    private boolean sdcardExists = false; // 判断sd卡是否存在

    private File recordAudioSaveFileDir = null;// 保存所有音频文件的文件夹

    private File recordAudioSaveFile = null;    // 每次保存音频文件的名称

    private String recordAudioSaveFileName =null;  // 每次保存音频文件的名称

    private String recDir = "mldnrec";// 保存的目录名称

    private boolean isRecord = false ;  // 录音的标志

    private List<Map<String,Object>>recordFiles = null ;

 

    @Override

    public void onCreate(BundlesavedInstanceState) {

        super.onCreate(savedInstanceState);

super.setContentView(R.layout.main);

        this.record = (ImageButton)super.findViewById(R.id.record);

        this.stop = (ImageButton)super.findViewById(R.id.stop);

        this.info = (TextView) super.findViewById(R.id.info);

        this.reclist = (ListView)super.findViewById(R.id.reclist);

        // 如果存在则将状态给了sdcardExists属性

        if ((this.sdcardExists =Environment.getExternalStorageState().equals(

                Environment.MEDIA_MOUNTED))) {// 判断sd卡是否存在

            this.recordAudioSaveFileDir = newFile(Environment

                    .getExternalStorageDirectory().toString()

                    +File.separator

                +MyMediaRecorderDemo.this.recDir + File.separator);//保存录音文件

            if(!this.recordAudioSaveFileDir.exists()) { // 文件夹不存在

                this.recordAudioSaveFileDir.mkdirs();// 创建文件夹

            }

        }

        this.stop.setEnabled(false) ;   // 暂停按钮现在不可用

        this.record.setOnClickListener(newRecordOnClickListenerImpl());

        this.stop.setOnClickListener(newStopOnClickListenerImpl());

        this.reclist.setOnItemClickListener(newOnItemClickListenerImpl()) ;

        this.getRecordFiles() ;

    }

 

    private class RecordOnClickListenerImplimplements OnClickListener {

 

        @Override

        public void onClick(View v) {

            if(MyMediaRecorderDemo.this.sdcardExists){ // 如果sd卡存在

                MyMediaRecorderDemo.this.recordAudioSaveFileName= MyMediaRecorderDemo.this.recordAudioSaveFileDir

                        .toString()

                        + File.separator

                        +"MLDNRecord_"

                        +System.currentTimeMillis() + ".3gp";  //每次的录音文件名称都不一样

                MyMediaRecorderDemo.this.recordAudioSaveFile= new File(

                MyMediaRecorderDemo.this.recordAudioSaveFileName);//取得保存路径

                MyMediaRecorderDemo.this.mediaRecorder= new MediaRecorder(); // 实例化对象

                // 在进行录制之前必须配置若干个参数

                MyMediaRecorderDemo.this.mediaRecorder

                        .setAudioSource(MediaRecorder.AudioSource.MIC);// 音频来源是MIC

                MyMediaRecorderDemo.this.mediaRecorder

    .setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//定义输出格式

                MyMediaRecorderDemo.this.mediaRecorder

        .setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);//定义音频编码

                MyMediaRecorderDemo.this.mediaRecorder          .setOutputFile(MyMediaRecorderDemo.this.recordAudioSaveFileName);//定义输出文件

                try {   // 进入到就绪状态

                    MyMediaRecorderDemo.this.mediaRecorder.prepare();

                } catch (Exception e) {

                    //Log.i("MyMediaRecorderDemo", e.toString()) ;

                }

                MyMediaRecorderDemo.this.mediaRecorder.start();    // 开始录音

                MyMediaRecorderDemo.this.info.setText("正在录音中...") ;

                MyMediaRecorderDemo.this.stop.setEnabled(true);// 停止录音按钮可以使用了

                MyMediaRecorderDemo.this.record.setEnabled(false);//录音按钮禁用

                MyMediaRecorderDemo.this.isRecord= true ;  // 正在录音

            }

        }

    }

 

    private class StopOnClickListenerImplimplements OnClickListener {

        @Override

        public void onClick(View v) {

            if(MyMediaRecorderDemo.this.isRecord){ // 正在录音

                MyMediaRecorderDemo.this.mediaRecorder.stop(); // 停止

                MyMediaRecorderDemo.this.mediaRecorder.release();  // 释放资源

                MyMediaRecorderDemo.this.record.setEnabled(true);//录音按钮启用

                MyMediaRecorderDemo.this.stop.setEnabled(false);//

                MyMediaRecorderDemo.this.info.setText("录音结束,文件路径为:"

                        +MyMediaRecorderDemo.this.recordAudioSaveFileName);

                MyMediaRecorderDemo.this.getRecordFiles();//重新加载列表

            }

        }

    }

   

    private void getRecordFiles(){  // 将一个文件夹之中的全部文件列出

        this.recordFiles = newArrayList<Map<String, Object>>();

        if(this.sdcardExists) { // 有sd卡存在

            File files [] =this.recordAudioSaveFileDir.listFiles() ;   //列出目录中的文件

            for (int x = 0; x < files.length;x++) {

                Map<String, Object>fileInfo = new HashMap<String, Object>();

                fileInfo.put("filename",files[x].getName()) ;

        this.recordFiles.add(fileInfo) ;//保存数据

            }

            this.recordSimpleAdapter = newSimpleAdapter(this,

                    this.recordFiles,R.layout.recordfiles,

                    new String[] {"filename" }, new int[] { R.id.filename });

            this.reclist.setAdapter(this.recordSimpleAdapter);//定义列表视图

        }

    }

    private class OnItemClickListenerImplimplements OnItemClickListener {

 

        @Override

        public voidonItemClick(AdapterView<?> parent, View view, int position,

                long id) {

            if(MyMediaRecorderDemo.this.recordSimpleAdapter.getItem(position) instanceof Map){

                Map<?, ?> map = (Map<?,?>) MyMediaRecorderDemo.this.recordSimpleAdapter

                        .getItem(position);//取出指定位置的内容

                Uri uri = Uri

                        .fromFile(newFile(MyMediaRecorderDemo.this.recordAudioSaveFileDir

                                .toString()

                                + File.separator

                                +map.get("filename")));//定义操作的Uri

                Intent intent = newIntent(Intent.ACTION_VIEW) ; //指定Action

                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//增加标记

                intent.setDataAndType(uri,"audio/mp3") ;//设置数据播放的MIME

                MyMediaRecorderDemo.this.startActivity(intent);//穷Activity

            }

        }

    }

}
MediaRecoderDemo 利用MediaRecorder进行音频的采集 立即下载

相关推荐

android用MediaRecoder录制音频

android用MediaRecoder录制音频,生成MP3文件

MediaRecorder录制视频和录音

一、MediaRecorder作用 1、MediaRecorder可以实现直接录制视频,不能对每一帧数据进行处理。如果对每一帧数据都能进行处理的话,有两种选择:1.MediaCodec 2.FFMpeg_x264/openh264 二、使用到的权限 <user-permission android:name="android.permission.RECORD_AUdio"/> &l...

wq892373445的博客 1964

基于android视频通话及录音实现

实现视频通话源代码。 android 通话录音实现。 因受系统限制,只能录自已麦的声音,录不到对方的声音,可能需要改内核才能实现双向录音;

从头学Android之多媒体--使用MediaRecorder录制音频

MediaRecoder 内部类或接口: 常用的方法                                     方法名称     描述     public void setAudioEncoder (int audio_encoder)     设置刻录的音频编码,其值可以通过MediaRecoder内部类的MediaRe

sadamoo的专栏 850

MediaRecorder的完整demo

MediaRecorder的完整demo,实现录像的全程预览、录像过程的自动对焦、录像文件的查看

AudioRecord/AudioTractorDemo

AudioRecord/AudioTractor实现音频的录制和播放Demo

使用MediaRecoder录制视频

随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666) MediaRecoder除了用于录制音频之外,还可用于录制视频,其步骤与录制音频基本相同,只是录制视频不仅要采集声音,还要采集图像,需要使用SurfaceView来预览显示图像,下面用一个简单示例来演示,代码如下:...

孤云博客 3028

【嵌入式底层知识修炼】按键和LED共用IO口的分时复用扫描方法

文章目录01 - PCB原理图例程02 - 分时复用的注意项和设计2.1 - 注意项2.2 - 设计03 - 代码实现 只要我跑的速度够快,寂寞就追不上我 只要Key和Led切换速度够快,人眼就看不出来 ————小白   如果你存在按键Key和显示Led共用同一个IO时,需要分时复用的需求,则可以移植代码进行使用: 代码所占code少于0.5K 线程安全,中断安全 可移植性高,配置容易 注意:系统需要存在一个至少为1ms的时钟中断 01 - PCB原理图例程   举2个Key和Led共用IO口的

单眼皮根号三的博客 1万+

【MediaRecorder】音频处理:探索MediaRecorder API的应用与技巧

😁 作者简介:一名大四的学生,致力学习前端开发技术👐学习格言:成功不是终点,失败也并非末日,最重要的是继续前进的勇气​🔥​前言:这是我自己整理的音频学习的笔记,前端在录取音频文件,无论如何都绕不完MediaRecorder这个API接口,了解这个接口有助于我们对音频文件的处理,希望可以帮助到大家,欢迎大家的补充和纠正。

m0_56132701的博客 3657

Sentence-BERT 语义相似度双塔模型

论文介绍 发表:2019,EMNLP 论文题目:《Sentence-BERT:sentence embeddings using siaese BERT-networks》 论文地址:https://arxiv.org/abs/1908.10084 Github:https://github.com/UKPLab/sentence-transformers 适用领域: 句向量生成 语义相似度计算 语义搜索 无监督任务(聚类) 1 概述 在20年之前的各种预训练模型中,比如bert,XLNet,Alb

weiyaner的博客 9194

[Dify实战] 合同审阅助手:识别风险条款、生成修改建议-带绑定资源

摘要: Dify合同审阅助手通过AI技术提升合同审阅效率,快速识别风险条款并输出结构化修改建议。方案包括合同输入、关键条款识别、风险评级和报告生成流程,重点关注付款、责任限制等核心条款。采用分层风险分级(高/中/低)和"红线清单"机制,确保审阅标准化。实施建议先建立条款库和模板,通过样本测试优化模型,定期更新规则库。该方案可缩短审阅时间50%以上,提高风险识别准确率,最终实现法务经验的可复用沉淀。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 597

多媒体——音频——利用MediaRecorder录制音频

布局: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"&...

小白龙白龙马的博客 809

KoboldCpp vs Ollama vs llama.cpp 全面对比(2026工程视角)

本文对比分析了KoboldCpp、Ollama和llama.cpp三大本地AI推理工具的核心差异。llama.cpp作为基础引擎性能最强但上手困难;KoboldCpp在其基础上增加了UI界面,适合娱乐创作;Ollama则提供最简化的模型管理和API服务。性能实测显示:llama.cpp>KoboldCpp>Ollama。选型建议:新手用Ollama快速入门,玩家选KoboldCpp获得交互体验,工程师用llama.cpp追求极致性能。三者定位清晰:性能极限、使用体验和开发效率各有所长。

刘一说的IT专栏 907

音频的两种录制方式-AudioRecord,MediaRecorder的使用及播放

AudioRecord和MediaRecorder两种都可以录制音频,MediaRecorder已实现大量的封装,操作起来更加简单,而AudioRecord使用起来更加灵活,能实现更多的功能。1.AudioRecord: 优点:可以实现语音的实时处理,进行边录边播,对音频的实时处理。 缺点:输出的是PCM的语音数据,如果保存成音频文件是不能被播放器播放的。要用到AudioTrack这个去进行处理

amelons的博客 2万+

在 SAP S/4HANA Public Cloud 中做产品扩展:从 Key User 到 ABAP Cloud 与 BTP 的三轨实践指南

摘要:SAP S/4HANA Public Cloud 提供三种扩展方式(key user、developer extensibility 和 side-by-side),遵循 clean core 原则确保升级稳定。key user 扩展适合无代码轻量改良,developer extensibility 用于受控 ABAP 开发,side-by-side 则适用于云原生独立应用。文章通过销售订单优先级字段、退货审批微服务和采购校验等案例,说明不同扩展路径的适用场景与实现方法,帮助开发者在三系统景观中合理选

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 294

Flink Gauss CDC:深度剖析存量与增量同步的创新设计

开发Flink Gauss CDC是为了适配华为自研GaussDB的特殊日志格式和逻辑复制机制,解决Flink CDC无法直接支持的问题,同时优化存量与增量同步的效率和一体化读取能力,满足GaussDB复合主键处理、数据落库等定制化需求,以实现高效、准确的数据同步。

数据与算法架构提升之路专栏 1985

使用MediaRecorder录制音频

使用MediaRecorder录制音频步骤如下: 1.创建MediaRecorder对象 2.调用MediaRecorder对象setAudioSourse(MediaRecorder.AudioSource.MIC)方法设置声音来源 3.调用MediaRecorder对象setOutputFormat()方法设置输出音频格式 4.调用MediaRecorder对象setAudioEnco

jzq950522的博客 719

使用SIMD思想进行memcpy的优化

arm64平台的memcpy的性能优化,相比C库提升30~40%,SIMD优化思路

zhaoxin1989的博客 1万+

MediaRecorder API 简介

在网络上,我们可以捕捉来自用户的摄像头,麦克风媒体流和甚至桌面。我们可以使用这些媒体流通过 WebRTC进行实时视频聊天,并且通过MediaRecorder API,我们还可以直接在 Web 浏览器中记录和保存用户的音频或视频。 为了探索 MediaRecorder API,让我们使用 HTML、CSS 和 JavaScript 构建一个简单的录音机应用程序。 入门 要构建这个应用程序,我们只需要一个文本编辑器和一个支持 MediaRecorded API的浏览器。在撰写本文时,支持的浏览器包括...

allway2的博客 1900

3、提升管壳式换热器能效:双螺旋盘管的应用研究

本研究探讨了在管壳式热交换器中应用双螺旋盘管以提升能效的可行性。通过实验对比双螺旋与单螺旋盘管的热传递效率,结果显示双螺旋盘管达到54.33%的效率,显著优于单螺旋的48.88%。双螺旋结构不仅增大了换热面积,还因产生剪切应力而减少结垢,延长运行周期。采用NTU方法评估热传递性能,验证了该设计在工业应用中的高效性与实用性,建议在制冷、空调、石油精炼等领域推广使用。

k8s6orchestrator的博客 109

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Android基础入门教程——9.4 使用MediaRecord录音

Android基础入门教程——9.4 使用MediaRecord录音标签(空格分隔): Android基础入门教程本节引言 本节是Android多媒体基本API调用的最后一节,带来的是MediaRecord的简单使用, 用法非常简单,我们写个例子来熟悉熟悉~ 1.使用MediaRecord录制音频运行结果:实现代码:布局代码:activity_main.xml:<RelativeLayou

Coder-Pig的猪栏 18万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

MediaRecorder

mediarecorder是用来录制视屏的,详细文档:https://developer.mozilla.org/zh-CN/docs/Web/API/MediaRecorder/MediaRecorder 语法: var mediaRecorder = new MediaRecorder(stream[, options]); 参数: 1、stream MediaStream 将要录制的流. 它可以是来自于使用 navigator.mediaDevices.getUserMedia() 创建的流或者来自

Mo_zifeng的博客 877

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

在web页面音视频录制并下载到本地——MediaRecorder

实现在web页面音视频录制并下载到本地

z止于至善的博客 1625

利用MediaRecorder录制视频切片上传到ftp服务器

文章目录1.前言 1.前言

2630

Android中的多媒体开发(四)——使用MediaRecord录音

    在MediaRecord中我们会用到很多方法,下面我简单的总结一下:   方法名称   描述   public void setAudioEncoder (int audio_encoder)   设置刻录的音频编码,其值可以通过MediaRecoder内部类的MediaRecorder.AudioEncoder的几个常...

dsd的博客 1879

H5通过浏览器录制视屏或音频

webAPI获取摄像头及MIc MediaRecorder.start()//开始录制命令 MediaRecorder.pause()//暂停录制 MediaRecorder.resume()//继续录制 MediaRecorder.stop()//停止录制 navigator.mediaDevices//获得设备的摄像头 通过getUserMedia获得视屏流或音频流

韩吉鑫的博客 7123
下一篇: 用MediaRecoder类进行录制视频
ErikChan.hk
博客等级 码龄12年 107粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值