android音频学习笔记之wav头文件

这篇具有很好参考价值的文章主要介绍了android音频学习笔记之wav头文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

如何存储和解析wav文件
定义:wav格式,就是微软开发的一种文件格式规范,文件分为两部分
(1)第一部分:文件头,记录重要的参数信息,对于音频而言,包括:采样率,通道数,位宽等等
(2)第二部分:数据块,也就是一帧一帧的二进制数据,对于音频而言,就是原始的PCM数据

(一)将采集的PCM音频数据保存到wav文件

文件头
android音频学习笔记之wav头文件
wav格式头,主要分为三个部分
(1)属于最顶层的信息块
ChunkID 来表示这是一个RIFF格式文件
Format 填入WAVE 来标识这是一个wav文件
ChunkSize 记录了整个wav文件的字节数

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

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

其实,格式就是一种规范,告诉你二进制数据是怎么存储的,你应该按照什么样的方式解析
下图就是数据怎么进行二进制存储的
android音频学习笔记之wav头文件

所以可以写一个java类来抽象和描述wav文件头

public class WavFileHeader {

    public static final int WAV_FILE_HEADER_SIZE = 44;
    public static final int WAV_CHUNKSIZE_EXCLUDE_DATA = 36;//第一部分"顶层"和第二部分"fmt"信息块共占36位

    public static final int WAV_CHUNKSIZE_OFFSET = 4; //ChunkSize是第4位开始,占4个byte
    public static final int WAV_SUB_CHUNKSIZE1_OFFSET = 16;//SubChunk1Size是第16位开始,占4个byte
    public static final int WAV_SUB_CHUNKSIZE2_OFFSET = 40;//SubChunk2Size是第40位开始,占4个byte

    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 channels, int bitsPerSample) {
        mSampleRate = sampleRateInHz;
        mBitsPerSample = (short) bitsPerSample;
        mNumChannel = (short) channels;
        mByteRate = mSampleRate * mNumChannel * mBitsPerSample / 8;
        mBlockAlign = (short) (mNumChannel * mBitsPerSample / 8);
    }
}

也就是将上图描述的用java代码进行抽象化

读写wav文件
wav文件就是一段“文件头+音频二进制数据”,因此:
(1)写wav文件,其实就是先写入一个wav文件头,然后再继续写入音频二进制数据
(2)读wav文件,其实也就是先读一个wav文件,然后再继续读出音频二进制数据即可

值得注意的是:
(1)wav文件头中,有哪些是变化的,哪些是不变的: 文件头开头的“RIFF”字符串就是“不变的”部分,而用来记录音频数据总长度的“Subchunk2Size”变量就是属于“变化的”部分,因为,再音频数据没有彻底全部写完之前,你是无法知道一共写入了多少字节的音频数据的,因此,这个部分,需要用一个变量记录起来,到全部写完之后,再使用 Java 的“RandomAccessFile”类,将文件指针跳转到“Subchunk2Size”字段,改写一下默认值即可。
(2)如何将int ,short变量与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();
}

参考文献:Jhuster的博客文章来源地址https://www.toymoban.com/news/detail-404071.html

