Android多媒体框架支持捕获和编码各种常见的音频和视频格式。MediaRecorder如果设备硬件支持,您可以使用这些API。

本文档向您介绍如何使用它MediaRecorder来编写捕获设备麦克风音频,保存音频并播放(使用MediaPlayer)的应用程序。要录制视频,您需要使用设备的相机MediaRecorder。这在相机指南中有描述。

注意: Android模拟器无法录制音频。请务必在可录制的真实设备上测试您的代码。

请求许可录制音频


为了能够记录,您的应用必须告诉用户它将访问设备的音频输入。您必须将此权限标签包含在应用的清单文件中:

<uses-permission android:name="android.permission.RECORD_AUDIO" />

RECORD_AUDIO被视为 “危险”许可, 因为它可能对用户的隐私构成风险。从Android 6.0(API级别23)开始,使用危险权限的应用程序必须在运行时要求用户批准。在用户授予许可后,应用程序应该记住并不要再提问。下面的示例代码展示了如何使用这个行为来实现 ActivityCompat.requestPermissions()。

创建并运行MediaRecorder


使用MediaRecorder 以下调用初始化新实例:

使用设置音源 setAudioSource()。你可能会用MIC。

注意:大多数音频源(包括DEFAULT)会对音频信号应用处理。录制原始音频选择 UNPROCESSED。有些设备不支持未处理的输入。AudioManager.getProperty("PROPERTY_SUPPORT_AUDIO_SOURCE_UNPROCESSED")先打电话确认它是否可用。如果不是,请尝试使用VOICE_RECOGNITION,而不使用AGC或噪声抑制。UNPROCESSED 即使在不支持该属性的情况下,您也可以将其用作音频源,但无法保证在该情况下信号是未处理还是未处理。

使用设置输出文件格式 setOutputFormat()。请注意,从Android 8.0(API级别26)开始MediaRecorder支持MPEG2_TS格式,这对流式传输非常有用:

mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS);

使用设置输出文件名称 setOutputFile()。您必须指定一个代表实际文件的文件描述符。
使用设置音频编码器 setAudioEncoder()。
通过调用完成初始化 prepare()。
通过 分别调用start()和 启动和停止记录器 stop()。

当你MediaRecorder通过调用完成尽可能快地释放它的资源 release()。

使用MediaMuxer录制多个频道


从Android 8.0(API级别26)开始,您可以使用a MediaMuxer 来同时录制多个音频和视频流。在早期版本的Android中,您一次只能录制一个音轨和/或一个视频轨道。

使用该addTrack() 方法将多声道音轨混合在一起。

您还可以为每个框架添加一个或多个带有自定义信息的元数据轨道,但仅限于MP4容器。您的应用程序定义了元数据的格式和内容。

添加元数据


元数据可用于离线处理。例如,从陀螺仪传感器捕获的数据可用于执行视频稳定。

添加元数据轨道时,轨道的MIME格式必须以前缀开头 application/。写入元数据与写入视频或音频数据相同,但数据不是来自a MediaCodec。相反,该应用会将ByteBuffer相关时间戳传递 给该 writeSampleData()方法。时间戳必须与视频和音频轨道具有相同的时间基准。

生成的MP4文件使用ISO BMFF规范的TextMetaDataSampleEntry第12.3.3.2节中定义的信号来发送元数据的MIME格式。当您使用a 提取包含元数据轨道的文件时,元数据的MIME格式将显示为一个实例。 MediaExtractorMediaFormat

示例代码


在Android的MediaRecorder 示例演示了如何使用MediaRecorder和照相机API进行视频录制。

下面的示例活动显示了如何使用MediaRecorder录制音频文件。它也用于MediaPlayer播放音频。

