1. Descripción general
El archivo WAVE es uno de los formatos de archivo de ondas sonoras utilizados en multimedia y se basa en el formato RIFF.
RIFF es la abreviatura de formato de archivo de intercambio de recursos en inglés. Los primeros cuatro bytes de cada archivo WAVE
son "RIFF".
Los archivos WAVE se componen de varios fragmentos. Según la posición en el archivo, incluye: RIFF WAVE
Chunk, Format Chunk, Fact Chunk (opcional), Data Chunk. Consulte la figura a continuación para obtener más detalles:
------------------------------------------------
| Trozo de ONDA RIFF
| ID = 'RIFF'
| RiffType = 'ONDA'
--------------------------------------- ---
| Formatear fragmento
| ID = 'fmt '
--------------------------------------- ---
| Fragmento de hechos (opcional)
| ID = 'hecho'
--------------------------------------------- ---
| Fragmento de datos
| ID = 'datos'
-------------------------------------------- --- ----
Figura 1 El formato Wav contiene un ejemplo de Chunk
Además del Fact Chunk, se requieren los otros tres Chunks. Cada fragmento tiene su propio ID, que se
encuentra al principio del fragmento como identificador y tiene una longitud de 4 bytes. E inmediatamente después del ID está el tamaño del fragmento
(el número de otros bytes que quedan después de eliminar el número de bytes ocupados por el ID y el tamaño), que está representado por 4 bytes. El byte bajo representa el bit bajo del
valor y el alto El byte representa el valor.Posición alta. El contenido de cada Chunk se presenta en detalle a continuación.
PD:
Todas las representaciones numéricas son bytes bajos que representan bits bajos y bytes altos que representan bits altos.
2. Introducción detallada a
RIFF WAVE Chunk
=====================================
||Número de bytes ocupados | Contenido detallado |
==================================
| ID | 4 Bytes | 'RIFF' |
-- -- ----------------------------------
| Tamaño | 4 Bytes | | //El número de bytes restantes después de eliminar la identificación y el tamaño (Tamaño de archivo -8)
----------------------------------
| Tipo | 4 Bytes | 'WAVE' |
- ----------------------------------
Figura 2 Fragmento de RIFF WAVE
Utilice 'FIFF' como etiqueta, seguido del campo de tamaño, que es el tamaño de todo el archivo wav menos el
número de bytes ocupados por el ID y el Tamaño, es decir, FileLen - 8 = Tamaño. Luego está el campo Tipo, que es 'WAVE', lo que significa
que es un archivo wav.
La estructura se define de la siguiente manera:
struct RIFF_HEADER
{ char szRiffID[4]; // 'R','I','F','F' DWORD dwRiffSize; // Resta el id y el número de bytes ocupados por tamaño, que corresponde al tamaño completo del archivo wav, el tamaño del fragmento de formato a continuación no es el tamaño del wav completo. char szRiffFormat[4]; // 'W','A','V','E ' };
En el fragmento de formato, además de los atributos de audio como la frecuencia de muestreo y el canal de los datos de audio, otro campo importante es format_tag, que indica la forma en que se codifican y almacenan los datos de audio. Sus valores específicos pueden ser los siguientes:
1(0x0001) | PCM/formato sin comprimir | dieciséis | |
2(0x0002 | Microsoft ADCM | 18 | √ |
3(0x0003) | flotador IEEE | 18 | √ |
6(0x0006) | Ley a ITU G.711 | 18 | √ |
7(0x0007) | Ley μ IT G.711 | 18 | √ |
49(0x0031) | GSM 6.10 | 20 | √ |
64(0x0040) | IT G.721 MICDA | √ | |
65.534(0xFFFE) | Ver formatos de codificación en el bloque de subformato | 40 |
Formato de fragmento
=================================================== =====================
| | Número de bytes | Contenido específico |
====================== ================================================
ID | 4 Bytes | 'fmt ' |
------------------------------------------------- ---- -----------------------
| Tamaño | 4 Bytes | El valor es 16 o 18, 18 significa información adicional al final | // El tamaño de este trozo- 8
------------------------------------------------- --- ------------------
| FormatTag | 2 Bytes | Método de codificación, generalmente 0x0001 |
----------------- ------------------------------------------------- - |
| Canales | 2 Bytes | Número de canales, 1--mono; 2--doble canal |
-------------------------- --- ---------------------------------------
| SamplesPerSec | 4 Bytes | Frecuencia de muestreo |
-- ------------------------------------------------ -- ----------------
| AvgBytesPerSec| 4 Bytes | Número de bytes requeridos por segundo |===> WAVE_FORMAT
---------- ------ -------------------------------------- ------ |
| BlockAlign | 2 Bytes | Unidad de alineación del bloque de datos (número de bytes necesarios para cada muestra) |
----------------------- ------ ----------------------------------------- |
| BitsPorMuestra | 2 Bytes | Número de bits necesarios para cada muestra |
-------------------------------------------------- ------------------ |
| | 2 Bytes | Información adicional (opcional, juzgue si está presente por Tamaño) |
------------ ------------------------------------------------- - ------
Figura 3 Formato de fragmento
Marcado con 'fmt'. En circunstancias normales, el tamaño es 16 y no hay información adicional al final; si es 18
, hay 2 bytes de información adicional al final. El formato wav, producido principalmente por algunos programas, contiene esta información adicional de 2 bytes
. La estructura se
define de la siguiente manera: struct WAVE_FORMAT //Es miembro
de la siguiente estructura
{ WORD wFormatTag; WORD wChannels ; DWORD dwSamplesPerSec ; 'm','t',' ' DWORD dwFmtSize; //16 o 18 WAVE_FORMAT wavFormat; }; Descripción de ejemplo: 44 encabezados, sin información adicional -rwxrwxrwx 1 raíz raíz 739160 8 de agosto 17:47 115.wav* Descripción de ejemplo:
Ubicación | byte | valor numérico | describir | tipo | Endian grande y pequeño |
1-4 | 4 | FUE | Formato fijo "RIFF" | 52 49 46 46 |
grande |
5 - 8 | 4 | U32 | Longitud del archivo-8 739152 (00 0b 47 50) | 50 47 0b 00 | Pequeño |
9-12 | 4 | FUE | Tipo de archivo "OLA" | 41 57 45 56 | grande |
13-16 | 4 | FUE | Identificador de formato "fmt " | 66 6d 74 20 | grande |
17-20 | 4 | U32 | "10 00 00 00" representa datos PCM | 10 00 00 00 | Pequeño |
21-22 | 2 | U16 | Tipo de datos, "01 00" significa PCM | 01 00 | Pequeño |
23-24 | 2 | U16 | Número de canales 2 | 02 00 | Pequeño |
25-28 | 4 | U32 | Tasa de muestreo 44100 (00 00 ac 44) | 44 ca 00 00 | Pequeño |
29-32 | 4 | U32 | Velocidad de código: frecuencia de muestreo x profundidad de bits x número de canales/8 44100*16*2/8 = 176400 (00 02 b1 10) |
10 b1 02 00 | Pequeño |
33-34 | 2 | U32 | Muestreo una vez, tamaño de memoria ocupada: profundidad de bits x número de canales/8 =16*2/8=4 | 04 00 | Pequeño |
35-36 | 2 | U16 | Profundidad de muestreo 16 bits |
10 00 | Pequeño |
37-40 | 4 | FUE | La expresión datos de carga útil comienza con "datos" | 64 61 74 61 | grande |
41-44 | 4 | U32 | La longitud de la parte de datos es 739116 (00 0b 47 2c) | 2c 47 0b 00 | Pequeño |
La relación entre TAMAÑO en el formato de archivo:
FileSize = 739160
RiffSize = 739152
DataSize = 739116
Relación: FileSize = 739160
= RiffSize + 8 = 739152 + 8
= DataSize + 44 = 739116 + 44
Fact Chunk
==================================
| |Número de bytes ocupados| Contenido específico |
=== = ==============================
| ID | 4 Bytes | 'hecho' |
--------- - ---------------------
| Tamaño | 4 Bytes | El valor es 4 |
------------ --- ------------------
| datos | 4 Bytes | |
---------------------- --------- ----------
Figura 4 Fragmento de hechos
Fact Chunk es un campo opcional. Generalmente, cuando algún software convierte el archivo wav, se incluye este Chunk.
La estructura se define de la siguiente manera:
struct FACT_BLOCK
{ char szFactID[4]; // 'f','a','c','t' DWORD dwFactSize; // El mismo principio es el tamaño de este fragmento menos id, tamaño };
Fragmento de datos
==================================
| |Número de bytes ocupados| Contenido específico |
=== = ==============================
| ID | 4 Bytes | 'datos' |
--------- - ------------------------------
| Tamaño | 4 Bytes | |
------------- ----- ----------------
| datos | | |
------------------------ -------- -----
Figura 5 Fragmento de datos
Data Chunk es el lugar donde realmente se guardan los datos wav, con "datos" como etiqueta del Chunk. Luego está
el tamaño de los datos. Lo siguiente son los datos wav. Según la cantidad de canales y la cantidad de bits de muestreo en el fragmento de formato,
las posiciones de bits de los datos wav se pueden dividir en las siguientes formas: (es decir, relacionadas con el fragmento de formato)
-------- --------- ----------------------------------------- --------- --
| Mono | Muestra 1 | Muestra 2 | Muestra 3 | Muestra 4 |
|----------------------- ---------- ---------------------------------------- -------
| Cuantización de 8 bits | Canal 0 | Canal 0 | Canal 0 | Canal 0 |
--------------------------- -------------------- --------------------------
| Dos canales | Muestra 1 | Muestra 2 |
|----------- ------------------------------- ------------------- -------
| Cuantización de 8 bits | Canal 0 (izquierda) | Canal 1 (derecha) | Canal 0 (izquierda) | Canal 1 (derecha) |
-------------------------------------------------- --------------------
| Mono | Muestra 1 | Muestra 2 |
|---------------------------------------- - ----------------------------------
| Cuantización de 16 bits | canal 0 | canal 0 | canal 0 | canal 0 |
| | (byte bajo) | (byte alto) | (byte bajo) | (byte alto) |
----------------------- ---- -------------------------------------------------- --
| Dos canales | Muestra 1 | Muestra 2 |
|-------------------------------------- --- -----------------------------------------------
| Cuantización de 16 bits | Canal 0 (izquierda) | Canal 1 (derecha) | Canal 0 (izquierda) | Canal 1 (derecha) | | | (byte bajo) | (byte alto) | (byte bajo) | (byte alto)
|
------------------------------------------------- - ----------------------------------
Figura 6 disposición de posición de bits de datos wav
La estructura del encabezado Data Chunk se define de la siguiente manera:
struct DATA_BLOCK
{ char szDataID[4]; // 'd','a','t','a' DWORD dwDataSize; };
Otras situaciones:
1. Si Format Chunk Size es igual a 0x10 (16), significa que el encabezado no contiene información adicional, es decir, la longitud de la información del encabezado WAV es 44, si es igual a 0x12 (18) , significa que se incluye información adicional y la longitud de la información del encabezado es mayor que 44
2. Si RIFFSize - DataSize > (FormatSize + FactSize), significa que hay otros tipos de datos en la parte de datos. Esta parte de la información debe eliminarse al sacar la parte de datos. Referencia: formato y código de archivo
wave
- Red_Point - Parque de blogs (cnblogs.com)