国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【音頻】WAV 格式詳解

這篇具有很好參考價(jià)值的文章主要介紹了【音頻】WAV 格式詳解。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

WAV 文件格式解析

概述

wav 文件支持多種不同的比特率、采樣率、多聲道音頻。

WAV 文件格式是 Microsoft 的 RIFF 規(guī)范的一個(gè)子集,用于存儲(chǔ)多媒體文件。RIFF(resource interchange file format 資源互換文件格式,以 chunk(塊) 為單位組織文件)格式文件。在 windows 上,大部分多媒體文件都是 RIFF 文件。wav 文件由若干個(gè) RIFF chunk 構(gòu)成,分別為: RIFF WAVE Chunk,F(xiàn)ormat Chunk,F(xiàn)act Chunk(可選),Data Chunk。另外,文件中還可能包含一些可選的區(qū)塊,如:Fact chunk、Cue points chunk、Playlist chunk、Associated data list chunk 等。具體格式如下:

【音頻】WAV 格式詳解

塊解析

wav 文件都是由 chunk 組成,chunk 的格式如下

size 內(nèi)容 含義
4 bytes ID 如:RIFF,fmt,data
4 bytes chund size 如標(biāo)準(zhǔn)的 fmt chunk 為 16 字節(jié)
N bytes data chunk 的內(nèi)容

RIFF chunk

typedef struct
{
    char ChunkID[4]; //'R','I','F','F'
    unsigned int ChunkSize;
    char Format[4];  //'W','A','V','E'
}riff_chunk;
size 內(nèi)容 含義
4 bytes ChunkID RIFF
4 bytes ChunkSize 從下一個(gè)字段首地址開始到文件末尾的總字節(jié)數(shù)。該字段的數(shù)值加 8 為當(dāng)前文件的實(shí)際長度
4 bytes Format WAVE

其中 ChunkSize 代表的是整個(gè) file_size 的大小減去 ChunkID 和 ChunkSize 的大小,即 file_size=ChunkSize+8。

fmt chunk

typedef struct
{
    char FmtID[4];
    unsigned int FmtSize;
    unsigned short FmtTag;
    unsigned short FmtChannels;
    unsigned int SampleRate;
    unsigned int ByteRate;
    unsigned short BlockAilgn;
    unsigned short BitsPerSample;
}fmt_chunk;
size 內(nèi)容 含義
4 bytes FmtID fmt
4 bytes FmtSize fmt chunk 的大小,一般有 16/18/20/22/40 字節(jié) (也有超過 40 字節(jié)的情況,如果不知道后面部分的含義,直接跳過即可),超過 16 字節(jié)部分為擴(kuò)展塊
2 bytes FmtTag 編碼格式代碼,其值見下 常見編碼格式 表,如果上述取值為 16,則此值通常為 1,代表該音頻的編碼方式是 PCM 編碼
2 bytes FmtChannels 聲道數(shù)目,1 代表單聲道,2 代表雙聲道
4 bytes SampleRate 采樣頻率,8/11.025/12/16/22.05/24/32/44.1/48/64/88.2/96/176.4/192 kHZ
4 bytes ByteRate 傳輸速率,每秒的字節(jié)數(shù),計(jì)算公式為:SampleRate * FmtChannels * BitsPerSample/8
2 bytes BlockAilgn 塊對(duì)齊,告知播放軟件一次性需處理多少字節(jié),公式為: BitsPerSample*FmtChannels/8
2 bytes BitsPerSample 采樣位數(shù),一般有8/16/24/32/64,值越大,對(duì)聲音的還原度越高

常見編碼格式

格式編碼 格式名稱 fmt 塊長度 fact 塊
0x01 PCM / 非壓縮格式 16
0x02 Microsoft ADPCM 18
0x03 IEEE float 18
0x06 ITU G.711 a-law 18
0x07 ITU G.711 μ-law 18
0x031 GSM 6.10 20
0x040 ITU G.721 ADPCM
0xFFFE 見子格式塊中的編碼格式 40

data chunk

struct DATA_CHUNK
{
    char DataID[4]; //'d','a','t','a'
    unsigned int DataSize;
};
size 內(nèi)容 含義
4 bytes DataID data
4 bytes DataSize 原始音頻數(shù)據(jù)的大小

示例分析

Linux 平臺(tái)下使用 mediainfo 分析 wav 文件

安裝

 sudo apt-get install mediainfo

解析

執(zhí)行命令:mediainfo test.wav

General
Complete name                            : test.wav
Format                                   : Wave
File size                                : 1.35 MiB
Duration                                 : 8 s 0 ms
Overall bit rate mode                    : Constant
Overall bit rate                         : 1 411 kb/s

