Nā ʻano no ka hoʻopaʻa ʻana a mālama ʻana i ka ʻikepili media ma WAVE a me JPEG formats, ʻāpana 1

Aloha! ʻO kaʻu moʻo mua o nā ʻatikala e kālele ana i ke aʻo ʻana i ka hoʻopaʻa ʻana i ke kiʻi/leo a me ke ʻano o ka mālama ʻana e like me JPEG (kiʻi) a me WAVE (kani), a e komo pū kekahi i nā laʻana o nā papahana e hoʻohana ana i kēia mau ʻano (.jpg, .wav) i ka hana. Ma kēia ʻāpana e nānā mākou iā WAVE.

История

ʻO WAVE (Waveform Audio File Format) he ʻano waihona waihona no ka mālama ʻana i ka hoʻopaʻa ʻana o kahi kahawai leo. Hoʻohana maʻamau ʻia kēia pahu no ka mālama ʻana i nā leo i hoʻololi ʻole ʻia ka pulse code modulated. (Lawe ʻia mai Wikipedia)

Ua hana ʻia a paʻi ʻia i ka makahiki 1991 me RIFF e Microsoft a me IBM (Alakaʻi ʻoihana IT o ia manawa).

Hoʻolālā waihona

He hapa poʻomanaʻo ka waihona, ʻo ka ʻikepili ponoʻī, akā ʻaʻohe wāwae. He 44 paona ka nui o ke poo.
Aia i ke poʻomanaʻo nā hoʻonohonoho no ka helu o nā bits i ka laʻana, ka laʻana, ka hohonu o ke kani, a pēlā aku. ʻike pono no ke kāleka kani. (Pono e kākau ʻia nā waiwai papa helu helu ma ka ʻaoʻao Little-Endian)

inoa poloka
Nui poloka (B)
Ka wehewehe/kumu
ʻO ka waiwai (no kekahi ua paʻa

chunkId
4
Ka wehewehe ʻana i kahi faila ma ke ʻano he ipu media
0x52494646 ma Big-Endian (“RIFF”)

chunkSize
4
Ka nui o ka faila holoʻokoʻa me ka chunkId a me ka chunkSize
FILE_SIZE - 8

waihona
4
ʻAno wehewehe mai RIFF
0x57415645 ma Big-Endian (“WAVE”)

subchunk1Id
4
No laila e hoʻonui i ka lewa i ka faila ma ke ʻano he hoʻomau o ke ʻano
0x666d7420 ma Big-Endian (“fmt”)

subchunk1Size
4
Ke poʻomanaʻo i koe (ma nā paita)
16 ma ka paʻamau (no ka hihia me ka ʻole o ka hoʻopaʻa ʻana i ke kahawai leo)

AudioFormat
2
Hōʻano leo (e pili ana i ke ʻano hoʻoemi a me ke ʻano ʻikepili leo)
1 (no PCM, ʻo ia kā mākou e noʻonoʻo nei)

numChannels
2
Ka helu o nā kahawai
1/2, e lawe mākou i 1 channel (3/4/5/6/7... - kahi mele leo kūikawā, no ka laʻana 4 no ke kani quad, etc.)

sampleRate
4
Lapaʻau laʻana leo (ma Hertz)
ʻO ke kiʻekiʻe, ʻoi aku ka maikaʻi o ke kani, akā ʻoi aku ka nui o ka hoʻomanaʻo e hana i kahi mele leo o ka lōʻihi like, ʻo ka waiwai i ʻōlelo ʻia ʻo 48000 (ʻo ke ʻano leo maikaʻi loa)

byteRate
4
Ka helu o nā paita i kekona
sampleRate numChannels bitsPerSample (ʻoi aku)

blockAlign
2
Ka helu o nā paita no 1 laʻana
numChannels * bitsPerSample: 8

bitsPerSample
2
Ka helu o nā ʻāpana no ka laʻana 1 (hohonu)
ʻO nā helu he nui o 8. ʻO ke kiʻekiʻe o ka helu, ʻoi aku ka maikaʻi a me ke kaumaha o ka leo, mai ka 32 bits ʻaʻohe ʻokoʻa no ke kanaka.

subchunk2Id
4
Hōʻailona hōʻike ʻikepili (no ka mea aia kekahi mau mea poʻomanaʻo e pili ana i ka AudioFormat)
0x64617461 ma Big-Endian("ʻikepili")

subchunk2Size
4
Nui ʻāpana ʻikepili
ka nui o ka ʻikepili ma int

ʻikepili
byteRate * lōʻihi leo
ʻIkepili leo
?

laʻana WAVE

Hiki ke unuhi maʻalahi ka papa mua i loko o kahi hale ma C, akā ʻo kā mākou ʻōlelo no kēia lā ʻo Python. ʻO ka mea maʻalahi hiki iā ʻoe ke hana, ʻo ia ka hoʻohana ʻana i kahi "nalu" - kahi mea hana leo. No kēia hana, ʻaʻole pono mākou i ka byteRate kiʻekiʻe a me ke kaomi.
ʻO ka mea mua, e hoʻokomo i nā modules pono:

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

A laila, pono mākou e hana i nā ʻano like ʻole a pau mai ka papaʻaina e like me ko lākou nui. ʻO nā waiwai hoʻololi i loko e hilinaʻi wale ʻia ma numSamples (helu o nā laʻana). ʻO ka nui o lākou, ʻoi aku ka lōʻihi o kā mākou walaʻau.

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

ʻO nā mea a pau i koe, e kākau iā lākou i lalo i ke kaʻina i makemake ʻia (e like me ka papa):

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

A no laila, mākaukau. No ka hoʻohana ʻana i ka palapala, pono mākou e hoʻohui i nā manaʻo laina kauoha pono:
python3 WAV.py [num of samples] [output]
helu o nā laʻana - helu. nā laʻana
puka - ala i ka waihona puka

Eia kahi loulou i kahi faila leo hoʻāʻo me ka walaʻau, akā no ka mālama ʻana i ka hoʻomanaʻo, ua hoʻohaʻahaʻa wau i ka BPS i 1b/s a hoʻohaʻahaʻa i ka helu o nā kahawai i 1 (me kahi kahawai leo stereo 32-bit uncompressed ma 64kbs, ua lilo ia i mea. 80M o ka waihona .wav maʻemaʻe, a he 10 wale nō): https://instaud.io/3Dcy

ʻO ke code holoʻokoʻa (WAV.py) (ʻO ka code he nui nā ʻano helu helu ʻelua, he kiʻi wale nō kēia):

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

ʻO ka hopena

No laila ua aʻo hou ʻoe e pili ana i ke kani kikohoʻe a pehea e mālama ʻia ai. Ma kēia pou ʻaʻole mākou i hoʻohana i ka compression (audioFormat), akā no ka noʻonoʻo ʻana i kēlā me kēia o nā mea kaulana, e koi ʻia nā ʻatikala 10. Manaʻo wau ua aʻo ʻoe i kahi mea hou no ʻoe iho a e kōkua kēia iā ʻoe i nā hanana e hiki mai ana.
Alakaʻi!

Pūnaewele

WAV waihona waihona
WAV - Wikipedia

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka