Njira zophatikizira / kusunga zidziwitso zama media mu WAVE ndi JPEG mawonekedwe, gawo 1

Moni! Zolemba zanga zoyamba za nkhani zidzayang'ana pa kuphunzira zojambula zazithunzi / zomvetsera ndi njira zosungirako monga JPEG (chithunzi) ndi WAVE (phokoso), komanso zidzaphatikizanso zitsanzo za mapulogalamu omwe amagwiritsa ntchito mawonekedwewa (.jpg, .wav) pochita. Mu gawo ili tiwona WAVE.

История

WAVE (Waveform Audio File Format) ndi mtundu wa fayilo ya chidebe chosungira chojambulira chamtundu wamawu. Chidebechi nthawi zambiri chimagwiritsidwa ntchito kusungira mawu osakanizidwa ndi ma pulse code modulated. (Kuchokera ku Wikipedia)

Idapangidwa ndikusindikizidwa mu 1991 pamodzi ndi RIFF ndi Microsoft ndi IBM (makampani Otsogola a IT anthawi imeneyo).

Mapangidwe a fayilo

Fayiloyo ili ndi gawo lamutu, deta yokha, koma palibe chapansi. Mutuwo umalemera ma byte 44 okwana.
Mutu uli ndi zoikamo za kuchuluka kwa ma bits mu sampuli, mlingo wa zitsanzo, kuya kwa mawu, ndi zina zotero. zofunikira pa khadi lamawu. (Ziwerengero zonse zamatebulo ziyenera kulembedwa mu dongosolo la Little-Endian)

Dzina la block
Kukula kwa block (B)
Kufotokozera/Cholinga
Mtengo (kwa ena umakhazikika

chunkId
4
Kutanthauzira fayilo ngati chotengera cha media
0x52494646 mu Big-Endian ("RIFF")

chunkSize
4
Kukula kwa fayilo yonse popanda chunkId ndi chunkSize
FILE_SIZE - 8

mtundu
4
Lembani tanthauzo kuchokera ku RIFF
0x57415645 mu Big-Endian ("WAVE")

subchunk1Id
4
Kotero kuti fayilo imatenga malo ochulukirapo monga kupitiriza kwa mawonekedwe
0x666d7420 mu Big-Endian (“fmt”)

subchunk1Size
4
Mutu wotsala (mu ma byte)
16 mwachisawawa (kwa mlandu wopanda kukakamiza kwa audio)

AudioFormat
2
Mawonekedwe amawu (amatengera njira yophatikizira komanso mawonekedwe amtundu wamawu)
1 (ya PCM, zomwe tikuganiza)

numChannels
2
Chiwerengero cha njira
1/2, titenga 1 njira (3/4/5/6/7... - nyimbo yeniyeni, mwachitsanzo 4 ya quad sound, etc.)

ChitsanzoRate
4
Mtengo wa zitsanzo za audio (mu Hertz)
Pamwamba, phokoso lidzamveka bwino, koma kukumbukira kwambiri kudzafunika kuti mupange nyimbo yamtundu wofanana, mtengo wovomerezeka ndi 48000 (mtundu wovomerezeka kwambiri)

byteRate
4
Chiwerengero cha ma byte pa sekondi iliyonse
ChitsanzoRate numChannels bitsPerSample (kupitilira)

blockAlign
2
Chiwerengero cha ma byte a chitsanzo chimodzi
numChannels * bitsPerSample: 8

bitsPerSample
2
Chiwerengero cha ma bits pa chitsanzo chimodzi (kuya)
Nambala iliyonse yomwe ili yochulukitsa 8. Nambalayo ikakwera, nyimboyo imakhala yabwino komanso yolemera kwambiri; kuchokera ku 32 bits palibe kusiyana kwa anthu.

subchunk2Id
4
Chizindikiro cha data (popeza pangakhale zinthu zina zamutu kutengera audioFormat)
0x64617461 mu Big-Endian("data")

subchunk2Size
4
Kukula kwa data
kukula kwa data mu int

deta
byteRate * nthawi yomvera
Zambiri zamawu
?

WAVE chitsanzo

Gome lapitalo likhoza kumasuliridwa mosavuta kukhala C, koma chinenero chathu lero ndi Python. Chosavuta chomwe mungachite ndikugwiritsa ntchito "wave" - ​​jenereta yaphokoso. Pantchitoyi sitifuna mkulu byteRate ndi compression.
Choyamba, tiyeni tilowetse ma module ofunikira:

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

Kenako, tiyenera kupanga zosintha zonse zofunika kuchokera patebulo molingana ndi kukula kwake. Makhalidwe osinthika momwemo amangodalira numSamples (chiwerengero cha zitsanzo). Zikakhala zambiri, phokoso lathu lidzapitirirabe.

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

Zomwe zatsala ndikuzilemba mwatsatanetsatane (monga patebulo):

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

Ndipo kotero, okonzeka. Kuti tigwiritse ntchito script, tifunika kuwonjezera mfundo zofunika za mzere wamalamulo:
python3 WAV.py [num of samples] [output]
chiwerengero cha zitsanzo - kuwerengera. zitsanzo
output - njira yopita ku fayilo yotulutsa

Nayi ulalo wa fayilo yamawu yoyeserera yokhala ndi phokoso, koma kuti ndisunge kukumbukira ndidatsitsa BPS mpaka 1b/s ndikutsitsa kuchuluka kwa mayendedwe mpaka 1 (ndi 32-bit uncompressed stereo audio audio pa 64kbs, zidakhalapo. 80M ya fayilo yoyera ya .wav, ndi 10 yokha): https://instaud.io/3Dcy

Khodi yonse (WAV.py) (Khodiyo ili ndi zosinthika zambiri zosinthika, ichi ndi chojambula):

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

Zotsatira

Kotero mwaphunzira pang'ono za mawu a digito ndi momwe amasungidwira. Mu positi iyi sitinagwiritse ntchito psinjika (audioFormat), koma kuti tiganizire zodziwika bwino, nkhani 10 zidzafunika.
Спасибо!

Zotsatira

Mapangidwe a fayilo ya WAV
WAV - Wikipedia

Source: www.habr.com

Kuwonjezera ndemanga