ΠœΠ΅Ρ‚ΠΎΠ΄ΠΈ Π·Π° компрСсия/ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΌΠ΅Π΄ΠΈΠΉΠ½ΠΈ Π΄Π°Π½Π½ΠΈ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈ WAVE ΠΈ JPEG, част 1

Π—Π΄Ρ€Π°Π²Π΅ΠΉΡ‚Π΅! ΠŸΡŠΡ€Π²Π°Ρ‚Π° ΠΌΠΈ сСрия статии Ρ‰Π΅ бъдС посвСтСна Π½Π° ΠΈΠ·ΡƒΡ‡Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΡ‚Π΅ Π·Π° компрСсия ΠΈ ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π½Π° изобраТСния/Π·Π²ΡƒΡ†ΠΈ, ΠΊΠ°Ρ‚ΠΎ JPEG (ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅) ΠΈ WAVE (Π·Π²ΡƒΠΊ), Π° ΡΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° Ρ‰Π΅ Π²ΠΊΠ»ΡŽΡ‡Π²Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‰ΠΈ Ρ‚Π΅Π·ΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈ (.jpg, .wav) Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°. Π’ Ρ‚Π°Π·ΠΈ част Ρ‰Π΅ Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ WAVE.

Π˜ΡΡ‚ΠΎΡ€ΠΈΡ

WAVE (Waveform Audio File Format) β€” Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅Π½ Ρ„Π°ΠΉΠ» Π·Π° ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π½Π° запис Π½Π° Π°ΡƒΠ΄ΠΈΠΎ ΠΏΠΎΡ‚ΠΎΠΊ. Π’ΠΎΠ·ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π½Π° нСсТат Π·Π²ΡƒΠΊ Π² импулсно-ΠΊΠΎΠ΄ΠΎΠ²Π° модулация. (Π’Π·Π΅Ρ‚ΠΎ ΠΎΡ‚ УикипСдия)

Π’ΠΎΠΉ Π΅ измислСн ΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½ ΠΏΡ€Π΅Π· 1991 Π³ΠΎΠ΄ΠΈΠ½Π° Π·Π°Π΅Π΄Π½ΠΎ с RIFF ΠΎΡ‚ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ ΠΊΠ°Ρ‚ΠΎ Microsoft ΠΈ IBM (Π’ΠΎΠ΄Π΅Ρ‰ΠΈΡ‚Π΅ IT ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ ΠΎΡ‚ ΠΎΠ½ΠΎΠ²Π° Π²Ρ€Π΅ΠΌΠ΅).

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π°Ρ‚Π° Π½Π° Ρ„Π°ΠΉΠ»Π°

Π€Π°ΠΉΠ»ΡŠΡ‚ ΠΈΠΌΠ° Π·Π°Π³Π»Π°Π²Π½Π° част, самитС Π΄Π°Π½Π½ΠΈ, Π½ΠΎ няма Ρ„ΡƒΡ‚Π΅Ρ€. Π—Π°Π³Π»Π°Π²ΠΈΠ΅Ρ‚ΠΎ Π·Π°Π΅ΠΌΠ° ΠΎΠ±Ρ‰ΠΎ 44 Π±Π°ΠΉΡ‚Π°.
Π’ Π·Π°Π³Π»Π°Π²ΠΈΠ΅Ρ‚ΠΎ сС Π½Π°ΠΌΠΈΡ€Π°Ρ‚ настройки Π·Π° броя Π½Π° Π±ΠΈΡ‚ΠΎΠ²Π΅Ρ‚Π΅ Π² сСмпла, чСстотата Π½Π° дискрСтизация, Π΄ΡŠΠ»Π±ΠΎΡ‡ΠΈΠ½Π°Ρ‚Π° Π½Π° Π·Π²ΡƒΠΊΠ° ΠΈ Ρ‚.Π½. информация, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° Π·Π° Π·Π²ΡƒΠΊΠΎΠ²Π°Ρ‚Π° ΠΊΠ°Ρ€Ρ‚Π°. (Всички числови стойности Π² Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° трябва Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ записани Π² Little-Endian Ρ€Π΅Π΄.)

ИмС на блока
Π Π°Π·ΠΌΠ΅Ρ€ Π½Π° Π±Π»ΠΎΠΊΠ° (B)
ОписаниС/ΠŸΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
Бтойност (ΠΏΡ€ΠΈ някои Π΅ фиксирана)

