农业资讯网
当前位置: 首页 农业百科

android播放音频文件(安卓音频输出设置步骤)

时间:2023-05-28 作者: 小编 阅读量: 1 栏目名: 农业百科

而文章最后,我还会给出一段AudioDemo程序,该程序将最近的几篇文章涉及到的代码综合起来了,演示了一个完整的Android音频从采集到播放的全过程。下面言归正传,讲讲如何读写wav文件格式。而“ChunkSize”则记录了整个wav文件的字节数第二部分,属于“fmt”信息块,主要记录了本wav音频文件的详细音频参数信息,例如:通道数、采样率、位宽等等第三部分,属于“data”信息块,由“Subchunk2Size”这个字段来记录后面存储的二进制原始音频数据的长度。

无论是文字、图像还是声音,都必须以一定的格式来组织和存储起来,这样播放器才知道以怎样的方式去解析这一段数据,例如,对于原始的图像数据,我们常见的格式有 YUV、Bitmap,而对于音频来说,最简单常见的格式就是 wav 格式了。

wav 格式,与 bitmap 一样,都是微软开发的一种文件格式规范,它们都有一个相似之处,就是整个文件分为两部分,第一部分是“文件头”,记录重要的参数信息,对于音频而言,就包括:采样率、通道数、位宽等等,对于图像而言,就包括:图像的宽高、色彩位数等等;第二部分是“数据块”,即一帧一帧的二进制数据,对于音频而言,就是原始的 PCM 数据;对于图像而言,就是 RGB 数据。

前面几篇文章讲了如何利用 Android 平台的 API 完成原始音频信号的采集和播放,而本文则重点关注如何在 Android 平台上,将采集到的 PCM 音频数据保存到 wav 文件,同时,也介绍如何读取和解析 wav 文件。

而文章最后,我还会给出一段 AudioDemo 程序,该程序将最近的几篇文章涉及到的代码综合起来了,演示了一个完整的 Android 音频从采集到播放的全过程。

下面言归正传,讲讲如何读写 wav 文件格式。

1. 文件头

首先,我们了解一下 wav 格式的“文件头”

我们可以简单地分析一下这个 wav 格式头,它主要分为三个部分:

第一部分,属于最“顶层”的信息块,通过“ChunkID”来表示这是一个 “RIFF”格式的文件,通过“Format”填入“WAVE”来标识这是一个 wav 文件。而“ChunkSize”则记录了整个 wav 文件的字节数

第二部分,属于“fmt”信息块,主要记录了本 wav 音频文件的详细音频参数信息,例如:通道数、采样率、位宽等等

第三部分,属于“data”信息块,由“Subchunk2Size”这个字段来记录后面存储的二进制原始音频数据的长度。

分析到这里,我想大家应该就明白了,其实,做一种多媒体格式的解析,也不是一件特别复杂的事,说白了,格式就是一种规范,告诉你,我的二进制数据是怎么存储的,你应该按照什么样的方式来解析。

具体而言,我们可以定义一个如下的 Java 类来抽象和描述 wav 文件头:

/* *COPYRIGHT NOTICE*Copyright (C) 2016, Jhuster <lujun.hust@gmail.com> *http://github.com/Jhuster/AudioDemo **@license under the Apache License, Version 2.0* *@fileWavFileHeader.java **@version 1.0*@authorJhuster *@date2016/03/19 */package com.jhuster.audiodemo.api;public class WavFileHeader { public String mChunkID = "RIFF";public int mChunkSize = 0;public String mFormat = "WAVE";public String mSubChunk1ID = "fmt ";public int mSubChunk1Size = 16;public short mAudioFormat = 1;public short mNumChannel = 1;public int mSampleRate = 8000;public int mByteRate = 0;public short mBlockAlign = 0;public short mBitsPerSample = 8;public String mSubChunk2ID = "data";public int mSubChunk2Size= 0;public WavFileHeader() {}public WavFileHeader(int sampleRateInHz, int bitsPerSample, int channels) {mSampleRate = sampleRateInHz;mBitsPerSample = (short)bitsPerSample;mNumChannel = (short)channels;mByteRate = mSampleRate*mNumChannel*mBitsPerSample/8;mBlockAlign = (short)(mNumChannel*mBitsPerSample/8);}}

具体每一个字段的含义,可以参考我上面给出的链接,下面我们再看看如何读写 wav 文件。

音视频开发学习地址:【免费】FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发-学习视频教程-腾讯课堂

【文章福利】:小编整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!~点击832218493加入(需要自取)

2. 读写 wav 文件

文章开头已经说过,其实说白了,wav 文件就是一段“文件头”+“音频二进制数据”,因此:

(1)写 wav 文件,其实就是先写入一个 wav 文件头,然后再继续写入音频二进制数据即可

(2)读 wav 文件,其实也就是先读一个 wav 文件头,然后再继续读出音频二进制数据即可

那么,在动手写代码之前,有两点你需要搞清楚:

(1) wav 文件头中,有哪些是“变化的”,哪些是“不变的”?

比如:文件头开头的“RIFF”字符串就是“不变的”部分,而用来记录音频数据总长度的“Subchunk2Size”变量就是属于“变化的”部分,因为,再音频数据没有彻底全部写完之前,你是无法知道一共写入了多少字节的音频数据的,因此,这个部分,需要用一个变量记录起来,到全部写完之后,再使用 Java 的“RandomAccessFile”类,将文件指针跳转到“Subchunk2Size”字段,改写一下默认值即可。

(2) 如何把 int、short 变量与 byte[] 的转换