到了这里,关于android音频学习笔记之wav头文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity加载并播放本地.wav音频文件

    使用UnityWebRequestMultimedia加载.wav文件,并转成AudioClip对象,然后使用AudioSource进行播放。播放使用协程函数。 加载你的电脑桌面上的test.wav文件并播放。 如需要加载其它格式音频,请将UnityWebRequest www = UnityWebRequestMultimedia.GetAudioClip(“file:///” + fileName, AudioType.WAV);中的AudioType换

    2024年02月04日
    浏览(46)
  • C# 将音频PCM数据封装成wav文件

    之前实现了《C++ 将音频PCM数据封装成wav文件》,最近将其改成了C#版本。使用C#实现录音功能时还是需要写wav文件的,直接用C#实现也是比较简单的,这样可以免去不必要的依赖。 首先需要构造wav头部,wav文件音频信息全部保存在头部,我们要做的就是在PCM数据的前面加入w

    2024年02月07日
    浏览(40)
  • 音频文件PCM、WAV、MP3的区别以及文件合并

    采样率即采样频率,指的一秒内的采样次数,它反映了采样点之间的间隔大小。常说的 44.1KHz 采样率,也即 1 秒采集了 44100 个样本。间隔越小,丢失的信息越少,数字声音就越逼真细腻,要求的存储量也就越大。由于计算机的工作速度和存储容量有限,而且人耳的听觉上限为

    2024年02月15日
    浏览(51)
  • (Python) 在Python中对WAV音频文件进行分割与拼接

    在本文中,我们将介绍如何使用Python来处理音频文件,主要集中在wav文件的分割和拼接方面。 1. 分割WAV文件 对于音频处理来说,分割文件是一项基本任务。在Python中,我们可以使用wave模块来读取.wav文件,并使用SciPy中的signal模块来进行分割。 1.1. 读取WAV文件 使用wave.open()函

    2024年02月21日
    浏览(46)
  • Java Mp3转化WAV/PCM音频数据,解码详细解析,提取每一帧数据集合/比特流/播放,一行代码!

    大家好!我是原子君 1 .因为Java本身只支持,wav,缺少mp3的解码器,所以Java自带的无法对mp3进行处理,这种 MPEG-*音频有损压缩标准编码 ,更不要说使用Java的音频格式和音频流就可以解决。 2 .所以本次转换需要使用到colorful1.1这种纯Java-Pc可跨平台的工具框架。 注意:colorful只支持

    2024年02月15日
    浏览(51)
  • Matlab实现WAV音频文件计算声品质参数:dBA、响度、粗糙度、尖锐度、波动度

    1.dBA         首先读取WAV文件         对时域信号进行加窗划分         调用子函数计算dBA         A-weighted滤波器子函数 2.响度         首先确定窗的大小         本文采用Zwicker模型,通过24Barks的特征响度进行总响度计算:     3.尖锐度Sharpness     

    2024年01月21日
    浏览(76)
  • 会导致电脑蓝屏的wav文件原因未知 log whea logger 17 realtek alc269系统播放音频崩溃

    以为是alc269芯片坏了,结果处理了日中的驱动错误,播放音频不崩溃了,电脑好了! 驱动错误日志: 每分钟都会产生如下的系统日志: 事件 17,WHEA-Logger 发生了已更正的硬件错误。 组件:PCI Express Root Port 错误源: Advanced Error Reporting(PCI Express) 主要设备名称:PCIVEN_8086DEV_A33CSUBS

    2024年02月09日
    浏览(43)
  • uniapp 微信小程序 使用video 播放mp3、wav、flac等音频文件 报错 MEDIA_ERR_DECODE(-11103,11010001)

     官方解释是解码发生了错误,当是我对音频文件进行转码后并未解决这个问题,但是我想到解决方案是使用audio 标签,但是样式又非常丑自能选择自己写,然后又出现个问题audio标签获取不了播放音频总时长,差点没缓过气来。。。最后苦思冥想到了解决方案,使用video标签

    2024年02月03日
    浏览(106)
  • WAV格式音频截取

    【功能】 通常我们会拿到例如某个歌手的演唱会完整版的WAV格式的争端音频,而我们想对该音频进行分割或其中某些部分才是我们实际真正想要的音频段落,为此我们需要设计一个可以按照指定时分秒进行截取的程序。 要求实现的功能如下: 1.根据指定的起止时分秒的设置

    2023年04月08日
    浏览(43)
  • 【音频】WAV 格式详解

    wav 文件支持多种不同的比特率、采样率、多声道音频。 WAV 文件格式是 Microsoft 的 RIFF 规范的一个子集,用于存储多媒体文件。RIFF(resource interchange file format 资源互换文件格式,以 chunk(块) 为单位组织文件)格式文件。在 windows 上,大部分多媒体文件都是 RIFF 文件。wav 文件由

    2023年04月08日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包