chunkId
4
ΠžΠΏΡ€Π΅Π΄Π΅Π»Ρ Ρ„Π°ΠΉΠ»Π° ΠΊΠ°Ρ‚ΠΎ мСдия-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€
0x52494646 Π² Big-Endian (Β«RIFFΒ»)

chunkSize
4
Π Π°Π·ΠΌΠ΅Ρ€ Π½Π° цСлия Ρ„Π°ΠΉΠ» Π±Π΅Π· chunkId ΠΈ chunkSize
FILE_SIZE β€” 8

format
4
ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΈΠΏΠ° ΠΎΡ‚ RIFF
0x57415645 Π² Big-Endian (Β«WAVEΒ»)

subchunk1Id
4
Π—Π° Π΄Π° Π·Π°Π΅ΠΌΠ° Ρ„Π°ΠΉΠ»Π° ΠΏΠΎΠ²Π΅Ρ‡Π΅ място, ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°
0x666d7420 Π² Big-Endian (Β«fmt Β«)

subchunk1Size
4
ΠžΡΡ‚Π°Π½Π°Π»Π°Ρ‚Π° част ΠΎΡ‚ Π·Π°Π³Π»Π°Π²ΠΈΠ΅Ρ‚ΠΎ (Π² Π±Π°ΠΉΡ‚ΠΎΠ²Π΅)
16 ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ (Π·Π° случая Π±Π΅Π· компрСсия Π½Π° Π°ΡƒΠ΄ΠΈΠΎΠΏΠΎΡ‚ΠΎΠΊΠ°)

audioFormat
2
Аудио Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ (зависи ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π½Π° компрСсия ΠΈ структурата Π½Π° Π°ΡƒΠ΄ΠΈΠΎΠ΄Π°Π½Π½ΠΈΡ‚Π΅)
1 (Π·Π° PCM, ΠΊΠΎΠΉΡ‚ΠΎ Ρ€Π°Π·Π³Π»Π΅ΠΆΠ΄Π°ΠΌΠ΅)

numChannels
2
Π‘Ρ€ΠΎΠΉ ΠΊΠ°Π½Π°Π»ΠΈ
1/2, Ρ‰Π΅ Π²Π·Π΅ΠΌΠ΅ΠΌ 1 ΠΊΠ°Π½Π°Π» (3/4/5/6/7… β€” спСцифична Π°ΡƒΠ΄ΠΈΠΎΠ΄ΠΎΡ€ΠΎΠΆΠΊΠ°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ 4 Π·Π° ΠΊΠ²Π°Π΄Ρ€ΠΎ Π·Π²ΡƒΠΊ ΠΈ Ρ‚.Π½.)

sampleRate
4
ЧСстота Π½Π° сСмплиранС Π½Π° Π·Π²ΡƒΠΊΠ° (Π² Π₯Π΅Ρ€Ρ†ΠΈ)
ΠšΠΎΠ»ΠΊΠΎΡ‚ΠΎ ΠΏΠΎ-висока Π΅, Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π° ΠΏΠΎ-качСствСн Π·Π²ΡƒΠΊ Ρ‰Π΅ ΠΈΠΌΠ°, Π½ΠΎ Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π° ΠΏΠΎΠ²Π΅Ρ‡Π΅ ΠΏΠ°ΠΌΠ΅Ρ‚ Ρ‰Π΅ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° Π·Π° ΡΡŠΠ·Π΄Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π°ΡƒΠ΄ΠΈΠΎΠ΄ΠΎΡ€ΠΎΠΆΠΊΠ° със ΡΡŠΡ‰Π°Ρ‚Π° дълТина, ΠΏΡ€Π΅ΠΏΠΎΡ€ΡŠΡ‡ΠΈΡ‚Π΅Π»Π½Π°Ρ‚Π° стойност Π΅ 48000 (Π½Π°ΠΉ-ΠΏΡ€ΠΈΠ΅ΠΌΠ»ΠΈΠ²ΠΎ качСство Π½Π° Π·Π²ΡƒΠΊΠ°)

