android 音频播放器(android实现音乐播放)
android 音频播放器(android实现音乐播放),新营销网红网本栏目通过数据整理汇集了android 音频播放器(android实现音乐播放)相关信息,下面一起看看。
无论是文本、图像还是声音,都必须以一定的格式组织和存储,让玩家知道如何解析这段数据。比如对于原始的图像数据,我们常见的格式是YUV和位图,而对于音频,最简单最常见的格式是wav格式。
Wav格式和位图一样,是微软开发的文件格式规范。它们都有一个相似之处,就是整个文件分为两部分。第一部分是“文件头”,记录重要的参数信息。对于音频,包括采样率、声道数、位宽等。对于图像,包括图像宽度和高度、颜色位等。第二部分是“数据块”,即一帧一帧的二进制数据。对于音频,它是原始PCM数据。对于图像,它是RGB数据。
前面的文章谈到了如何使用Android平台的API来采集和播放原始音频信号,而本文重点介绍了如何在Android平台上将采集到的PCM音频数据保存为wav文件,也介绍了如何读取和分析wav文件。
在文章的,我还会给出一个AudioDemo程序,集成了近几篇文章涉及的代码,演示了Android音频从采集到播放的全过程。
言归正传,谈谈如何读写wav文件格式。
1.文件标题
,我们来看看wav格式的“文件头”。
我们可以简单分析一下这个wav格式头,主要分为三个部分
第一部分,属于顶层的信息块,用“ChunkID”表示是RIFF格式的文件,用“format”填写“wavE”来标识是WAV文件。而“ChunkSize”记录了整个wav文件的字节数。
第二部分属于“fmt”信息块,主要记录这个wav音频文件的详细音频参数信息,如通道号、采样率、位宽等。
第三部分属于“数据”信息块,“子块2大小”字段记录了后来存储的二进制原始音频数据的长度。
分析到这里,我想大家应该明白了。其实解析一个多媒体格式并不是一件特别复杂的事情。说白了,格式就是一个规范,告诉你我的二进制数据是怎么存储的,你应该用什么样的方式解析。
具体来说,我们可以如下定义一个Java类来抽象和描述wav文件头
/版权声明 Copyright (C) 2016,Jhuster lujun.hust@gmail.com https://github.com/Jhuster/AudioDemo @ Apache许可下的许可,2.0版 @ file wavfileheader . Java @ 1.0版 @ author Jhuster @ date 2016/03/19 /package com . Jhuster . audio demo . API;public class WavFileHeader { public String mChunkID= RIFF ;public int mChunkSize=0;公共字符串mFormat= WAVE公共字符串mSubChunk1ID= fmtpublic int mSubChunk1Size=16public short mAudioFormat=1;公共短mnum channel=1;public int mSampleRate=8000public int mByteRate=0;public short mBlockAlign=0;public short mBitsPerSample=8;公共字符串mSubChunk2ID= datapublic int msubchunk 2 size=0;public WavFileHeader(){ } public WavFileHeader(int sampleRateInHz,int bitsPerSample,int channels){ mSampleRate=sampleRateInHz;mBitsPerSample=(short)bits sample;mNumChannel=(短)信道;mByteRate=mSampleRate mnum channel mBitsPerSample/8;mBlockAlign=(short)(mnum channel mBitsPerSample/8);}}各个字段的具体含义,可以参考我上面给的链接。我们来看看如何读写wav文件。
音视频开发学习地址【免费】FFmpeg/WebRTC/RTMP/NDK/安卓音视频流媒体高级开发-学习视频教程-腾讯课堂
【文章福利】:边肖整理了一些我个人觉得比较好的学习书籍和视频资料,分享在群档案里。如果有需要,可以自己添加!~点击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 音频相关技术,代码地址
https://github.com/Jhuster/AudioDemo
注本系列文章的所有代码,以后都会并入到该 demo 项目中。
相关文章
粤语歌曲网(经典粤语歌曲汇总)
北京奥特莱斯(来北京必逛的12个商场)
豪杰超级解霸(还记得豪杰超级解霸吗?)
龚自珍的资料(清代诗人龚自珍一生功绩简介)
象牙塔是什么意思(“象牙塔”里怎么了?)
水色风信子(水培风信子容易养)
婧字怎么读
虞姬是哪里人(古代著名美人虞姬到底是哪里人?)
公办三本院校(我们还有哪些“三本”?)
电子酒柜(酒柜最全选购指南)
德州景点(德州市景区景点62个)
玉兰油官方网(OLAY发布高端臻粹系列)
更多android 音频播放器(android实现音乐播放)相关信息请关注本文章,本文仅仅做为展示!