Izindlela zokucindezela/ukugcina idatha yemidiya kumafomethi we-WAVE ne-JPEG, ingxenye 1

Sawubona! Uchungechunge lwami lokuqala lwezihloko luzogxila ekutadisheni ukuminyanisa kwesithombe/komsindo nezindlela zokugcina ezifana ne-JPEG (isithombe) kanye ne-WAVE (umsindo), futhi kuzohlanganisa nezibonelo zezinhlelo ezisebenzisa la mafomethi (.jpg, .wav) ekusebenzeni. Kule ngxenye sizobheka iWAVE.

История

I-WAVE (Ifomethi yefayela lomsindo we-Waveform) ifomethi yefayela lesiqukathi sokugcina okurekhodiwe kokusakazwa komsindo. Lesi sitsha ngokuvamile sisetshenziselwa ukugcina umsindo oshintshiwe wekhodi ye-pulse engacindezelwanga. (Kuthathwe ku-Wikipedia)

Yasungulwa futhi yanyatheliswa ngo-1991 kanye ne-RIFF yi-Microsoft kanye ne-IBM (izinkampani ezihola phambili ze-IT yangaleso sikhathi).

Isakhiwo sefayela

Ifayela linengxenye kanhlokweni, idatha ngokwayo, kodwa alinawo unyaweni. Unhlokweni unesisindo esingamabhayithi angu-44.
Unhlokweni uqukethe izilungiselelo zenani lamabhithi kusampula, isilinganiso sesampula, ukujula komsindo, njll. ulwazi oludingekayo ekhadini lomsindo. (Wonke amanani ethebula lezinombolo kufanele abhalwe ngokulandelana kwe-Little-Endian)

Vimba igama
Usayizi wokuvimba (B)
Incazelo/Inhloso
Inani (kwabanye lilungisiwe

isiqephuId
4
Ukuchaza ifayela njengesiqukathi semidiya
0x52494646 ngesi-Big-Endian (“RIFF”)

chunkSize
4
Usayizi wefayela lonke ngaphandle kwe-chunkId kanye ne-chunkSize
FILE_SIZE - 8

Ifomethi
4
Thayipha incazelo kusuka ku-RIFF
0x57415645 ngesi-Big-Endian (“WAVE”)

i-subchunk1Id
4
Ukuze ifayela lithathe isikhala esiningi ngokuqhubeka nefomethi
0x666d7420 ngesi-Big-Endian (“fmt”)

subchunk1Size
4
Unhlokweni osele (ngamabhayithi)
16 ngokuzenzakalelayo (ngecala ngaphandle kokucindezelwa kokusakaza komsindo)

Ifomethi yomsindo
2
Ifomethi yomsindo (kuncike endleleni yokuminyanisa nesakhiwo sedatha yomsindo)
1 (ye-PCM, okuyikhona esikucabangelayo)

numChannels
2
Inani leziteshi
1/2, sizothatha isiteshi esingu-1 (3/4/5/6/7... - ithrekhi yomsindo ethile, isibonelo 4 yomsindo we-quad, njll.)

IsampulaRate
4
Izinga lesampula lomsindo (ku-Hertz)
Uma uphakeme, umsindo uzoba ngcono, kodwa inkumbulo eyengeziwe izodingeka ukuze udale ithrekhi yomsindo yobude obufanayo, inani elinconyiwe lingu-48000 (ikhwalithi yomsindo eyamukeleka kakhulu)

byteRate
4
Inani lamabhayithi ngomzuzwana
IsampulaRate numChannels bitsPerSample (okuqhubekayo)

vimba Qondanisa
2
Inombolo yamabhayithi esampula elingu-1
numChannels * bitsPerSample: 8

bitsPerSample
2
Inombolo yamabhithi ngesampuli engu-1 (ukujula)
Noma iyiphi inombolo engu-8. Uma inombolo iphezulu, umsindo uzoba ngcono futhi ube nzima; kusukela kumabhithi angu-32 awukho umehluko kubantu.

i-subchunk2Id
4
Uphawu lwereferensi yedatha (njengoba kungase kube nezinye izici zikanhlokweni kuye ngefomethi yomsindo)
0x64617461 ngesi-Big-Endian("idatha")

subchunk2Size
4
Usayizi wendawo yedatha
usayizi wedatha ku-int

idatha
byteRate * ubude bomsindo
Idatha yomsindo
?

WAVE isibonelo

Ithebula langaphambili lingahunyushwa kalula libe yisakhiwo ngo-C, kodwa ulimi lwethu lwanamuhla yiPython. Into elula ongayenza ukusebenzisa “igagasi” - ijeneretha yomsindo. Kulo msebenzi asidingi i-byteRate ephezulu nokucindezelwa.
Okokuqala, ake singenise amamojula adingekayo:

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

Okulandelayo, sidinga ukudala zonke eziguquguqukayo ezidingekayo kusuka etafuleni ngokusho kosayizi bazo. Amanani aguquguqukayo kuyo ancike kuphela kumaSamples (inani lamasampula). Uma ziba maningi, umsindo wethu uzoqhubeka isikhathi eside.

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

Okusele wukubhala phansi ngokulandelana okudingekayo (njengakuthebula):

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

Futhi ngakho, ngomumo. Ukuze sisebenzise umbhalo, sidinga ukungeza izimpikiswano zomugqa womyalo ezidingekayo:
python3 WAV.py [num of samples] [output]
inani lamasampuli - ukubala. amasampula
okukhiphayo — indlela eya efayeleni lokuphumayo

Nasi isixhumanisi sefayela lomsindo lokuhlola elinomsindo, kodwa ukuze ngilondoloze inkumbulo ngehlise i-BPS yaba ngu-1b/s futhi ngehlisa inani lamashaneli laya ku-1 (ngokusakazwa komsindo we-stereo okungacindezelwanga okungu-32-bit ku-64kbs, kuvele ukuthi 80M wefayela elimsulwa le-.wav, futhi elingu-10 kuphela): https://instaud.io/3Dcy

Ikhodi yonke (WAV.py) (Ikhodi inamanani amaningi aguqukayo ayimpinda, lokhu umdwebo nje):

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

Umphumela

Ngakho-ke ufunde okwengeziwe mayelana nomsindo wedijithali nokuthi ugcinwa kanjani. Kulokhu okuthunyelwe asizange sisebenzise ukucindezela (i-audioFormat), kodwa ukucabangela ngayinye ethandwayo, kuzodingeka izihloko ezingu-10. Ngithemba ukuthi ufunde okuthile okusha kuwe futhi lokhu kuzokusiza ekuthuthukisweni okuzayo.
Siyabonga!

Imithombo

Isakhiwo sefayela le-WAV
WAV - Wikipedia

Source: www.habr.com

Engeza amazwana