byteRate
4
Π‘Ρ€ΠΎΠΉ Π±Π°ΠΉΡ‚ΠΎΠ²Π΅ Π·Π° 1 сСкунда
sampleRate numChannels bitsPerSample (ΠΏΠΎ-Π΄ΠΎΠ»Ρƒ)

blockAlign
2
Π‘Ρ€ΠΎΠΉ Π±Π°ΠΉΡ‚ΠΎΠ²Π΅ Π·Π° 1 сСмпъл
numChannels * bitsPerSample: 8

bitsPerSample
2
Π‘Ρ€ΠΎΠΉ Π±ΠΈΡ‚ΠΎΠ²Π΅ Π·Π° 1 сСмпъл (Π΄ΡŠΠ»Π±ΠΎΡ‡ΠΈΠ½Π°)
Всяко число, ΠΊΡ€Π°Ρ‚Π½ΠΎ Π½Π° 8. ΠšΠΎΠ»ΠΊΠΎΡ‚ΠΎ ΠΏΠΎ-голямо Π΅, Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π° ΠΏΠΎ-Π΄ΠΎΠ±Ρ€ΠΎ ΠΈ Ρ‚Π΅ΠΆΠΊΠΎ Ρ‰Π΅ бъдС Π°ΡƒΠ΄ΠΈΠΎ, ΠΎΡ‚ 32 Π±ΠΈΡ‚Π° няма Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π·Π° Ρ‡ΠΎΠ²Π΅ΠΊΠ°.

subchunk2Id
4
ΠœΠ°Ρ€ΠΊΠ΅Ρ€ Π·Π° Π½Π°Ρ‡Π°Π»ΠΎΡ‚ΠΎ Π½Π° Π΄Π°Π½Π½ΠΈΡ‚Π΅ (Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° ΠΈΠΌΠ° Π΄Ρ€ΡƒΠ³ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ Π² Π·Π°Π³Π»Π°Π²ΠΈΠ΅Ρ‚ΠΎ Π² зависимост ΠΎΡ‚ audioFormat)
0x64617461 Π² Big-Endian (Β«dataΒ»)

subchunk2Size
4
Π Π°Π·ΠΌΠ΅Ρ€ Π½Π° областта с Π΄Π°Π½Π½ΠΈ
Ρ€Π°Π·ΠΌΠ΅Ρ€ data Π² int’С

data
byteRate * ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠΈΡ‚Π΅Π»Π½ΠΎΡΡ‚ Π½Π° Π°ΡƒΠ΄ΠΈΠΎ
Аудиоданни
?

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ с WAVE

ΠŸΡ€Π΅Π΄ΠΈΡˆΠ½Π°Ρ‚Π° Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΌΠΎΠΆΠ΅ лСсно Π΄Π° сС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π° Π² структура Π½Π° C, Π½ΠΎ Π½Π°ΡˆΠΈΡΡ‚ Π΅Π·ΠΈΠΊ днСс Π΅ Python. Най-лСсното, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ "Π²ΡŠΠ»Π½Π°Ρ‚Π°" β€” Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π° ΡˆΡƒΠΌ. Π—Π° Ρ‚Π°Π·ΠΈ Π·Π°Π΄Π°Ρ‡Π° Π½Π΅ са Π½ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈ висок byteRate ΠΈ компрСсия.
ΠŸΡŠΡ€Π²ΠΎ, Π½Π΅ΠΊΠ° ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€Π°ΠΌΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈΡ‚Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ:

# WAV.py

from struct import pack  # ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ py-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Π±Π°Π·ΠΎΠ²Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ΠΈΠ· C
from os import urandom  # функция для чтСния /dev/urandom, для windows:
# from random import randint
# urandom = lambda sz: bytes([randint(0, 255) for _ in range(sz)])  # лямбда ΠΏΠΎΠ΄ windows, Ρ‚.ΠΊ. urandom'Π° Π² Π²ΠΈΠ½Π΄Π΅ Π½Π΅Ρ‚
from sys import argv, exit  # Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊ ΠΏΡ€ΠΎΠ³Π΅ ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄

