Análisis del formato RIFF WAVE

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)

Supongo que te gusta

Origin blog.csdn.net/poject/article/details/132180639
Recomendado
Clasificación