Nzira dzekumanikidza / kuchengetedza midhiya data muWAVE uye JPEG mafomati, chikamu 1

Mhoro! Mutsara wangu wekutanga wezvinyorwa uchatarisa pakudzidza mufananidzo / audio compression uye nzira dzekuchengetedza dzakadai seJPEG (mufananidzo) uye WAVE (sound), uye ichabatanidzawo mienzaniso yemapurogiramu anoshandisa mafomu aya (.jpg, .wav) mukuita. Muchikamu chino tichatarisa WAVE.

История

WAVE (Waveform Audio File Format) iri mudziyo faira fomati yekuchengetedza kurekodha kwerukova rwekuteerera. Ichi chigadziko chinowanzo shandiswa kuchengeta uncompressed pulse code modulated audio. (Yakatorwa kubva kuWikipedia)

Yakagadzirwa uye yakaburitswa muna 1991 pamwe chete neRIFF neMicrosoft uye IBM (Inotungamira IT makambani enguva iyoyo).

Chimiro chefaira

Iyo faira ine musoro chikamu, iyo data pachayo, asi isina tsoka. Musoro unorema huremu hwe44 bytes.
Musoro une zvigadziriso zvehuwandu hwemabhiti mumuenzaniso, chiyero chemuenzaniso, kudzika kwenzwi, nezvimwe. ruzivo runodiwa pakadhi rezwi. (Zvese nhamba dzetafura dzenhamba dzinofanirwa kunyorwa muChidiki-Endian kurongeka)

Block zita
Saizi yebhuroka (B)
Tsanangudzo/Chinangwa
Kukosha (kune vamwe kunogadziriswa

chunkId
4
Kutsanangura faira semudziyo wenhau
0x52494646 muBig-Endian (“RIFF”)

chunkSize
4
Saizi yefaira rese isina chunkId uye chunkSize
FILE_SIZE - 8

urongwa
4
Nyora tsananguro kubva kuRIFF
0x57415645 in Big-Endian ("WAVE")

subchunk1Id
4
Kuti iyo faira itore nzvimbo yakawanda sekuenderera mberi kwefomati
0x666d7420 muBig-Endian (“fmt”)

subchunk1Size
4
Musoro wasara (mumabhayiti)
16 nekusarudzika (kune kesi isina audio stream compression)

AudioFormat
2
Odhiyo fomati (zvinoenderana nekumanikidza nzira uye odhiyo data chimiro)
1 (yePCM, ndizvo zvatiri kufunga)

numChannels
2
Nhamba yezviteshi
1/2, tichatora 1 chiteshi (3/4/5/6/7... - chaiyo odhiyo track, semuenzaniso 4 yequad audio, nezvimwewo)

sampleRate
4
Audio sampling rate (muHertz)
Iyo yakakwirira, iyo iri nani iyo ruzha ruchave, asi iyo yakanyanya ndangariro ichadikanwa kugadzira odhiyo yehurefu hwakafanana, iyo inokurudzirwa kukosha ndeye 48000 (inogamuchirwa inonzwika mhando)

byteRate
4
Nhamba yemabhaiti pasekondi
sampleRate numChannels bitsPerSample (kuwedzera)

blockAlign
2
Nhamba yemabhaiti yemuenzaniso 1
numChannels * bitsPerSample: 8

bitsPerSample
2
Nhamba yemabhiti pamuenzaniso 1 (kudzika)
Chero nhamba inowanza ye8. Kukwira kwenhamba, zviri nani uye kurema kunzwika kunenge kuri nani; kubva pa32 bits hapana mutsauko kuvanhu.

subchunk2Id
4
Data reference mark (sezvo panogona kunge paine zvimwe zvemusoro zvinhu zvinoenderana neaudioFormat)
0x64617461 muBig-Endian("data")

subchunk2Size
4
Saizi yenzvimbo yedata
saizi yedata mu int

dhata
byteRate * nguva yekuteerera
Audio data
?

WAVE muenzaniso

Tafura yapfuura inogona kushandurirwa zviri nyore kuita chimiro muC, asi mutauro wedu wanhasi iPython. Chinhu chiri nyore chaungaita kushandisa "wave" - ​​jenareta reruzha. Kune iri basa hatidi yakakwira byteRate uye compression.
Kutanga, ngatitorei kunze mamodule anodiwa:

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

Tevere, isu tinofanirwa kugadzira ese anodiwa akasiyana kubva patafura zvichienderana nehukuru hwawo. Iwo akasiyana siyana mauri anoenderana chete nenhambaSamples (nhamba yemasamples). Kuwanda kwavo kunova ndiko kunoita kuti ruzha rwedu ruenderere mberi.

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

Chasara kuzvinyora pasi mukutevedzana kunodiwa (sezviri patafura):

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

Uye saka, vakagadzirira. Kuti tishandise script, isu tinofanirwa kuwedzera inodiwa yekuraira mitsetse nharo:
python3 WAV.py [num of samples] [output]
num of samples - kuverenga. samples
kubuda - nzira kune yakabuda faira

Heino chinongedzo kune bvunzo redhiyo faira rine ruzha, asi kuchengetedza ndangariro ndakadzikisa iyo BPS kusvika 1b/s uye ndakadzikisa huwandu hwezviteshi kuenda ku1 (ine 32-bit isina uncompressed stereo audio stream pa64kbs, zvakazoitika. 80M yepure .wav faira, uye gumi chete): https://instaud.io/3Dcy

Iyo kodhi yese (WAV.py) (Iyo kodhi ine akawanda akadhindwa maitiro akasiyana, ichi chingori sketch):

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

Mugumisiro

Saka iwe wadzidza zvishoma nezve digital ruzha uye kuti inochengetwa sei. Muchinyorwa ichi hatina kushandisa compression (audioFormat), asi kufunga imwe neimwe yakakurumbira, zvinyorwa zve 10. Ndinovimba wakadzidza chimwe chinhu chitsva iwe pachako uye izvi zvichakubatsira mune ramangwana.
Ndinokutendai!

Sources

WAV faira chimiro
WAV - Wikipedia

Source: www.habr.com

Voeg