ΠΠ΄ΡΠ°Π²ΡΡΠ²ΡΠΉΡΠ΅! ΠΠΎΡ ΠΏΠ΅ΡΠ²Π°Ρ ΡΠ΅ΡΠΈΡ ΡΡΠ°ΡΠ΅ΠΉ Π±ΡΠ΄Π΅Ρ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½Π° Π½Π° ΠΈΠ·ΡΡΠ΅Π½ΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΡΠΆΠ°ΡΠΈΡ ΠΈ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ/Π·Π²ΡΠΊΠ°, ΡΠ°ΠΊΠΈΡ ΠΊΠ°ΠΊ 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
Π§ΡΠΎΠ±Ρ ΡΠ°ΠΉΠ» ΠΏΠΎΠ±ΠΎΠ»ΡΡΠ΅ ΠΌΠ΅ΡΡΠ° Π·Π°Π½ΠΈΠΌΠ°Π» ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ format’Π°
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 bit sound)
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):
ΠΠ΅ΡΡ ΠΊΠΎΠ΄ ΡΠ΅Π»ΠΈΠΊΠΎΠΌ (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 = 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 bit sound)
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) # Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ Π² ΡΠ°ΠΉΠ» ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ
ΠΡΠΎΠ³
ΠΠΎΡ Π²Ρ ΠΈ ΡΠ·Π½Π°Π»ΠΈ ΡΡΡΡ ΠΏΠΎΠ±ΠΎΠ»ΡΡΠ΅ ΠΎ ΡΠΈΡΡΠΎΠ²ΠΎΠΌ Π·Π²ΡΠΊΠ΅ ΠΈ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊ Π΅Π³ΠΎ Ρ
ΡΠ°Π½ΡΡ. Π ΡΡΠΎΠΌ ΠΏΠΎΡΡΠ΅ ΠΌΡ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ ΡΠΆΠ°ΡΠΈΡ (audioFormat), Π½ΠΎ Π΄Π»Ρ ΡΠ°ΡΡΠΌΠΎΡΡΠ° ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΡ
ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΡΠ°ΡΠ΅ΠΉ 10. ΠΠ°Π΄Π΅ΡΡΡ Π²Ρ ΡΠ·Π½Π°Π»ΠΈ ΡΡΠΎ-ΡΠΎ Π½ΠΎΠ²ΠΎΠ΅ Π΄Π»Ρ ΡΠ΅Π±Ρ ΠΈ ΡΡΠΎ Π²Π°ΠΌ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ Π² Π±ΡΠ΄ΡΡΠΈΡ
ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°Ρ
.
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ!
ΠΡΡΠΎΡΠ½ΠΈΠΊΠΈ
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com