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

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

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

无论是文字、图像还是声音,都必须以一定的格式来组织和存储起来,这样播放器才知道以怎样的方式去解析这一段数据,例如,对于原始的图像数据,我们常见的格式有 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://www.73ya.com/yinliu/1590.html

分享给朋友:

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

短视频怎么做脚本,六个步骤你就懂了

做短视频的基础就是脚本,脚本是创作的基石,是贯穿这个视频始末的逻辑。很多小伙伴刚接触的时候对于短视频的了解仅仅是在观看短视频的层面上。但是其实短视频这一条路并不轻松。那么对于短视频脚本应该要怎么做呢?接下来就跟着小编一起来看看吧。 短视频怎么做脚本   01 镜头景别 镜头分为远景、全...

2022年最火短视频素材网站,新手也能快速上手

做了短视频好长一段时间,短视频学了久了就越发现自己不会的越多,知道的越少。也会面临着方方面面的问题。缺少素材怎么办?这是很多短视频创作者都会有过的想法,那么接下来就跟着小编一起来看看吧。 2022年最火短视频素材网站 1、Mixkit——创意视频素材   Mixkit,做新媒体运营的朋...

抖音短视频怎么运营,有什么特点

一说到数字化难免提到抖音,现在各大品牌企业都在用抖音短视频进行推广和获客,抖音短视频怎么运营?接下来就跟着小编一起来看看吧。   抖音短视频怎么运营   一、抖音短视频特点 直观:通过抖音短视频可以对产品进行全方位的展示,可以让用户更直观的感知到产品的特性,疫情之后,消费者线上活跃度...

抖音怎么引流,抖音引流技巧

近几年抖音的热潮一直都持续不减,很多人都想来抖音这个平台发展。但是做的人越多了却不好做了,前期的红利期已经过去了,现在要抓住新的机遇。不管是对于个人还是企业来说。现在面临的最大问题就是没有点击量,也没有曝光,让很多人望而却步。那么抖音应该如何引流呢,接下来就跟着小编一起来看看吧。 一、...

抖音电商赚钱靠谱吗,抖音电商挣钱方法

生活中,哪一刻感到困顿无比?当生活给予你磨难的时候,当你为了全勤奖的时候,当你上班赶车的时候,当你想多睡十几分钟不敢的时候,当你为了孩子读书的时候,生活的每一个瞬间,都有过想要放弃的时候。 哎,都说没钱万事难。这所以趁现在,多赚点钱吧。不说钱有多万能,只说缺钱真的寸步难行!也许你会说:...

抖音网页版怎么下载视频,抖音网页版入口

最近,抖音大大应该是听到了广大摸鱼党的心声,于是,我们的抖音网页版横空出世!抖音网页版不仅免费为大家服务而且福利多多,精彩电影等你来观看。 这一举动,让众多摸鱼党欢呼雀跃:终于能用电脑刷抖音了,不怕手机没电了,也不怕看视频没有会员了。 「抖音网页版」来了,不用充会员就能看视频,摸鱼党...