【Android-R1】MediaRecorder和MediaPlayer的基本使用

2023-11-28 09:50

本文主要是介绍【Android-R1】MediaRecorder和MediaPlayer的基本使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        最近看到网上曾经火热的倒放挑战感觉挺有意思,于是打算研发一款线下游戏APP,让广大群众可以体验一把感受一下。现在处于起步研究阶段,目前总算找对了方向,先把之前做的一些研究和笔记整理一下,今天先把MediaRecorder和MediaPlayer的基本使用写了。如果没有意外的话,我会把这个项目做成一个系列,代号R1(random one缩写,意思是这个项目是第一个随机的安卓项目),我会把这个项目中研究过的我认为有价值的东西整理成笔记发表在这里,欢迎各位小伙伴来一起探讨和学习,下面废话不多说,直接进入正题。

 MediaRecorder

        用一个东西必然要先了解它,所以我们先进android developer的MediaRecorder指南浏览一番,这个指南就是介绍一下基本的使用,如果要更详细的可以看MediaRecorder参考文档,我把我使用过程中需要注意的点再啰嗦一下。

        MediaRecorder这个玩意是有状态变化的,如果你的MediaRecorder还没进入准备状态就直接调用record方法,那么程序会直接报错;所以参考文档给了以下的状态变化图

         由此可知,对于录音这个过程的正确调用顺序是:

        new -->setAudioSource-->setOutputFormat-->setAudioEncoder-->setOutputFile-->

prepare-->start-->stop-->setAudioSource或release

        在new的时候,我发现我使用的sdk版本(API 31)会提示旧的构造函数已经deprecated,但是用新的构造函数反而会报错,所以那个提示可以先无视掉。

        大家看完这个图有没有什么想法,我有个想法是,如果我第一次录完音stop后,recorder回到初始状态,如果我想再次录音,又要再写一遍设置参数的代码,所以这里可以做个小扩展,从setAudioSource到prepare之前都封装掉,所以我们可以动手写个Recorder的子类。

import android.media.MediaRecorder;public class MyRecorder extends MediaRecorder{private final int DEFAULT_AUDIO_SOURCE = MediaRecorder.AudioSource.MIC;private final int DEFAULT_OUTPUT_FORMAT = MediaRecorder.OutputFormat.DEFAULT;private final int DEFAULT_AUDIO_ENCODER = MediaRecorder.AudioEncoder.DEFAULT;public MyRecorder(){}public void setDefaultParam(){setAudioSource(DEFAULT_AUDIO_SOURCE);setOutputFormat(DEFAULT_OUTPUT_FORMAT);setAudioEncoder(DEFAULT_AUDIO_ENCODER);}public void setParam(int audioSource,int outputFormat,int audioEncoder){setAudioSource(audioSource);setOutputFormat(outputFormat);setAudioEncoder(audioEncoder);}
}

        由于MediaRecorder的start和stop方法系统会自动将其放在后台运行,所以不用特意写个线程来避开UI线程的阻塞。这里做的扩展仅仅是为了调用时少写点代码。

        调用步骤如下所示:

mRecorder = new MyRecorder();
mRecorder.setParam(MediaRecorder.AudioSource.MIC,
MediaRecorder.OutputFormat.AMR_WB,
MediaRecorder.AudioEncoder.AMR_WB);
mRecorder.setOutputFile(getExternalFilesDir("").getAbsolutePath()
+ File.separator + getFileName());
try {mRecorder.prepare();
}catch (Exception e){e.printStackTrace();
}
mRecorder.start();

        其实我比较困惑的是编码器和格式各个值的意义,AudioEncoder的枚举值如下(方便排版,我将逗号换成tab):

AAC        AAC_ELD        AMR_NB        AMR_WB        DEFAULT        HE_AAC        OPUS       VORBIS

       OutputFormat的枚举值如下:


AAC_ADTS        AMR_NB        AMR_WB        DEFAULT        MPEG_2_TS        MPEG_4

OGG                RAW_AMR        THREE_GPP        WEBM

        先讲下DEFAULT值,这个值是由你的机器决定选取其他格式中的任意一种。我查了百度,似乎没有对这些值的详细讲解,也没有哪篇文章把每个算法对应输出的文件格式对号入座,那么这个艰巨的任务就交给我了!接下来我将列出每个OutputFormat对应的文件格式(后缀名)。

AAC_ADTS

        AAC音频格式Advanced Audio Coding(高级音频解码),是一种由MPEG-4标准定义的有损音频压缩格式。

        ADTS:ADTS的全称是Audio Data Transport Stream。是AAC音频的传输流格式。AAC音频格式在MPEG-2(ISO-13318-7 2003)中有定义。AAC后来又被采用到MPEG-4标准中。这种格式的特征是它是一个有同步字的比特流,解码可以在这个流中任何位置开始。它的特征类似于mp3数据流格式。

        还有一种传输格式是ADIF:Audio Data Interchange Format 音频数据交换格式。这种格式的特征是可以确定的找到这个音频数据的开始,不需进行在音频数据流中间开始的解码,即它的解码必须在明确定义的开始处进行。

        其实不用具体了解那么多格式,我们需要知道的是,以AAC开头的就是AAC压缩格式,其对应的输出文件格式为.aac;