if len(argv) != 3:  # +1 имя скрипта (-1, Ссли Π±ΡƒΠ΄Π΅Ρ‚Π΅ Π·Π°ΠΌΠΎΡ€Π°ΠΆΠΈΠ²Π°Ρ‚ΡŒ)
    print('Usage: python3 WAV.py [num of samples] [output]')
    exit(1)

Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° трябва Π΄Π° създадСм всички Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ ΠΎΡ‚ Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° ΠΏΠΎ Ρ‚Π΅Ρ…Π½ΠΈΡ‚Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΈ. ΠŸΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡ‚Π΅ Π² нСя зависят само ΠΎΡ‚ numSamples (броя Π½Π° сСмплитС). ΠšΠΎΠ»ΠΊΠΎΡ‚ΠΎ ΠΏΠΎΠ²Π΅Ρ‡Π΅ Π±ΡŠΠ΄Π°Ρ‚, Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π° ΠΏΠΎ-дълго Ρ‰Π΅ Π²ΡŠΡ€Π²ΠΈΠΌ нашия ΡˆΡƒΠΌ.

numSamples = int(argv[1])
output_path = argv[2]

chunkId = b'RIFF'
Format = b'WAVE'
subchunk1ID = b'fmt '
subchunk1Size = b'x10x00x00x00'  # 0d16
audioFormat = b'x01x00'
numChannels = b'x02x00'  # 2-ΠΊΠ°Π½Π°Π»Π° са Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΈ (стСрСо)
sampleRate = pack('<L', 1000)  # 1000 Π΅ Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ, Π½ΠΎ Π°ΠΊΠΎ слоТим ΠΏΠΎΠ²Π΅Ρ‡Π΅, ΡˆΡƒΠΌΡŠΡ‚ Ρ‰Π΅ сС Ρ‡ΡƒΠ²Π° ΠΏΠΎ-Π΄ΠΎΠ±Ρ€Π΅. Π‘ 1000 Π·Π²ΡƒΡ‡ΠΈ ΠΊΠ°Ρ‚ΠΎ Π²ΡΡ‚ΡŠΡ€
bitsPerSample = b'x20x00'  # 0d32
byteRate = pack('<L', 1000 * 2 * 4)  # sampleRate * numChannels * bitsPerSample / 8  (32 Π±ΠΈΡ‚ΠΎΠ² Π·Π²ΡƒΠΊ)
blockAlign = b'x08x00'  # numChannels * BPS / 8
subchunk2ID = b'data'
subchunk2Size = pack('<L', numSamples * 2 * 4)  # * numChannels * BPS / 8
chunkSize = pack('<L', 36 + numSamples * 2 * 4)  # 36 + subchunk2Size

data = urandom(1000 * 2 * 4 * numSamples)  # самият ΡˆΡƒΠΌ

ΠžΡΡ‚Π°Π²Π° само Π΄Π° Π³ΠΈ запишСм Π² Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ°Ρ‚Π° послСдоватСлност (ΠΊΠ°ΠΊΡ‚ΠΎ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π°):

with open(output_path, 'wb') as fh:
    fh.write(chunkId + chunkSize + Format + subchunk1ID +
            subchunk1Size + audioFormat + numChannels + 
            sampleRate + byteRate + blockAlign + bitsPerSample +
            subchunk2ID + subchunk2Size + data)  # записвамС

И Ρ‚Π°ΠΊΠ°, Π³ΠΎΡ‚ΠΎΠ²ΠΎ. Π—Π° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ скрипта, трябва Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈΡ‚Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΈ Π½Π° командния Ρ€Π΅Π΄:
python3 WAV.py [num of samples] [output]
num of samples β€” Π±Ρ€ΠΎΠΉ сСмпли
output β€” ΠΏΡŠΡ‚ към изходния Ρ„Π°ΠΉΠ»

Π•Ρ‚ΠΎ Π²Ρ€ΡŠΠ·ΠΊΠ° към тСстов Π°ΡƒΠ΄ΠΈΠΎΡ„Π°ΠΉΠ» със ΡˆΡƒΠΌ, Π½ΠΎ Π·Π° Π΄Π° спСстя ΠΏΠ°ΠΌΠ΅Ρ‚, Π½Π°ΠΌΠ°Π»ΠΈΡ… BPS Π΄ΠΎ 1b/s ΠΈ броя Π½Π° ΠΊΠ°Π½Π°Π»ΠΈΡ‚Π΅ Π΄ΠΎ 1 (с 32 Π±ΠΈΡ‚ΠΎΠ² нСсТат стСрСо Π°ΡƒΠ΄ΠΈΠΎΠΏΠΎΡ‚ΠΎΠΊ с 64kbs стана 80M чист .wav Ρ„Π°ΠΉΠ», Π° Ρ‚Π°ΠΊΠ° само 10): https://instaud.io/3Dcy

