首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在android中创建音频文件的波形

在Android中创建音频文件的波形,需要使用MediaPlayer和MediaRecorder来录制音频,并使用AudioRecord来获取音频数据。以下是一个简单的示例代码:

代码语言:java
复制
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.Button;

import androidx.appcompat.app.AppCompatActivity;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class MainActivity extends AppCompatActivity {

    private static final int SAMPLE_RATE = 44100;
    private static final int CHANNEL_CONFIG = AudioFormat.CHANNEL_IN_MONO;
    private static final int AUDIO_FORMAT = AudioFormat.ENCODING_PCM_16BIT;
    private static final int BUFFER_SIZE = AudioRecord.getMinBufferSize(SAMPLE_RATE, CHANNEL_CONFIG, AUDIO_FORMAT);

    private AudioRecord audioRecord;
    private MediaPlayer mediaPlayer;
    private MediaRecorder mediaRecorder;
    private File audioFile;

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

        Button recordButton = findViewById(R.id.record_button);
        Button playButton = findViewById(R.id.play_button);

        recordButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startRecording();
            }
        });

        playButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startPlaying();
            }
        });

        audioFile = new File(Environment.getExternalStorageDirectory(), "audio.wav");
        if (audioFile.exists()) {
            audioFile.delete();
        }

        try {
            audioFile.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }

        audioRecord = new AudioRecord.Builder()
                .setAudioSource(MediaRecorder.AudioSource.MIC)
                .setAudioFormat(new AudioFormat.Builder()
                        .setEncoding(AUDIO_FORMAT)
                        .setSampleRate(SAMPLE_RATE)
                        .setChannelMask(CHANNEL_CONFIG)
                        .build())
                .setBufferSizeInBytes(BUFFER_SIZE)
                .build();

        mediaPlayer = new MediaPlayer();

        mediaRecorder = new MediaRecorder();
        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        mediaRecorder.setOutputFile(audioFile.getAbsolutePath());
        mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    }

    private void startRecording() {
        audioRecord.startRecording();
        mediaRecorder.start();
    }

    private void startPlaying() {
        try {
            mediaPlayer.setDataSource(audioFile.getAbsolutePath());
            mediaPlayer.prepare();
            mediaPlayer.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在这个示例代码中,我们使用了AudioRecord来录制音频,并使用MediaRecorder来保存音频文件。我们还使用了MediaPlayer来播放音频文件。

在这个示例代码中,我们使用了一个按钮来开始录制音频,并使用另一个按钮来开始播放音频。

在这个示例代码中,我们使用了WAV格式来保存音频文件。如果需要创建音频文件的波形,可以使用第三方库,例如AudioWaveform。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android开发如何使用OpenSL ES库播放解码后pcm音频文件

支持pcm数据采集和播放 支持播放音频数据来源广泛,res、assets、sdcard、在线网络音频以及代码定义音频二进制数据   和Android提供AudioRecord和AudioTrack...如果希望减少拷贝,开发更加高效Android音频应用,则建议使用Android NDK提供OpenSL ES API接口,它支持native层直接处理音频数据。...二.使用OpenSL ES播放pcm音频数据步骤   开发步骤如下: 创建引擎对象和接口 创建混音器对象和接口 创建播放器对象和接口 创建缓冲队列接口并给缓冲队列注册回调函数 设置播放状态,手动调用回调函数...log OpenSLES )   java层只需获取到要播放pcm文件位置,然后传入native层即可,代码如下: val pcmPath=getExternalFilesDir...absolutePath+File.separator+"input.pcm" playPcmBySL(pcmPath)   需要注意是,pcm文件可以通过使用ffmpeg解码mp3文件得到,但是解码时候需要注意

11910

多媒体-iOS与Android音频文件互通

前言 实际开发,关于音频传输上,iOS与Android通用性一直是一个不可回避问题。下面记录下比较好解决方案。 ---- 现状 苹果音频格式安卓全不支持。...而文件格式后缀是 .mp3,结果iOS这边一直无法播放,而且打开把该文件服务器上路径粘到浏览器也是无法识别和播放。 .amr 格式苹果这边也是无法播放。...两边都使用 libmp3lame 进行编码不会出现问题,也有些同学反应 安卓那边无法把pcm 格式音频文件转化为 mp3 格式,我只想说可以使用 libmp3lame 试试,网上能找到资源 ?...wav格式进行保存,所有只要 iOS端 Wav文件 转 amr 格式给安卓使用,把安卓amr 文件转化为 wav格式 给自己使用即可解决iOS与Android音频文件互通问题。...关于iOS与Android视频文件互通问题,MP4格式即可解决。 关于wav和amr 格式互转,可以参考这个dome,喜欢请 star一下

3.1K20

Android 使用URLConnection下载音频文件方法

使用MediaPlayer播放在线音频,请参考Android MediaPlayer 播放音频 有时候我们会需要下载音频文件。这里提供一种思路,将在线音频文件通过流写到本地文件。...使用URLConnection来建立连接,获取到数据写到文件。 URLConnection建立连接后,可以获取到数据长度。由此我们可以计算出下载进度。...在这里是用来下载音频文件。可以实现下载功能和类似“边下边播”功能。...代码可以参考示例工程: https://github.com/RustFisher/android-MediaPlayer 总结 以上所述是小编给大家介绍Android 使用URLConnection...下载音频文件方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家

85610

android onresume函数,androidActivity重新创建后未调用onResume

大家好,又见面了,我是你们朋友全栈君。 应用程序设置中进行某些更改时,我recreateonActivityResult调用MainActivity。重新创建后,不调用onResume。...没有recreate情况下如何使用Handler? 任何想法将不胜感激。谢谢! 最佳答案 onResume()之前调用OnActivityResult()。...您可以做OnActivityResult()设置一个标志,您可以onResume()检入,如果该标志为true,则可以重新创建活动。...您实际上可以做是完成活动并开始相同活动,而不是重新创建活动。您将获得相同效果。...可能是这样:public class MainActivity extends AppCompatActivity { private boolean shouldRecreate = false

3.3K20

nodejs创建cluster

简介 在前面的文章,我们讲到了可以通过worker_threads来创建线程,可以使用child_process来创建子进程。本文将会介绍如何创建nodejs集群cluster。...// 本例子,共享是 HTTP 服务器。...一个工作进程创建后会自动连接到它主进程。当 ‘disconnect’ 事件被触发时才会断开连接。...而本质上,worker.send主进程,这会发送消息给特定工作进程。相当于 ChildProcess.send()。工作进程,这会发送消息给主进程。相当于 process.send()。...而在子进程,则可以使用worker全局变量process来发送消息。 总结 使用cluster可以充分使用多核CPU优势,希望大家实际项目中应用起来。

3.1K21

使用 Python 对波形数组进行排序

本文中,我们将学习一个 python 程序来对波形数组进行排序。 假设我们采用了一个未排序输入数组。我们现在将对波形输入数组进行排序。...− 创建一个函数,通过接受输入数组和数组长度作为参数来对波形数组进行排序。 使用 sort() 函数(按升序/降序对列表进行排序)按升序对输入数组进行排序。...创建一个变量来存储输入数组。 使用 len() 函数(返回对象项数)获取输入数组长度。...例 以下程序使用 python 内置 sort() 函数对波形输入数组进行排序 − # creating a function to sort the array in waveform by accepting...结论 本文中,我们学习了如何使用两种不同方法对给定波形阵列进行排序。与第一种方法相比,O(log N)时间复杂度降低新逻辑是我们用来降低时间复杂度逻辑。

6.8K50

Vue创建可重用 Transition

我们案例,我们真正需要是通过组件prop控制CSS animation/transition。 我们可以通过不在CSS中指定显式CSS动画持续时间,而是将其作为样式来实现。...如果我们可以相同组件这样做,并公开一个将切换到transition-group实现group prop,那会怎么样呢?...再做一些调整,通过mixin中提取 JS 逻辑,我们可以将其应用于轻松创建transition组件,只需将其放入下一个项目中即可。...我认为它非常方便,可以轻松地不同项目中使用。你可以试一试:) 总结 我们从一个基本过渡示例开始,并最终通过可调整持续时间和transition-group支持来创建可重用过渡组件。...我们可以使用这些技巧根据并根据自身需求创建自己过渡组件。 希望读者从本文中学到了一些知识,并且可以帮助你们建立功能更好过渡组件。

9.7K20

Android 6.0 无法SD卡创建目录方法

摘要 今天开发遇到一个问题,项目无法Android6.0设备SD卡创建目录,Android6.0以下移动设备测试了5.0 、4.3设备,均正常,但是Android6.0却不正常。...经过排查,执行下列代码无法6.0设备上面创建目录 File dir = new File(DbConfig.BASE_PATH); if (!...大家对 Android 权限吐槽已久,Android 应该能极大改善这方面的问题。...主要改变有: 系统设置可以对 APP 各个权限单独控制权限根据内容进行分组了 普通权限还是安装时授权,其他权限在运行时系统弹窗授权,并且要解析使用这个权限目的 对于开发者来说,需要小心处理权限相关问题...dir.exists()) { dir.mkdirs(); } } } 以上这篇Android 6.0 无法SD卡创建目录方法就是小编分享给大家全部内容了,希望能给大家一个参考。

