Nyob zoo! Kuv cov ntawv xov xwm thawj zaug yuav tsom mus rau cov txheej txheem kev nias thiab khaws cov duab/suab, xws li JPEG (cov duab) thiab WAVE (suab), thiab tseem yuav suav nrog cov piv txwv ntawm cov kev pab cuam uas siv cov hom ntawv no (.jpg, .wav) hauv kev xyaum. Hauv ntu no, peb yuav tsom mus rau WAVE.
История
WAVE (Waveform Audio File Format) yog ib hom ntawv rau khaws cov ntaub ntawv suab. Lub thawv no feem ntau yog siv los khaws cov suab uas tsis tau nias thiab hloov kho los ntawm pulse-code. (Tau los ntawm Wikipedia)
Nws tau tsim thiab luam tawm xyoo 1991 ua ke nrog RIFF los ntawm Microsoft thiab IBM (cov tuam txhab IT ua thawj coj ntawm lub sijhawm ntawd).
Cov ntaub ntawv qauv
Cov ntaub ntawv muaj ib lub header thiab cov ntaub ntawv nws tus kheej, tab sis tsis muaj footer. Lub header hnyav tag nrho 44 bytes.
Cov header muaj cov chaw teeb tsa rau tus lej ntawm cov bits ib qho qauv, zaus qauv, qhov tob ntawm lub suab, thiab lwm yam ntaub ntawv uas daim npav suab xav tau. (Txhua tus lej hauv lub rooj yuav tsum tau sau ua qhov kev txiav txim Little-Endian.)
Lub npe thaiv
Qhov loj ntawm lub thaiv (B)
Kev Piav Qhia/Lub Hom Phiaj
Tus nqi (rau qee tus nws yog qhov ruaj khov)
chunkId
4
Txhais cov ntaub ntawv ua lub thawv xov xwm
0x52494646 hauv Big-Endian (“RIFF”)
qhov loj me
4
Qhov loj ntawm tag nrho cov ntaub ntawv tsis muaj chunkId thiab chunkSize
FILE_SIZE — 8
hom
4
Kev txhais hom los ntawm RIFF
0x57415645 hauv Big-Endian (“WAVE”)
subchunk1Id
4
Yuav kom cov ntaub ntawv siv chaw ntau dua, txuas ntxiv hom ntawv
0x666d7420 hauv Big-Endian (“fmt”)
me me1Qhov loj
4
Cov header seem (hauv bytes)
16 los ntawm lub neej ntawd (rau cov ntaub ntawv tsis muaj kev nias suab)
hom ntawv suab
2
Hom ntawv suab (nyob ntawm txoj kev nias thiab cov qauv ntawm cov ntaub ntawv suab)
1 (rau PCM, uas yog qhov peb tab tom saib)
numChannels
2
Tus naj npawb ntawm cov channel
1/2, peb yuav siv 1 channel (3/4/5/6/7... - ib txoj kab suab tshwj xeeb, piv txwv li 4 rau lub suab plaub fab, thiab lwm yam)
sampleRate
4
Zaus ntawm kev kuaj suab (hauv Hertz)
Tus nqi siab dua, qhov zoo ntawm lub suab yuav zoo dua, tab sis yuav tsum muaj lub cim xeeb ntau dua los tsim ib txoj kab suab uas ntev ib yam. Tus nqi pom zoo yog 48000 (qhov zoo ntawm lub suab uas txais tau zoo tshaj plaws).
byteRate
4
Tus naj npawb ntawm cov bytes ib 1 vib nas this
sampleRate numChannels bitsPerSample (ntxiv)
thaivAlign
2
Tus naj npawb ntawm cov bytes rau 1 qauv
numChannels * bitsPerSample: 8
bitsPerSample
2
Tus naj npawb ntawm cov bits ib qho qauv (qhov tob)
Txhua tus lej sib npaug ntawm 8. Tus lej siab dua, lub suab yuav zoo dua thiab hnyav dua; 32-ntsis tsis muaj qhov sib txawv rau tib neeg.
subchunk2Id
4
Cov ntaub ntawv pib suav cim (vim tias tej zaum yuav muaj lwm cov ntsiab lus header nyob ntawm hom ntawv suab)
0x64617461 hauv Big-Endian ("cov ntaub ntawv")
me me2Qhov loj
4
Qhov loj ntawm thaj chaw ntaub ntawv
qhov loj ntawm cov ntaub ntawv hauv int
cov ntaub ntawv
byteRate * lub sijhawm suab
Cov ntaub ntawv suab
?
Piv txwv nrog WAVE
Lub rooj dhau los tuaj yeem hloov pauv mus rau hauv C qauv yooj yim, tab sis peb cov lus rau hnub no yog Python. Qhov yooj yim tshaj plaws uas peb tuaj yeem tsim siv "wave" yog lub tshuab tsim suab nrov. Rau txoj haujlwm no, peb tsis xav tau tus nqi byte siab lossis kev nias siab.
Ua ntej, cia peb import cov modules tsim nyog:
# 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)Tom ntej no, peb yuav tsum tsim tag nrho cov hloov pauv tsim nyog los ntawm lub rooj raws li lawv qhov loj me. Cov nqi tsis ruaj khov hauv nws tsuas yog nyob ntawm numSamples (tus lej ntawm cov qauv). Cov qauv ntau dua muaj, peb lub suab nrov yuav kav ntev dua.
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) # сам шумTxhua yam uas tseem tshuav yog sau lawv raws li qhov kev txiav txim xav tau (zoo li hauv lub rooj):
with open(output_path, 'wb') as fh:
fh.write(chunkId + chunkSize + Format + subchunk1ID +
subchunk1Size + audioFormat + numChannels +
sampleRate + byteRate + blockAlign + bitsPerSample +
subchunk2ID + subchunk2Size + data) # записываемYog li ntawd, peb ua tiav lawm. Yuav kom siv tau tsab ntawv, peb yuav tsum ntxiv cov lus txib tsim nyog:
python3 WAV.py [num of samples] [output]
tus naj npawb ntawm cov qauv - tus naj npawb ntawm cov qauv
tso zis - txoj kev mus rau cov ntaub ntawv tso zis
Nov yog qhov txuas mus rau cov ntaub ntawv suab sim uas muaj suab nrov, tab sis kom txuag tau lub cim xeeb kuv txo BPS rau 1b/s thiab tus lej ntawm cov channel rau 1 (nrog 32-bit uncompressed stereo audio stream ntawm 64kbs, cov ntaub ntawv .wav huv si yog 80M, thaum qhov no tsuas muaj 10):
Tag nrho cov code (WAV.py) (Cov code muaj ntau qhov rov ua dua ntawm cov nqi hloov pauv, qhov no tsuas yog ib daim duab kos xwb):
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) # записываем в файл результатQhov no
Yog li, koj tau kawm ntxiv me ntsis txog lub suab digital thiab nws khaws cia li cas. Peb tsis tau siv kev nias (audioFormat) hauv tsab ntawv no, tab sis kev npog txhua hom ntawv nrov yuav xav tau 10 tsab xov xwm. Kuv vam tias koj tau kawm qee yam tshiab thiab nws yuav pab koj rau yav tom ntej.
Ua tsaug!
Cov chaw
Tau qhov twg los: www.hab.com
