Hanyoyi don matsawa/ajiye bayanan kafofin watsa labarai a cikin tsarin WAVE da JPEG, sashi na 1

Sannu! Na farko jerin labaran za su mayar da hankali kan nazarin hoto / matsawar sauti da hanyoyin ajiya irin su JPEG (hoto) da WAVE (sauti), kuma za su hada da misalan shirye-shiryen da ke amfani da waɗannan nau'o'in (.jpg, .wav) a aikace. A wannan bangare za mu kalli WAVE.

История

WAVE (Waveform Audio File Format) shine tsarin fayil ɗin akwati don adana rikodin rafi mai jiwuwa. Ana amfani da wannan akwati galibi don adana lambar bugun bugun da ba a matsa ba. (An ɗauko daga Wikipedia)

An ƙirƙira shi kuma aka buga shi a cikin 1991 tare da RIFF ta Microsoft da IBM (Jagorancin kamfanonin IT na wancan lokacin).

Tsarin fayil

Fayil ɗin yana da ɓangaren kai, bayanan da kanta, amma babu ƙafa. Kan kai yana auna jimlar 44 bytes.
Kan kai ya ƙunshi saituna don adadin rago a cikin samfurin, ƙimar samfurin, zurfin sauti, da sauransu. bayanin da ake buƙata don katin sauti. (Dukkan ƙimar tebur na lamba dole ne a rubuta su a cikin tsari na Little-Endian)

Toshe suna
Girman toshe (B)
Bayani/Manufa
Ƙimar (ga wasu an daidaita shi

zuciId
4
Ƙayyadaddun fayil azaman kwandon mai jarida
0x52494646 a cikin Big-Endian ("RIFF")

chunkSize
4
Girman dukan fayil ɗin ba tare da chunkId da chunkSize ba
FILE_SIZE - 8

format
4
Buga ma'anar daga RIFF
0x57415645 a cikin Big-Endian ("WAVE")

subcunk1Id
4
Domin fayil ɗin ya ɗauki ƙarin sarari ta ci gaba da tsarin
0x666d7420 a cikin Big-Endian ("fmt")

subchunk1 Girman
4
Ragowar kai (a cikin bytes)
16 ta tsohuwa (don yanayin ba tare da matsawa rafi mai jiwuwa ba)

Tsarin sauti
2
Tsarin sauti (ya dogara da hanyar matsawa da tsarin bayanan sauti)
1 (don PCM, wanda shine abin da muke la'akari)

numChannel
2
Yawan tashoshi
1/2, za mu dauki tashar 1 (3/4/5/6/7... - takamaiman waƙar sauti, misali 4 don sauti na quad, da sauransu)

samfurin ƙima
4
Adadin Samfuran Sauti (a cikin Hertz)
Mafi girma, mafi kyawun sautin zai kasance, amma ana buƙatar ƙarin ƙwaƙwalwar ajiya don ƙirƙirar waƙar sauti iri ɗaya, ƙimar da aka ba da shawarar ita ce 48000 (mafi kyawun ingancin sauti mai karɓa)

byteRate
4
Adadin bytes a sakan daya
samfurin ƙima numChannel bitsPerSample (ƙari)

blockAlign
2
Yawan bytes don samfurin 1
numChannels * bitsPerSample: 8

bitsPerSample
2
Yawan ragowa a cikin samfurin 1 (zurfin)
Duk lambar da ke da yawa na 8. Mafi girman lambar, mafi kyau da nauyi sauti zai kasance; daga 32 bits babu bambanci ga mutane.

subcunk2Id
4
Alamar magana ta bayanai (tunda ana iya samun wasu abubuwan kan kai dangane da tsarin sauti)
0x64617461 a cikin Big-Endian("bayanai")

subchunk2 Girman
4
Girman yankin bayanai
girman bayanai a cikin int

data
byteRate * tsawon lokacin sauti
Audio data
?

Misalin WAVE

Za a iya fassara teburin da ya gabata cikin sauƙi zuwa tsari a cikin C, amma harshen mu na yau shine Python. Abu mafi sauƙi da za ku iya yi shine amfani da "wave" - ​​janareta amo. Don wannan aikin ba ma buƙatar babban byteRate da matsawa.
Da farko, bari mu shigo da abubuwan da ake buƙata:

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

Na gaba, muna buƙatar ƙirƙirar duk masu canji masu mahimmanci daga tebur bisa ga girman su. Ma'auni masu canzawa a cikin sa sun dogara ne kawai akan numSamples (yawan samfurori). Da yawan su, yawan surutunmu zai dade.

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

Abin da ya rage shi ne a rubuta su a cikin jerin da ake buƙata (kamar yadda yake cikin tebur):

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

Don haka, a shirye. Don amfani da rubutun, muna buƙatar ƙara mahimman maganganun layin umarni:
python3 WAV.py [num of samples] [output]
adadin samfurori - ƙidaya. samfurori
fitarwa - hanyar zuwa fayil ɗin fitarwa

Anan akwai hanyar haɗi zuwa fayil ɗin mai jiwuwa na gwaji tare da amo, amma don adana ƙwaƙwalwar ajiya na saukar da BPS zuwa 1b/s kuma na saukar da adadin tashoshi zuwa 1 (tare da rafi na sitiriyo na 32-bit mara nauyi a 64kbs, ya juya ya zama. 80M na babban fayil .wav, kuma 10 kawai): https://instaud.io/3Dcy

Duk lambar (WAV.py) (Lambar tana da ƙima mai yawa da yawa, wannan zane ne kawai):

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

Sakamakon

Don haka kun ƙara koyo game da sautin dijital da yadda ake adana shi. A cikin wannan sakon ba mu yi amfani da matsawa ba (audioFormat), amma don la'akari da kowanne daga cikin shahararrun, za a buƙaci labarai 10. Ina fatan kun koyi sabon abu don kanku kuma wannan zai taimake ku a cikin ci gaba na gaba.
Na gode!

Sources

WAV tsarin fayil
WAV - Wikipedia

source: www.habr.com

Add a comment