1.1K20

Excel创建瀑布图

标签:Excel图表技巧,瀑布图 Excel很容易创建瀑布图,因为自Excel 2016就推出了瀑布图。然而,改变瀑布颜色稍微有点困难。...刚开始选择数据并插入瀑布图时,没有被标记为“汇总”列,这意味着所有列都将是浮动。我们可以两次单击应该为总计列,这将选择该列。然后,该列上单击鼠标右键,选择“设置为汇总”,如下图1所示。...图1 从图1可以观察到,可以更改每个点填充和轮廓。如果希望瀑布以橙色表示正,灰色表示负,可能会右键单击每一列并手动更改颜色。这是一种“笨”办法!并且,如果数据从正变为负,则颜色不会改变。...此时,可以单击功能区“页面布局”选项卡,再单击“主题”组“颜色”下拉列表,选取其底部“自定义颜色”。其中,着色1用于增加,着色2用于减少,着色3用于汇总。改变这三种颜色,瀑布图中颜色就会改变。...现在,可以清楚地看到连接线在哪里,它们呈细微灰色,可以对其进行相应格式设置。 瀑布图是一种很好图表类型,希望Microsfot能够不断改进,让其更好。

31230

IDEA创建maven项目

IDEA创建maven项目   现在JavaWeb项目中,绝大多数都是采用maven结构项目,而对于maven支持最好IDE开发工具为IDEA,所以说我就以IDEA上为例来进行maven...和往常一样,为了避免由于开发工具版本不同所造成困扰,我先讲我开发工具版本号公布一下,我开发工具版本号为IDEA-2017.2.16,如下图所示:   用IDEA创建maven项目的方法如下,...双击IDEA图标,进入界面如下,该页面,点击箭头所示“Create New Project”选项   接下来页面中会直接显示maven选项,由于我们索要创建是一个最简单maven...项目,所以说我们需要做是勾选图示所示“Create From Archetype”复选框,在下面的下拉选项我们选择“quickstart”,之后点击【Next】   接下来面板,我们填写...填写完之后,点击【Next】   接下来面板中选择本地maven,选择完成后点击【Next】   比如说我maven选择如下所示:   接下来慢板填写项目名,比如说我填写如下

