当前位置:首页 > 引流 > 正文内容

android音乐播放器的实现(做android音乐播放器的步骤)

admin3年前 (2022-10-10)引流1386

无论是文字、图像还是声音,都必须以一定的格式来组织和存储起来,这样播放器才知道以怎样的方式去解析这一段数据,例如,对于原始的图像数据,我们常见的格式有 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>
 *  https://github.com/Jhuster/AudioDemo
 *   
 *  @license under the Apache License, Version 2.0 
 *
 *  @file    WavFileHeader.java
 *  
 *  @version 1.0     
 *  @author  Jhuster
 *  @date    2016/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 音频相关技术,代码地址:

https://github.com/Jhuster/AudioDemo

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

标签: 音乐

扫描二维码推送至手机访问。

版权声明:本文中部分文字、图片、音频、视频来源于互联网及公开渠道,仅供学习参考,版权归原创者所有! 如侵犯到您的权益,请及时通知我们!我们将在第一时间内删除。

本文链接:http://73ya.com/yinliu/1590.html

分享给朋友:

“android音乐播放器的实现(做android音乐播放器的步骤)” 的相关文章

抖音短视频文案创作脚本 抖音短视频文案素材

现在几乎人人都会刷抖音短视频,脚本,对一则短视频来说可以说是十分的重要。是决定着视频风格的走向,那么今天我们就一起来看看关于抖音短视频文案创作脚本,抖音短视频文案素材的相关内容。 抖音短视频文案创作脚 一、黄金三秒定律...

快手一分购好礼是什么,带动快手电商发展

经历过线上流量的红利时期,电商的行情开始有了减退的趋势。也有了一些显著的市场变化。那些曾经屡试不爽的增长玩法,在如今内卷严重的存量竞争中已经变得不再管用。越来越多的人喜欢在空闲的时间刷小视频什么的。家庭主妇买菜买日用品的时候总喜欢通过社群拼团买到便宜好货……这令社交电商行业不断被开拓,“...

短视频素材哪里有,免费的素材网站有哪些

很多创作短视频的工作者都不知道短视频素材哪里有,免费的素材网站有哪些?本期内容给大家分享做短视频会用到的素材网站,包含了影视动漫游戏素材、影视解说文案素材、短视频剧本、视频魔板、音乐音效以及辅助工具等等。 一、影视动漫游戏素材 01 预告片看世界 这个网站的主要优势就是预告片的各种清晰...

短视频未来会是什么样,短视频发展历程

短视频未来会是什么样?有哪些发展?很多小伙伴都没有发现短视频现在发展越来越快,已经逐渐步入生活的每一个角落里,接下来大家就跟着我一起来看看吧。 一、影视:从影院到手机 1895年法国卢米埃尔兄弟拍摄了第一部无声电影《工厂大门》,片长仅一分钟。这哥俩拍了大量这样的一分钟短片到处放映,这就...

抖音无限次短视频免费下载,抖音无限次短视频app下载

抖音无限次短视频免费下载这是可以让你在这里欣赏到丰富的福利内容,感受到很多精彩优质的趣味体验的手机视频软件,这里有很多好看的内容,还有很多福利资源可以感受,大家在这里还可以进行弹幕互动,进行很多优质有趣的内容感受,而且在这里的各种资源都是免费的,还可以随意的去欣赏互动,现在更是有全网搜索...

抖音短视频推广效果怎么样,抖音短视频推广效果如何

抖音短视频推广不同于一般的平台信息流广告,视频的内容是最重要的。如果用户反馈视频内容优秀,那么推广可以帮助视频在短时间内获得更多的播放量。反之,如果用户反馈不佳,推广则难以进行,播放量也不会有明显提升。 当推广效果不佳的时候,第一时间需要思考是不是自己的内容出现了问题,只有内容本身具备...