package com.android.audiorecordtest;import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;import java.io.IOException;public class AudioRecordTest extends AppCompatActivity {private static final String LOG_TAG = "AudioRecordTest";private static final int REQUEST_RECORD_AUDIO_PERMISSION = 200;private static String mFileName = null;private RecordButton mRecordButton = null;private MediaRecorder mRecorder = null;private PlayButton   mPlayButton = null;private MediaPlayer   mPlayer = null;// Requesting permission to RECORD_AUDIOprivate boolean permissionToRecordAccepted = false;private String [] permissions = {Manifest.permission.RECORD_AUDIO};@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);switch (requestCode){case REQUEST_RECORD_AUDIO_PERMISSION:permissionToRecordAccepted  = grantResults[0] == PackageManager.PERMISSION_GRANTED;break;}if (!permissionToRecordAccepted ) finish();}private void onRecord(boolean start) {if (start) {startRecording();} else {stopRecording();}}private void onPlay(boolean start) {if (start) {startPlaying();} else {stopPlaying();}}private void startPlaying() {mPlayer = new MediaPlayer();try {mPlayer.setDataSource(mFileName);mPlayer.prepare();mPlayer.start();} catch (IOException e) {Log.e(LOG_TAG, "prepare() failed");}}private void stopPlaying() {mPlayer.release();mPlayer = null;}private void startRecording() {mRecorder = new MediaRecorder();mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);mRecorder.setOutputFile(mFileName);mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);try {mRecorder.prepare();} catch (IOException e) {Log.e(LOG_TAG, "prepare() failed");}mRecorder.start();}private void stopRecording() {mRecorder.stop();mRecorder.release();mRecorder = null;}class RecordButton extends Button {boolean mStartRecording = true;OnClickListener clicker = new OnClickListener() {public void onClick(View v) {onRecord(mStartRecording);if (mStartRecording) {setText("Stop recording");} else {setText("Start recording");}mStartRecording = !mStartRecording;}};public RecordButton(Context ctx) {super(ctx);setText("Start recording");setOnClickListener(clicker);}}class PlayButton extends Button {boolean mStartPlaying = true;OnClickListener clicker = new OnClickListener() {public void onClick(View v) {onPlay(mStartPlaying);if (mStartPlaying) {setText("Stop playing");} else {setText("Start playing");}mStartPlaying = !mStartPlaying;}};public PlayButton(Context ctx) {super(ctx);setText("Start playing");setOnClickListener(clicker);}}@Overridepublic void onCreate(Bundle icicle) {super.onCreate(icicle);// Record to the external cache directory for visibilitymFileName = getExternalCacheDir().getAbsolutePath();mFileName += "/audiorecordtest.3gp";ActivityCompat.requestPermissions(this, permissions, REQUEST_RECORD_AUDIO_PERMISSION);LinearLayout ll = new LinearLayout(this);mRecordButton = new RecordButton(this);ll.addView(mRecordButton,new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT,0));mPlayButton = new PlayButton(this);ll.addView(mPlayButton,new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT,0));setContentView(ll);}@Overridepublic void onStop() {super.onStop();if (mRecorder != null) {mRecorder.release();mRecorder = null;}if (mPlayer != null) {mPlayer.release();mPlayer = null;}}
}

学到更多


这些页面涵盖了有关录制,存储和播放音频和视频的主题。

  • 支持的媒体格式
  • 请求权限
  • 数据存储
  • 媒体播放器

联系我

QQ:94297366
微信打赏:https://pan.baidu.com/s/1dSBXk3eFZu3mAMkw3xu9KQ

公众号推荐:

转载于:https://blog.51cto.com/4789781/2131229