AMR

        AMR(全称是Adaptibve Multi-Rate)是一种音频格式。主要用于移动设备的音频,压缩比比较大,但相对其他的压缩格式质量比较差,语音带宽范围:300-3400Hz,由于多用于人声,通话,效果还是很不错的。AMR-NB就是指AMR。

        “AMR-WB”全称为“Adaptive Multi-rate - Wideband”,即“自适应多速率宽带编码”,采样频率为16kHz,是一种同时被国际标准化组织ITU-T和3GPP采用的宽带语音编码标准,也称 为G722.2标准。AMR-WB提供语音带宽范围达到50~7000Hz,用户可主观感受到话音比以前更加自然、舒适和易于分辨。

        其对应格式:.amr

MPEG

        MPEG是一种专门针对运动图像和语音压缩的编码标准。上面列举的MPEG_2_TS和MPEG_4是不同的版本,支持MPEG的文件格式有很多,比如mp4,avi等。

OGG

        Ogg全称是OGGVobis(oggVorbis)是一种音频压缩格式,类似于MP3等的音乐格式。Ogg是完全免费、开放和没有专利限制的。OggVorbis文件的扩展名是".ogg"。这种文件的设计格式是非常先进的。现在创建的OGG文件可以在未来的任何播放器上播放,因此,这种文件格式可以不断地进行大小和音质的改良,而不影响旧有的编码器或播放器。

THREE_GPP

        3GPP是由一组电信合作伙伴建立的、成立于1998年12月的标准化组织或机构,其成员包括欧洲ETSI、日本ARIB和TTC、中国CCSA、韩国TTA和北美ATIS。其目标是在ITU的IMT-2000计划范围内制订和实现全球性的第三代移动通信电话系统技术规范和宽带标准,致力于GSM到UMTS(WCDMA)的演进。

        3GP是一种常见视频格式,是MPEG-4 Part 14(MP4)格式的一种简化版本,常用于手机。其对应文件格式:.3gp

WEBM

        WebM 格式,其实是以 Matroska(就是我们熟知的 MKV)容器格式为基础开发的新容器格式,里面包括了 VP8 视频和 Ogg Vorbis 音轨。Ogg Vorbis 本来就是开放格式, VP8 则是 Google 当年买下 On2 公司时取得的 视频编码器,这次 Google 也把这个编码器以类似 BSD 授权开放,因此 WebM 应该是不会有 H.264 的那些潜在的专利问题。

        对应文件格式:.webm

Opus

        Opus是一个有损声音编码的格式,由Xiph.Org基金会开发,之后由IETF(互联网工程任务组)进行标准化,目标是希望用单一格式包含声音和语音,取代Speex和Vorbis,且适用于网络上低延迟的即时声音传输,标准格式定义于RFC 6716文件。Opus格式是一个开放格式,使用上没有任何专利或限制。

        以上各种格式介绍借鉴自百度百科和一些大神的博客,如果有错误请多包涵~基本上,你设置的编码器编码算法和你的输出格式大类是一样的就OK了,比如AudioEncoder我设置AAC,OutputFormat设置AAC_ADTS,然后输出文件名的后缀设为.aac。

        

MediaPlayer

        参考文档里是这么介绍的:

        MediaPlayer class can be used to control playback of audio/video files and streams.

        MediaPlayer is not thread-safe. Creation of and all access to player instances should be on the same thread. If registering callbacks, the thread must have a Looper.

        翻译成人话就是,MediaPlayer是用来控制播放音频/视频的,其输入可以是文件或流的形式。但MediaPlayer不是线程安全的,MediaPlayer对象的创建以及对其域或方法的访问应当都在同一线程中,如果注册了回调函数,那么线程应该有个looper(这looper是啥我暂时不清楚,高手可以评论解答下)。

        与MediaRecorder相同,MediaPlayer也有一个状态图:

         我看到这个图片下还有好大一段文字,这些文字内容先放着哪天我有空了再完整整理出来,这次我就抓重点讲。从这张图可以分析出最基本的使用流程:

new-->setDataSource-->prepare-->start-->stop/pause-->release

        MediaPlayer相对MediaRecorder没有那么多需要设置的参数了,所以我们应当将关注的重点放在什么状态下才能调什么API上,以及怎么写代码更加规范,基本上对照着这张图调API不会有什么大问题,很多东西参考文档也已经给出详细解释了,所以MediaPlayer没啥好讲的。

        那么本期就简单讲了下MediaRecorder和MediaPlayer,这两个玩意其实已经封装得很好用了,底层的AudioRecord和AudioTrack才是真的调用起来麻烦的一批,好那么我们下期再见!

这篇关于【Android-R1】MediaRecorder和MediaPlayer的基本使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/429490

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

基本知识点

1、c++的输入加上ios::sync_with_stdio(false);  等价于 c的输入,读取速度会加快(但是在字符串的题里面和容易出现问题) 2、lower_bound()和upper_bound() iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。 iterator upper_bou

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影