Mekhoa ea ho hatella / ho boloka data ea media ka lifomate tsa WAVE le JPEG, karolo ea 1

Lumela! Letoto la ka la pele la lihlooho le tla lebisa tlhokomelo ho ithuteng mokhoa oa ho hatella litšoantšo / molumo le mekhoa ea ho boloka e kang JPEG (setšoantšo) le WAVE (molumo), hape e tla kenyelletsa mehlala ea mananeo a sebelisang liforomo tsena (.jpg, .wav) ts'ebetsong. Karolong ena re tla sheba LEFUTA.

История

WAVE (Waveform Audio File Format) ke sebopeho sa faele ea setshelo bakeng sa ho boloka rekoto ea molumo oa molumo. Setshelo sena hangata se sebelisetsoa ho boloka molumo o hlophisitsoeng oa pulse code modulated. (E nkiloe ho Wikipedia)

E ile ea qaptjoa 'me ea hatisoa ka 1991 hammoho le RIFF ke Microsoft le IBM (Lik'hamphani tse etellang pele tsa IT tsa nako eo).

Sebopeho sa faele

Faele e na le karolo ea hlooho, data ka boeona, empa ha e na footer. Sehlooho se boima ba li-byte tse 44 kaofela.
Sehlooho se na le litlhophiso tsa palo ea likotoana tsa sampole, sekhahla sa sampole, botebo ba molumo, jj. lintlha tse hlokahalang bakeng sa karete ea molumo. (Litekanyetso tsohle tsa litafole tsa linomoro li tlameha ho ngoloa ka tatellano ea Little-Endian)

Thibela lebitso
Saese ya block (B)
Tlhaloso/Morero
Boleng (ho ba bang bo tsitsitse

chunkId
4
Ho hlalosa faele joalo ka setshelo sa media
0x52494646 ka Big-Endian (“RIFF”)

chunkSize
4
Boholo ba faele eohle ntle le chunkId le chunkSize
FILE_SIZE - 8

thalong
4
Tlanya tlhaloso ho tsoa ho RIFF
0x57415645 ka Big-Endian (“WAVE”)

subchunk1Id
4
E le hore faele e nke sebaka se eketsehileng e le tsoelo-pele ea sebopeho
0x666d7420 ka Big-Endian (“fmt”)

subchunk1Size
4
Hlooho e setseng (ka li-byte)
16 ka ho sa feleng (bakeng sa nyeoe ntle le khatello ea molumo oa molumo)

AudioFormat
2
Sebopeho sa molumo (ho ipapisitse le mokhoa oa ho hatella le sebopeho sa data ea molumo)
1 (bakeng sa PCM, ke seo re se nahanang)

numChannels
2
Palo ea liteishene
1/2, re tla nka mocha o le mong (1/3/4/5/6... - pina e itseng ea molumo, mohlala 7 bakeng sa molumo oa quad, joalo-joalo)

sampoleRate
4
Sekhahla sa lisampole tsa molumo (ho Hertz)
Ha e le holimo, molumo o tla ba molemo, empa mohopolo o tla hlokahala ho etsa pina ea molumo ea bolelele bo lekanang, boleng bo khothalletsoang ke 48000 (boleng bo amohelehang ka ho fetisisa)

byteRate
4
Palo ea li-byte motsotsoana
sampoleRate numChannels bitsPerSample (ho feta)

blockAlign
2
Nomoro ea li-byte bakeng sa sampole e le 'ngoe
numChannels * bitsPerSample: 8

bitsPerSample
2
Nomoro ea li-bits ho 1 sampole (botebo)
Nomoro efe kapa efe e nang le palo ea 8. Ha palo e phahame, molumo o tla ba betere le ho feta, ho tloha ho li-bits tse 32 ha ho na phapang ho batho.

subchunk2Id
4
Letšoao la litšupiso tsa data (kaha ho ka ba le likarolo tse ling tsa hlooho ho latela audioFormat)
0x64617461 ho Big-Endian("data")

subchunk2Size
4
Boholo ba sebaka sa data
boholo ba data ka int

ya data
byteRate * nako ea molumo
Lintlha tsa molumo
?

LEFUBE mohlala

Tafole e fetileng e ka fetoleloa habonolo ho sebopeho sa C, empa puo ea rona ea kajeno ke Python. Ntho e bonolo ka ho fetisisa eo u ka e etsang ke ho sebelisa "wave" - ​​jenereithara ea lerata. Bakeng sa mosebetsi ona ha re hloke high byteRate le compression.
Taba ea pele, a re ke re tlise li-module tse hlokahalang:

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

Ka mor'a moo, re hloka ho theha mefuta eohle e hlokahalang ho tloha tafoleng ho ea ka boholo ba bona. Maemo a feto-fetohang ho eona a ipapisitse le numSamples (palo ea disampole). Ha li ntse li le ngata, lerata la rona le tla tsoela pele nako e telele.

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

Se setseng ke ho li ngola fatše ka tatellano e hlokahalang (joalo ka tafoleng):

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

'Me kahoo, itokiselitse. Ho sebelisa script, re hloka ho kenyelletsa mabaka a hlokahalang a mola oa taelo:
python3 WAV.py [num of samples] [output]
palo ea lisampole - palo. mehlala
output — tsela e yang faeleng ya tlhahiso

Mona ke sehokelo sa faele ea audio ea liteko e nang le lerata, empa ho boloka mohopolo ke theoletse BPS ho 1b/s mme ka theolela palo ea liteishene ho 1 (ka molumo oa audio oa stereo oa 32-bit uncompressed ho 64kbs, ho ile ha fumaneha 80M ea faele e hloekileng ea .wav, 'me ke 10 feela): https://instaud.io/3Dcy

Khoutu kaofela (WAV.py) (Khoutu e na le litekanyetso tse ngata tse fapaneng tse fapaneng, sena ke sekhechana feela):

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

Phello

Kahoo u ithutile ho eketsehileng ka molumo oa digital le kamoo o bolokoang kateng. Ka poso ena ha rea ​​ka ra sebelisa compression (audioFormat), empa ho nahana ka e 'ngoe le e' ngoe ea tse ratoang, ho tla hlokahala lihlooho tse 10. Ke tšepa hore u ithutile ntho e ncha bakeng sa hau 'me sena se tla u thusa nakong e tlang.
Спасибо!

Mohloli

WAV sebopeho sa faele
WAV - Wikipedia

Source: www.habr.com

Eketsa ka tlhaloso