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):
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
Source: www.habr.com