Audio
Format                                   : PCM
Format settings                          : Little / Signed
Codec ID                                 : 1
Duration                                 : 8 s 0 ms
Bit rate mode                            : Constant
Bit rate                                 : 1 411.2 kb/s
Channel(s)                               : 2 channels
Sampling rate                            : 44.1 kHz
Bit depth                                : 16 bits
Stream size                              : 1.35 MiB (100%)

查看文件大小

 ls test.wav -l
-rw-rw-r-- 1 tyustli tyustli 1411248 729 15:03 test.wav

hd 工具查看原始數(shù)據(jù)文章來源地址http://www.zghlxwxcb.cn/news/detail-401477.html

hd test.wav -n 128
00000000  52 49 46 46 a8 88 15 00  57 41 56 45 66 6d 74 20  |RIFF....WAVEfmt |
00000010  10 00 00 00 01 00 02 00  44 ac 00 00 10 b1 02 00  |........D.......|
00000020  04 00 10 00 64 61 74 61  84 88 15 00 0e fc fa fe  |....data........|
00000030  6c fb 8a fe c2 fa 19 fe  1e fa b5 fd 85 f9 64 fd  |l.............d.|
00000040  f5 f8 20 fd 73 f8 df fc  09 f8 92 fc bb f7 28 fc  |.. .s.........(.|
00000050  83 f7 9d fb 5f f7 fe fa  46 f7 55 fa 2e f7 a3 f9  |...._...F.U.....|
00000060  23 f7 fa f8 36 f7 6b f8  57 f7 ef f7 84 f7 83 f7  |#...6.k.W.......|
00000070  c7 f7 2d f7 1e f8 eb f6  88 f8 c3 f6 0b f9 c5 f6  |..-.............|
  • 52 49 46 46:對(duì)應(yīng)的 ASCII 字符為:RIFF
  • a8 88 15 00:ChunkSize,對(duì)應(yīng)的十六進(jìn)制是 0x1588a8=1411240 +8 和上面的文件大小一致
  • 57 41 56 45:對(duì)應(yīng)的 ASCII 字符為 WAVE
  • 66 6d 74 20:對(duì)應(yīng)的 ASCII 字符為 fmt
  • 10 00 00 00:FmtSize 0x10=16 代表PCM編碼方式
  • 01 00:對(duì)應(yīng)為1,代表PCM編碼方式
  • 02 00:通道個(gè)數(shù),通道數(shù)為2
  • 44 ac 00 00:采樣頻率 0xac44=44100=44.1KHz
  • 10 b1 02 00:每秒所需的字節(jié)數(shù),轉(zhuǎn)化為十六進(jìn)制為: 0x2b110=176400 通過此值可以計(jì)算該音頻的時(shí)長:1411240/176400 = 8s
  • 04 00:數(shù)據(jù)對(duì)齊單位
  • 10 00:采樣位數(shù) 0x10=16
  • 64 61 74 61:對(duì)應(yīng)的 ASCII 字符為 data
  • 84 88 15 00:對(duì)應(yīng)該音頻的raw數(shù)據(jù)的大小,轉(zhuǎn)化為十六進(jìn)制為 0x158884=1411204,此值等于 1411248-44

代碼解析

/*
 * Change Logs:
 * Date           Author       Notes
 * 2022-08-26     tyustli      first version
 */

#include <stdio.h>
#include <stdint.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/stat.h>

typedef struct {
    char ChunkID[4]; //'R','I','F','F'
    unsigned int ChunkSize;
    char Format[4]; //'W','A','V','E'
} riff_chunk;

typedef struct {
    char FmtID[4];
    unsigned int FmtSize;
    unsigned short FmtTag;
    unsigned short FmtChannels;
    unsigned int SampleRate;
    unsigned int ByteRate;
    unsigned short BlockAilgn;
    unsigned short BitsPerSample;
} fmt_chunk;

typedef struct {
    char DataID[4]; //'d','a','t','a'
    unsigned int DataSize;
} data_chunk;


typedef struct {
    riff_chunk riff_region;
    fmt_chunk fmt_region;
    data_chunk data_region;
} wav_struct;

static void *map_file(const char *path);
static void data_dump(wav_struct *data);

int main(int argc, char *argv[]) {

    assert(sizeof(wav_struct) == 44); /* defensive */

    if (argc < 2) {
        printf("usage: %s file_path\r\n", argv[0]);
        exit(-1);
    }

    /* map file */
    wav_struct *map_data = map_file(argv[1]);

    /* data dump */
    data_dump(map_data);

    /* munmap file */
    munmap(map_data, map_data->riff_region.ChunkSize + 8);

    return 1;
}

static void *map_file(const char *path) {

    assert(path != NULL);

    int fd = open(path, O_RDWR);
    if (fd == -1) {
        goto __release;
    }

#if 0
    off_t size = lseek(fd, 0, SEEK_END);
    if (size == -1) {
        goto __release;
    }
#endif

    /* get file size */
    struct stat stat;
    int ret = fstat(fd, &stat);
    if (ret == -1) {
        goto __release;
    }

    size_t size = stat.st_size;

    /* map file */
    void *file_data = mmap(NULL, size, PROT_READ, MAP_PRIVATE, fd, 0);
    if(file_data == (void *)-1) {
        goto __release;
    }
    close(fd);

    return file_data;

    /* error handle */
__release:
    perror("map file");
    if (fd > 0) {
        close(fd);
    }
    exit(1);
}

static void data_dump(wav_struct *data) {

    /* riff chunkid */
    printf("riff chunk id          :");
    for(int i = 0; i < 4; i++) {
        printf("%c", data->riff_region.ChunkID[i]);
    }
    printf("\r\n");

    /* file size */
    printf("wav file size          :%d\r\n", data->riff_region.ChunkSize + 8);

    /* riff Format */
    printf("riff format id         :");
    for(int i = 0; i < 4; i++) {
        printf("%c", data->riff_region.Format[i]);
    }
    printf("\r\n");

    /* fmt chunkid */
    printf("fmt chunk id           :");
    for(int i = 0; i < 4; i++) {
        printf("%c", data->fmt_region.FmtID[i]);
    }
    printf("\r\n");

    printf("FmtChannels            :%d(1 單聲道, 2 雙聲道)\r\n", data->fmt_region.FmtChannels);
    printf("FmtTag                 :%d(1 PCM 編碼)\r\n", data->fmt_region.FmtTag);
    printf("SampleRate             :%d\r\n", data->fmt_region.SampleRate);
    printf("ByteRate               :%d\r\n", data->fmt_region.ByteRate);
    printf("BitsPerSample          :%d\r\n", data->fmt_region.BitsPerSample);

    /* data chunkid */
    printf("fmt chunk id           :");
    for(int i = 0; i < 4; i++) {
        printf("%c", data->data_region.DataID[i]);
    }
    printf("\r\n");
}
/**
 * 編譯:gcc wav_parse.c
 * 運(yùn)行:./a.out sample.wav
 * 結(jié)果:
 * riff chunk id          :RIFF
 * wav file size          :497904
 * riff format id         :WAVE
 * fmt chunk id           :fmt 
 * FmtChannels            :2(1 單聲道, 2 雙聲道)
 * FmtTag                 :1(1 PCM 編碼)
 * SampleRate             :44100
 * ByteRate               :176400
 * BitsPerSample          :16
 * fmt chunk id           :data
 * 
*/

/*************** end of file ***************/

到了這里,關(guān)于【音頻】WAV 格式詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • HTML5支持的視頻文件格式和音頻文件格式有哪些?

    HTML5支持的視頻文件格式和音頻文件格式有哪些?

    在 HTML5 標(biāo)準(zhǔn)中, 我們有了新的 audio 和 video 標(biāo)簽, 分別可以引入視頻和音頻文件的標(biāo)簽 那么這些標(biāo)簽又可以支持哪些文件格式呢 ? MP4:MPEG-4 Part 14,支持H.264編碼。幾乎所有的瀏覽器都支持該格式。 WebM:谷歌開發(fā)的格式,使用VP8或VP9編碼,可以在大多數(shù)現(xiàn)代瀏覽器中播放 Ogg:

    2024年02月01日
    瀏覽(27)
  • 【Unity】流式播放遠(yuǎn)端音頻:WAV格式音頻篇(一)

    先了解一下wav的格式: 參考1:【音頻】WAV 格式詳解_tyustli的博客-CSDN博客_wav文件格式詳解 wav 文件支持多種不同的比特率、采樣率、多聲道音頻。WAV 文件格式是 Microsoft 的 RIFF 規(guī)范的一個(gè)子集,用于存儲(chǔ)多媒體文件。RIFF(resource interchange file format 資源互換文件格式,以 chu

    2024年02月06日
    瀏覽(26)
  • 將音頻格式從flac轉(zhuǎn)到wav的兩種方法

    將音頻格式從flac轉(zhuǎn)到wav的兩種方法

    最近在智能語音中用到了數(shù)據(jù)集cn-celeb。這個(gè)數(shù)據(jù)集的音頻格式是flac,而在做數(shù)據(jù)增強(qiáng)(augmentation)以及模型訓(xùn)練時(shí)用的數(shù)據(jù)格式是wav,因此需要把音頻格式從flac轉(zhuǎn)到wav。我在ubuntu下摸索了一番,找到了兩種方法。 ? 1,基于Linux下的sox命令寫shell腳本實(shí)現(xiàn) SoX??(即 Sound eXch

    2024年02月03日
    瀏覽(23)
  • 視頻批量高效剪輯,支持將視頻文件轉(zhuǎn)換為音頻文件,輕松掌握視頻格式

    視頻批量高效剪輯,支持將視頻文件轉(zhuǎn)換為音頻文件,輕松掌握視頻格式

    在數(shù)字化時(shí)代,視頻內(nèi)容日益豐富,管理和編輯這些視頻變得愈發(fā)重要。然而,傳統(tǒng)的視頻剪輯軟件往往操作復(fù)雜,難以滿足高效批量處理的需求?,F(xiàn)在,一款全新的視頻批量剪輯神器應(yīng)運(yùn)而生,它支持將視頻文件一鍵轉(zhuǎn)換為音頻文件,同時(shí)輕松掌握各種視頻格式,讓你的視

    2024年04月14日
    瀏覽(23)
  • mp3怎樣才能轉(zhuǎn)換成wav格式?音頻互相轉(zhuǎn)換的方法

    mp3怎樣才能轉(zhuǎn)換成wav格式?音頻互相轉(zhuǎn)換的方法

    一,什么是WAV WAV,全稱為波形音頻文件(Waveform Audio File Format),是一種由微軟公司和IBM公司聯(lián)合開發(fā)的音頻文件格式。自1991年問世以來,WAV格式因其無損的音頻質(zhì)量和廣泛的兼容性,成為了多媒體應(yīng)用中不可或缺的一部分。本文將從WAV格式的定義、特點(diǎn)、應(yīng)用以及與其他音

    2024年04月14日
    瀏覽(94)
  • 【音視頻 | AAC】AAC格式音頻文件解析

    【音視頻 | AAC】AAC格式音頻文件解析

    ??博客主頁??:??https://blog.csdn.net/wkd_007?? ??博客內(nèi)容??:??嵌入式開發(fā)、Linux、C語言、C++、數(shù)據(jù)結(jié)構(gòu)、音視頻?? ??本文內(nèi)容??:??介紹AAC格式音頻文件解析?? ??金句分享??:??你不能選擇最好的,但最好的會(huì)來選擇你——泰戈?duì)?? 本文未經(jīng)允許,不得轉(zhuǎn)發(fā)!!

    2024年02月04日
    瀏覽(26)
  • Python環(huán)境下基于自適應(yīng)濾波器的音頻信號(hào)(wav格式)降噪方法

    Python環(huán)境下基于自適應(yīng)濾波器的音頻信號(hào)(wav格式)降噪方法

    Python的集成環(huán)境我一般使用的是 Winpython , Winpytho 脫胎于pythonxy,面向 科學(xué)計(jì)算 , 兼顧數(shù)據(jù)分析與挖掘 ;Anaconda 主要面向數(shù)據(jù)分析與挖掘方面 ,在大數(shù)據(jù)處理方面有自己特色的一些包; Winpytho 強(qiáng)調(diào) 便攜性 ,被做成綠色軟件,不寫入注冊(cè)表,安裝其實(shí)就是解壓到某個(gè)文件夾

    2024年01月18日
    瀏覽(21)
  • 【音頻】python讀取寫入wav文件

    使用librosa庫: librosa.load(文件路徑,采樣率sampling rate) 直接用librosa的函數(shù) librosa.output.write_wav(\\\'output.wav\\\', y, sr) 會(huì)報(bào)錯(cuò): \\\"AttributeError: module \\\'librosa\\\' has no attribute \\\'output\\\'\\\" 。 這是因?yàn)閘ibrosa庫在0.8.0版本后把這個(gè)函數(shù)刪掉了,我們可以用soundfile庫的soundfile.write()函數(shù)達(dá)到同樣的目的

    2024年02月03日
    瀏覽(20)
  • android音頻學(xué)習(xí)筆記之wav頭文件

    android音頻學(xué)習(xí)筆記之wav頭文件

    如何存儲(chǔ)和解析wav文件 定義:wav格式,就是微軟開發(fā)的一種文件格式規(guī)范,文件分為兩部分 (1)第一部分:文件頭,記錄重要的參數(shù)信息,對(duì)于音頻而言,包括:采樣率,通道數(shù),位寬等等 (2)第二部分:數(shù)據(jù)塊,也就是一幀一幀的二進(jìn)制數(shù)據(jù),對(duì)于音頻而言,就是原始

    2023年04月08日
    瀏覽(21)
  • Unity加載并播放本地.wav音頻文件

    Unity加載并播放本地.wav音頻文件

    使用UnityWebRequestMultimedia加載.wav文件,并轉(zhuǎn)成AudioClip對(duì)象,然后使用AudioSource進(jìn)行播放。播放使用協(xié)程函數(shù)。 加載你的電腦桌面上的test.wav文件并播放。 如需要加載其它格式音頻,請(qǐng)將UnityWebRequest www = UnityWebRequestMultimedia.GetAudioClip(“file:///” + fileName, AudioType.WAV);中的AudioType換

    2024年02月04日
    瀏覽(32)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包