【AudioVideo】MediaRecorder概述(21)相关推荐

  1. 面试干货!21个必知数据科学面试题和答案part2(12-21)

    本文为数盟原创译文,欢迎转载,注明出处"数盟社区"即可 这里是第二部分,就从我给大家准备的"特别提问"开始吧. 作者 Gregory Piatetsky, KD ...

  2. 面试干货!21个必知数据科学面试题和答案

    最近KDnuggets上发的"20个问题来分辨真假数据科学家"这篇文章非常热门,获得了一月的阅读量排行首位. 但是这些问题并没有提供答案,所以KDnuggets的小编们聚在一起写出 ...

  3. NLP--文本丶语义匹配方法概述详解

    文本匹配和语义匹配 1.什么是文本匹配? 文本匹配是自然语言处理中一个重要的基础问题,可以应用于大量的NLP任务中,如信息检索.问答系统.复述问题.对话系统.机器翻译等,这些NLP任务在很大程度上可以 ...

  4. 21点双人对战和人机对战C++

    课题背景概述 21 点扑克是牌类游戏中的比较基础游戏,其基本打法为双人共玩一副洗好的 52 张牌(大小王拿走),采用回合制比每回合输赢,直至打完一副牌算总积分决出胜负. 每回合双方轮流拿牌,每人牌数 ...

  5. Unity 3D学习视觉脚本无需编码即可创建高级游戏

    在本课程中,您将学习如何在Unity中使用可视化脚本(以前称为Bolt)以及如何在不编写一行代码的情况下创建自己的高级游戏所需的一切.本课程将教你如何掌握可视化脚本,即使你以前没有任何关于unity或 ...

  6. http 权威指南 目录

    第一部分 HTTP:Web的基础 第1章 HTTP概述 1.1 HTTP--因特网的多媒体信使 1.2 Web客户端和服务器 1.3 资源 1.3.1 媒体类型 1.3.2 URI 1.3.3 URL ...

  7. 计算机存储技术及其发展了论文,计算机网络存储技术探究-计算机网络论文-计算机论文(13页)-原创力文档...

    计算机网络存储技术探究 摘要:计算机网络的诞生无疑为信息数据的管理带来了"福音",但随着网络化进程的持续,网络信息数据的总量还会不断增大,解决总量庞大的网络信息的存储必然会成为网络 ...

  8. Cap21_项目组合管理

    21 项目组合管理 21.1 项目组合管理概述 21.1.1 项目组合 项目组合是将项目.项目集,以及其他方面的工作内容组合起来进行有效管理,以保证满足组织的战略性的业务目标. 21.1.2 项目组合 ...

  9. 数字政通图像处理面试_SLAM面试问题大全

    点击上方"CVer",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转载自:码出名企路 秋招求职,职位意向 SLAM 相关:做自动驾 ...

最新文章

  1. git解决代码提交冲突
  2. 常用的Windows脚本
  3. Linux YUM扩展NFS共享存储服务(配置图解)
  4. spark加盐(salting)操作
  5. 为什么我们需要Maven
  6. 我发现我的Java重拍了!
  7. wampserver橙色如何变成绿色_绿色配什么颜色好看 家居绿色配色小技巧-装修攻略...
  8. 风格之争:Coroutine vs Callback
  9. Android9编程一:安装开发环境
  10. 2021青海省普通高考成绩查询,青海省教育考试网:2021年青海高考成绩查询入口、查分系统...
  11. ProjectManagement::Redmine中文乱码问题
  12. Cesium:加载百度地图
  13. Windows上如何搭建web网站,并发布到外网可访问?2-2
  14. Linux快捷键列表
  15. Android私有数据存储,Android获取私有存储目录
  16. 游戏运维的开始,这只是开始
  17. kernel printk的打印等级
  18. Win10,Ubuntu双系统,格式化Ubuntu系统分区后启动问题
  19. 常用小工具:一款好用、实用的“日常工作安排”桌面日历
  20. 【洞见趋势】博睿数据创始人兼CTO孟曦东访谈实录:聊聊2023年重要战略技术趋势“可观测性”

热门文章

  1. Python入门系列——第14篇
  2. 源码0501-07-GCD的基本使用
  3. UltraISO制作linux启动盘(包含写入不完整解决方法)
  4. 表单表格-为什么标签需要语义化
  5. 小白设计模式:装饰者模式
  6. gbk转utf-8 iconv 编码转换
  7. 大数据之-Hadoop3.x_MapReduce_WordCount编写_Mapper---大数据之hadoop3.x工作笔记0089
  8. android学习笔记---50_样式与主题,给控件使用样式,给应用使用主题
  9. 小技巧之nvidia-smi
  10. jsp,servlet交互驱动层实现