Metotia mo le fa'apipi'i/teuga o fa'amatalaga fa'asalalau ile WAVE ma le JPEG, vaega 1

Talofa! O laʻu faʻasologa muamua o tusiga o le a taulaʻi i le suʻesuʻeina o ata / leo faʻapipiʻi ma auala e teu ai e pei o le JPEG (ata) ma le WAVE (leo), ma o le a aofia ai foʻi faʻataʻitaʻiga o polokalame faʻaogaina nei faʻatulagaga (.jpg, .wav) i le faʻatinoga. I lenei vaega o le a tatou tilotilo i le WAVE.

История

WAVE (Waveform Audio File Format) o se fa'aputu faila faila mo le teuina o se pu'eina o se vaitafe leo. O lenei atigipusa e masani ona fa'aoga e teu ai le leo fa'aogaina leo fa'aogaina leo. (Ave mai Wikipedia)

Na fatuina ma lolomiina i le 1991 faatasi ai ma le RIFF e Microsoft ma IBM (Leading IT company i lena taimi).

Faiga faila

O le faila o loʻo i ai se vaega ulutala, o faʻamaumauga lava ia, ae leai se vae. E 44 paita le mamafa o le ulutala.
O le ulutala o loʻo i ai faʻatulagaga mo le numera o fasi i totonu o le faʻataʻitaʻiga, fua faʻataʻitaʻiga, loloto leo, ma isi. fa'amatalaga mana'omia mo le kata leo. (E tatau ona tusia uma tau numera o laulau i le Little-Endian order)

Igoa poloka
Tele poloka (B)
Fa'amatalaga/Fa'amoemoe
Tau (mo nisi e faʻamautu

chunkId
4
Fa'amatalaina o se faila o se pusa fa'asalalau
0x52494646 i le Big-Endian (“RIFF”)

chunkSize
4
Tele ole faila atoa e aunoa ma le chunkId ma le chunkSize
FILE_SIZE - 8

lāpoʻa
4
Ituaiga fa'amatalaga mai le RIFF
0x57415645 i le Big-Endian (“WAVE”)

subchunk1Id
4
Ina ia faʻaogaina e le faila le tele o avanoa e fai ma faʻaauau o le faatulagaga
0x666d7420 i le Big-Endian (“fmt”)

subchunk1Size
4
Ulutala totoe (i paita)
16 e ala i le faaletonu (mo le mataupu e aunoa ma le faʻamalosi leo)

AudioFormat
2
Fa'asologa o leo (fa'alagolago i le auala fa'apipi'i ma le fa'asologa o fa'amaumauga leo)
1 (mo PCM, o le mea lea o loʻo matou mafaufauina)

numChannels
2
Numera o auala
1/2, o le a matou aveina le 1 alalaupapa (3/4/5/6/7... - o se alaleo faapitoa, mo se faataitaiga 4 mo quad leo, ma isi)

sampleRate
4
Fa'ata'ita'iga leo (i le Hertz)
O le maualuga, o le sili atu lea o le leo, ae o le tele o le manatuaina o le a manaʻomia e fatu ai se leo leo tutusa le umi, o le tau fautuaina o le 48000 (le sili ona taliaina le lelei)

byteRate
4
Numera o paita i le sekone
sampleRate numChannels bitsPerSample (sili atu)

polokaLign
2
Numera o paita mo le 1 fa'ata'ita'iga
numChannels * bitsPerSample: 8

bitsPerSample
2
Numera o fasi i le 1 fa'ata'ita'iga (loloto)
So'o se numera e fa'aopoopo i le 8. O le maualuga o le numera, o le lelei ma le mamafa o le leo o le ai ai; mai le 32 bits e leai se eseesega mo tagata.

subchunk2Id
4
Fa'ailoga fa'amatalaga (talu ai e iai isi fa'aulu elemene e fa'atatau i le audioFormat)
0x64617461 ile Big-Endian("faamatalaga")

subchunk2Size
4
Tele vaega o fa'amaumauga
tele o faʻamatalaga i int

faʻamatalaga
byteRate * umi leo
Fa'amatalaga leo
?

fa'ata'ita'iga GALU

O le laulau muamua e mafai ona faigofie ona faaliliuina i se fausaga i le C, ae o la tatou gagana mo aso nei o le Python. O le mea sili ona faigofie e mafai ona e faia o le faʻaaogaina lea o se "galu" - o se faʻalavelave pisa. Mo lenei galuega matou te le manaʻomia le maualuga byteRate ma le faʻamalosi.
Muamua, se'i tatou fa'aulufale mai modules mana'omia:

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

Le isi, e manaʻomia ona tatou fatuina uma suiga talafeagai mai le laulau e tusa ai ma o latou lapopoa. Ole tau fesuisuiai i totonu e faʻalagolago ile numSamples (numera o faʻataʻitaʻiga). O le tele o i latou, o le umi foi lea o lo tatou pisapisao.

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

Pau lava le mea o loʻo totoe o le tusi i lalo i le faasologa manaʻomia (pei o le laulau):

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

Ma o lea, sauni. Ina ia faʻaogaina le tusitusiga, matou te manaʻomia le faʻaopoopoina o faʻamatalaga talafeagai laina laina:
python3 WAV.py [num of samples] [output]
numera o faʻataʻitaʻiga - faitau. fa'ata'ita'iga
output - ala i le faila faila

O se sootaga lea i se faila leo faʻataʻitaʻi ma le pisapisao, ae ina ia faʻasaoina manatua na ou tuʻuina i lalo le BPS i le 1b / s ma faʻaititia le numera o laina i le 1 (faʻatasi ai ma le 32-bit uncompressed stereo audio stream i le 64kbs, na iʻu ina avea ma 80M o mama .wav faila, ma na o le 10): https://instaud.io/3Dcy

Le code atoa (WAV.py) (O le code e tele naua suiga fa'alua, ua na'o se ata tusi):

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

Le iʻuga

O lea ua e a'oa'oina sina mea itiiti e uiga i leo numera ma le auala e teu ai. I lenei pou matou te leʻi faʻaogaina le faʻamalosi (audioFormat), ae ia mafaufau i mea taʻutaʻua taʻitasi, o le a manaʻomia tala 10. Ou te faʻamoemoe na e aʻoaʻoina se mea fou mo oe lava ma o le a fesoasoani ia te oe i atinaʻe i le lumanaʻi.
Faafetai lava!

Punaoa

WAV faila fausaga
WAV - Wikipedia

puna: www.habr.com

Faaopoopo i ai se faamatalaga