因为 wav 文件都是二进制的方式读写,因此,“WavFileHeader”类中定义的变量都需要转换为byte字节流,具体转换方法如下:

private static byte[] intToByteArray(int data) {return ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN).putInt(data).array();}private static byte[] shortToByteArray(short data) {return ByteBuffer.allocate(2).order(ByteOrder.LITTLE_ENDIAN).putShort(data).array();} private static short byteArrayToShort(byte[] b) {return ByteBuffer.wrap(b).order(ByteOrder.LITTLE_ENDIAN).getShort();}private static int byteArrayToInt(byte[] b) {return ByteBuffer.wrap(b).order(ByteOrder.LITTLE_ENDIAN).getInt();}

关于 wav 文件读写的类我已经帮大家“封装”好了,并且结合着前面几篇文章给出的音频采集和播放的代码,完成了一个 AudioDemo 程序,放在我的 Github 上了,欢迎大家下载运行测试,然后结合着代码具体学习 Android 音频相关技术,代码地址:

http://github.com/Jhuster/AudioDemo

注:本系列文章的所有代码,以后都会并入到该 demo 项目中。

    推荐阅读
  • 我国的儿童感觉统合失调率为多少(儿童感觉统合失调的危害)

    大脑将这些讯息整合,作出反应再透过神经组织,指挥身体感官的动作,称为运动学习。平衡感是人类行动的基础平衡能力主要来自骨架和中枢神经的功能,并在中耳的半规管组成辨识神经体系,以协调身体和地心引力的能力。最重要是找出其根本的原因,由于孩子行为上大多已产生多重困难,不易判断真正原因及其不足程度。

  • 碱性水果有什么(碱性水果多吗)

    接下来我们就一起去了解一下吧!碱性水果有什么绝大多数水果都是偏碱性的,像香蕉,苹果,梨,葡萄,山楂,橘子,桃子。另外从中医角度这些水果又有不同的凉热属性,与中医上各人进行评估不同的属性相对应。但西医认为只要没有明显的胃肠道刺激情况这些水果都是可以选择。

  • 进出鹿泉区防疫政策(鹿泉区疫情防控要求)

    二、抵鹿后、早检测为及早筛查发现潜在疫情风险,请义乌、三亚等省外涉疫地区来鹿返鹿人员和7月30日以来有新乐市旅居史来鹿返鹿人员抵鹿后前3天每天进行免费核酸检测,并在第5天、第7天各进行一次免费核酸检测;倡导省外非涉疫地区来鹿返鹿人员抵鹿后前3天每天进行免费核酸检测,并提倡第5天再进行一次免费核酸检测,期间不参加聚集性活动,不前往人员密集场所,不乘坐公共交通工具,避免交叉感染风险。

  • 成年的猫咪能吃化毛膏吗(猫咪多大可以吃化毛膏)

    猫咪化毛膏一般是需要在猫咪开始学会舔毛的时候开始吃,通常是在三个月左右,它们会自己整理自己的毛发,从中舔入不少的猫毛,这就是毛球形成的主要因素。

  • 广东黑凉粉怎么做好吃(黑凉粉简单做法)

    下面更多详细答案一起来看看吧!广东黑凉粉怎么做好吃材料:准备好1盒凉粉粉,100克,水2300毫升,约正常碗9碗水。先取2碗冷水把凉粉粉开成无核的糊状,再用剩余的7碗冷水煮沸。把刚刚搅拌的糊状凉粉浆,慢慢到如煮沸的锅中,并不停的搅匀,直到煮沸。关火,充分冷凝后成固体,用木刀切成大四方快,放入冰箱冷藏。想吃的时候,取出,用木刀切入小方块,根据自己的口味加入蜂蜜或冰糖或蔗糖水,还可以加入自己喜欢吃的水果。

  • 月季花的特点,附外形介绍 月季花的样子和特点是什么

    顶部生长的小叶柄较长,侧面生长的小叶柄较短。北方花期是4-10月,南方花期是3-11月。

  • 齐白石画荷花图大全(齐白石画红荷卖690万)

    这幅《五色荷花》创作于1935年,在2017年以3220万的天价成交,足足比齐白石的《荷花蜻蜓》高出了近5倍。2,虽然同是写意荷花,齐白石的荷花重意趣,对形态的描写没有过多刻画,而张大千的荷花,除了荷叶之外,几乎每一朵荷花都刻画得更加细腻、美观一些。

  • 课后服务是什么意思(课后服务的解释)

    课后服务的解释课后服务属于学校教育的延伸,是为了解决放学早下班晚“时间差”问题而衍生的一种服务,以贝尔安亲为首的课后服务机构正迅速崛起,这种机构提供的学生托管、作业辅导、文体活动、娱乐游戏、兴趣培养、社会实践等服务。

  • 树藤怎么炒好吃(怎么炒树藤)

    我们一起去了解并探讨一下这个问题吧!树藤怎么炒好吃藤藤菜300g,蚝油1勺,干辣椒3个,蒜2瓣,食盐3g,植物油30g,将藤藤菜用水浸泡30分钟,然后择叶,洗净,沥干。将蒜去衣,切蒂,切成蒜片,干辣椒切成细丝。放入蒜片、辣椒丝爆香。快炒至熟,下适量食盐和蚝油调味,即可关火上碟。

  • 二手三门版普拉多转让(司法拍卖不容错过)

    司法拍卖不容错过江津法院司法拍卖拍品上新啦!1.登录淘宝网司法拍卖网络平台http://sf.taobao.com2.扫码拍品下的二维码即可进入拍卖界面还在等什么呢?本周有什么新拍品,赶紧来看看吧!1拍卖标的:重庆市。