3K20

Docker创建私有仓库

仓库简介 随着创建镜像日益增多,就需要有一个保存镜像地方,这就是仓库。目前有两种仓库:公共仓库和私有仓库。...最方便就是使用公共仓库上传和下载镜像,下载公共仓库镜像不需要注册,但上传镜像到公共仓库是需要注册。...公共仓库填写完成仓库ID号、邮箱以及登录仓库密码并在邮件中进行激活就可以上传自己镜像。 那么怎么构建属于自己私有仓库呢?可以使用registry来搭建本地私有仓库。...it registry /bin/bash //创建容器 # docker ps -a //查看容器运行状态 # docker start 67b98e15c857 # docker run...-d -p 5000:5000 -v /data/registry:/tmp/registry registry //宿主机/data/registry自动创建挂载容器/tmp/registry

2.8K20

TKE创建服务-Service

tke集群中服务包含service和ingress 本篇着重介绍service [upd0lgjzkp.png] k8s service是搭配着pod使用,service定义了一个服务入口地址,通过访问...更具体介绍请看文档:Service 接下来为大家展现创建一个nginx(deployment+service) 1.创建index.html文件 集群节点中创建一个/app目录并且创建一个index.html...创建deployment + service 填写工作负载名,配置数据卷 [3mul3cqnwi.png] 选择对应nginx镜像 选择对应镜像版本,这里选择latest [2drl2ir3op.png...、VPC内网访问、主机端口访问 如何选择 这里选择公网访问,公网访问将创建一个4层公网CLB(负载均衡)映射80:80端口 [6g5k2w49z6.png] 创建完成后查看workload deployment...界面 [查看nginx deployment ] 查看service 可以看到对应service也创建了出来并且分配了ip 这里ip分别对应是 $ kubectl get service NAME

3.2K40

怎样 Unity 创建 UI

Unity 3D 提供了许多 UI 组件,你都可以在你游戏中使用它们。在这篇文章,我会指导你 unity 菜单如何创建一个简单暂停菜单。...层级视图 Canvas 上右键然后选择 UI -> Text。 当 text 组件被创建时候,你会注意到你可以移动它,就像在 unity 其他任何游戏对象一样。...我主要是想用这个 tag 来展示这个教程富文本功能。 如何创建按钮: 下面我门将会创建三个按钮。uinty 已经内建了按钮组件,这可以让你在游戏中当按钮被按下时候来响应某些事件。...在你场景创建一个空游戏物体,命名为『_GM』 层级视图中选中『_GM』然后检视视图中选择『Add Component』 向下滚动并且选择『New Script』。...下面是关于本次教程总结:希望你能更好地理解如何在 Unity 创建用户界面。还有很多其他更复杂 UI 组件,我没有本文中讨论,我鼓励你去尝试使用它们,并且经历所有你觉得很酷东西。

5.5K20

nodejs创建child process

nodejs创建child process 简介 nodejsmain event loop是单线程,nodejs本身也维护着Worker Pool用来处理一些耗时操作,我们还可以通过使用nodejs...注意,worker_threads创建是子线程,而child_process创建是子进程。 child_process模块,可以同步创建进程也可以异步创建进程。...同步创建方式只是异步创建方法后面加上Sync。 创建出来进程用ChildProcess类来表示。...子进程将会在message事件,将该handle传递给Callback函数,从而可以子进程中进行处理。...他们区别就在于windows环境,如果要执行.bat或者.cmd文件,没有shell终端是执行不了。这个时候就只能以exec来启动。execFile是无法执行

3.2K30

Excel创建悬浮图

标签:Excel图表技巧 有时候,我们想将图表数据列悬浮呈现。本文介绍如何实现这样效果技巧。 原始数据及想要创建图表如下图1所示。...图1 步骤1:根据原始数据,整理用于创建图表数据,如下图2所示。一个名为“隐藏”列,计算出悬浮高度,也就是前面显示柱状高度之后;一个名为“显示”列,即绘制可见柱状高度。...图2 步骤2:选择新数据区域,单击功能区“插入”选项卡“图表”组“插入柱形图或条形图——堆积柱形图”,得到图表如下图3所示。...步骤4:单击功能区“插入”选项卡“插图——形状——箭头符号”,图表附近绘制一个向上箭头形状。 步骤5:单击选取箭头形状,按Ctrl+C复制箭头。...步骤6:单击图表可见柱形,这将选择所有柱形。按Ctrl+V进行粘贴,箭头将替换柱形。结果如下图5所示。 图5

40450
领券