ЦСлият ΠΊΠΎΠ΄ (WAV.py) (ΠšΠΎΠ΄ΡŠΡ‚ ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΡƒΠ±Π»ΠΈΡ€Π°Π½ΠΈ стойности Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡ‚Π΅, Ρ‚ΠΎΠ²Π° Π΅ само наброска):

ΠΎΡ‚ struct import pack  # ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ py-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Π±Π°Π·ΠΎΠ²Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ΠΈΠ· C
ΠΎΡ‚ os import urandom  # функция для чтСния /dev/urandom, для Windows:
# ΠΎΡ‚ random import randint
# urandom = lambda sz: bytes([randint(0, 255) for _ in range(sz)])  # лямбда для Windows, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ urandom Π² Windows отсутствуСт
ΠΎΡ‚ sys import argv, exit  # Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄

Ссли len(argv) != 3:  # +1 имя скрипта (-1, Ссли ΡΠΎΠ±ΠΈΡ€Π°Π΅Ρ‚Π΅ΡΡŒ Π·Π°ΠΌΠΎΡ€Π°ΠΆΠΈΠ²Π°Ρ‚ΡŒ)
    print('ИспользованиС: python3 WAV.py [число ΠΎΠ±Ρ€Π°Π·Ρ†ΠΎΠ²] [Π²Ρ‹Ρ…ΠΎΠ΄]')
    exit(1)

numSamples = int(argv[1])
output_path = argv[2]

chunkId = b'RIFF'
Format = b'WAVE'
subchunk1ID = b'fmt '
subchunk1Size = b'x10x00x00x00'  # 0d16
audioFormat = b'x01x00'
numChannels = b'x02x00'  # достаточно 2 ΠΊΠ°Π½Π°Π»Π° (стСрСо)
sampleRate = pack('<L', 1000)  # 1000 достаточно, Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈ большС.
bitsPerSample = b'x20x00'  # 0d32
byteRate = pack('<L', 1000 * 2 * 4)  # sampleRate * numChannels * bitsPerSample / 8  (32 Π±ΠΈΡ‚Π° Π·Π²ΡƒΠΊ)
blockAlign = b'x08x00'  # numChannels * BPS / 8
subchunk2ID = b'data'
subchunk2Size = pack('<L', numSamples * 2 * 4)  # * numChannels * BPS / 8
chunkSize = pack('<L', 36 + numSamples * 2 * 4)  # 36 + subchunk2Size

data = urandom(1000 * 2 * 4 * numSamples)  # сам ΡˆΡƒΠΌ

с open(output_path, 'wb') как fh:
    fh.write(chunkId + chunkSize + Format + subchunk1ID +
            subchunk1Size + audioFormat + numChannels + 
            sampleRate + byteRate + blockAlign + bitsPerSample +
            subchunk2ID + subchunk2Size + data)  # записываСм Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² Ρ„Π°ΠΉΠ»

РСзюмС

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ ΡƒΠ·Π½Π°Π»ΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ большС ΠΎ Ρ†ΠΈΡ„Ρ€ΠΎΠ²ΠΎΠΌ Π·Π²ΡƒΠΊΠ΅ ΠΈ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Π΅Π³ΠΎ хранят. Π’ этом постС ΠΌΡ‹ Π½Π΅ использовали сТатиС (audioFormat), Π½ΠΎ Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· популярных Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² потрСбуСтся ΠΎΠΊΠΎΠ»ΠΎ 10 статСй. НадСюсь, Π²Ρ‹ ΡƒΠ·Π½Π°Π»ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π½ΠΎΠ²ΠΎΠ΅ для сСбя ΠΈ это ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π²Π°ΠΌ Π² Π±ΡƒΠ΄ΡƒΡ‰ΠΈΡ… Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°Ρ….
Бпасибо!

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΡ†ΠΈ

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Ρ„Π°ΠΉΠ»Π° WAV
WAV β€” ВикипСдия

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster