Rêbazên ji bo berhevkirin / hilanîna daneyên medyayê di formatên WAVE û JPEG de, beş 1

Slav! Rêzeya gotarên min ên yekem dê li ser lêkolîna berhevkirina wêne/dîyo û awayên hilanînê yên wekî JPEG (wêne) û WAVE (deng) bisekine, û dê di pratîkê de mînakên bernameyên ku van formatan (.jpg, .wav) bikar tînin jî bihewîne. Di vê beşê de em ê li WAVE binêrin.

История

WAVE (Waveform Audio File Format) formatek pelê ya konteynerê ye ku ji bo tomarkirina tomarek herikîna dengî ye. Ev konteynir bi gelemperî ji bo hilanîna dengê modulkirî ya koda nebza nekompresyonî tê bikar anîn. (Ji Wîkîpediya hatiye girtin)

Ew di sala 1991-an de bi RIFF re ji hêla Microsoft û IBM (Pirketên pêşeng ên IT-ê yên wê demê) ve hate vedîtin û weşandin.

Struktura pelê

Di pelê de beşek sernivîsê heye, dane bixwe ye, lê pênûs tune. Giraniya sernivîsê bi giştî 44 bît e.
Sernav mîhengên ji bo hejmara bit di nimûneyê de, rêjeya nimûneyê, kûrahiya deng, hwd. agahiyên pêwîst ji bo karta deng. (Divê hemî nirxên tabloya hejmarî bi rêzika Piçûk-Endî bêne nivîsandin)

Navê blokê
Mezinahiya blokê (B)
Danasîn / Armanc
Nirx (ji bo hin kesan ew rast e

chunkId
4
Diyarkirina pelê wekî konteynirek medyayê
0x52494646 li Big-Endian ("RIFF")

chunkSize
4
Mezinahiya tevahiya pelê bêyî chunkId û chunkSize
FILE_SIZE - 8

çap
4
pênase Type ji RIFF
0x57415645 di Big-Endian de ("WAVE")

subchunk1Id
4
Ji ber ku pel wekî berdewamiya formatê bêtir cîh digire
0x666d7420 bi Big-Endian ("fmt")

subchunk1Size
4
Sernivîsa mayî (bi byte)
16 ji hêla xwerû (ji bo doza bêyî berhevkirina tîrêjê dengî)

audioFormat
2
Forma dengî (girêdayî rêbaza berhevkirinê û avahiya daneya dengî ye)
1 (ji bo PCM, ya ku em difikirin ev e)

numChannels
2
Hejmara kanalê
1/2, em ê 1 kanalê bavêjin (3/4/5/6/7... - şopek dengek taybetî, mînakî 4 ji bo dengê quad, hwd.)

sampleRate
4
Rêjeya nimûneya deng (bi Hertz)
Çiqas bilindtir be, dê deng baştir be, lê ji bo afirandina şopek bihîstwerî ya bi heman dirêjahiyê bêtir bîranîn hewce dike, nirxa pêşniyarkirî 48000 e (kalîteya dengê herî pejirandî)

byteRate
4
Hejmara bytes per second
sampleRate numChannels bitsPerSample (bêtir)

blockAlign
2
Hejmara bytes ji bo 1 nimûne
numChannels * bitsPerSample: 8

bitsPerSample
2
Hejmara bit li 1 nimûneyê (kûrahî)
Her jimarek ku pirjimara 8-ê ye. Jimarê çiqas bilindtir be, deng ji 32 bit wê baştir û girantir be ji bo mirovan;

subchunk2Id
4
Nîşana referansa daneyê (ji ber ku dibe ku hêmanên sernivîsê yên din li gorî Formata dengî hebin)
0x64617461 di Big-Endian de ("dane")

subchunk2Size
4
Mezinahiya qada daneyê
mezinahiya daneyan di int

jimare
byteRate * dirêjahiya deng
Daneyên deng
?

Mînaka WAVE

Tabloya berê bi hêsanî dikare li avahiyek bi C were wergerandin, lê zimanê me yê îro Python e. Ya herî hêsan ku hûn dikarin bikin ev e ku "pêlek" - hilberînerek deng bikar bînin. Ji bo vî karî em ne hewceyî byterRate û pêvekirina bilind in.
Pêşîn, bila em modulên pêwîst derxînin:

# 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)

Dûv re, pêdivî ye ku em hemî guhêrbarên pêwîst ji tabloyê li gorî mezinahiya wan biafirînin. Nirxên guhêrbar ên di wê de tenê bi numSamples (hejmara nimûneyan) ve girêdayî ye. Çiqas ji wan zêdetir bin, dê dengê me jî dirêj bibe.

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)  # сам шум

Tiştê ku dimîne ev e ku meriv wan di rêza pêwîst de binivîsîne (wek tabloyê):

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

Û vî awayî, amade. Ji bo ku skrîptê bikar bînin, divê em argumanên rêza fermanê yên pêwîst lê zêde bikin:
python3 WAV.py [num of samples] [output]
hejmara nimûneyan - hejmartin. nimûneyên
encam - riya pelê derketinê

Li vir lînka pelê dengek ceribandinê ya bi deng heye, lê ji bo hilanîna bîranînê min BPS daxist 1b/s û hejmara kanalan daxist 1 (bi 32-bit weşanek dengî ya stereo ya nekompresyonî ya bi 64kbs, derket holê ku ev bû 80M pelê .wav safî, û tenê 10): https://instaud.io/3Dcy

Tevahiya kodê (WAV.py) (Kodê gelek nirxên guhêrbar ên dubare hene, ev tenê nexşeyek e):

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)  # записываем в файл результат

Encam

Ji ber vê yekê hûn li ser dengê dîjîtal û çawa tê hilanîn hinekî bêtir fêr bûne. Di vê postê de me compression (audioFormat) bi kar neaniye, lê ji bo ku her yek ji wan ên populer bifikirin, dê 10 gotar hewce bike, ez hêvî dikim ku hûn ji bo xwe tiştek nû fêr bûne û ev ê di pêşkeftinên pêşerojê de ji we re bibe alîkar.
Spas!

Çavkaniyên

Struktura pelê WAV
WAV - Wîkîpediya

Source: www.habr.com

Ji bo malperên bi parastina DDoS, serverên VPS VDS mêvandariya pêbawer bikirin 🔥 Hostinga malperê ya pêbawer bi parastina DDoS, serverên VPS VDS bikirin | ProHoster