Methodi comprimendi / accommodandi media data in FLUCTUS et JPEG formats, pars 1

Salve! Prima series articulorum mea in studio imaginis/audii compressionis et methodorum repositarum qualitatum JPEG (image) et FLUCTUS (sonus) intendit, et exempla programmatum etiam in praxi utentium comprehendet. In hac parte vide in Montibus.

historia

FLUCTUS (Waveform Audio Tabellae) est continens formas fasciculi ad reponendas monumenti amnis audio. Haec continens typice usus est in codice venae incompresso copiae modulatae audio. (Ex Wikipedia)

Inventa et edita anno 1991 una cum RIFF per Microsoft et IBM (IT turmas ducentes illius temporis).

File structure

Tabella caput partem habet, notitia ipsa, sed nullum footer. Capitis summam pondo 44 bytes.
Caput continet occasus pro numero frumentorum in sample, rate sample, soni profunditate, etc. notitia opus ad sonum card. (Omnes tabellae numerorum valores in ordine Parva-Endian scribi debent)

Nomen obstructionum
Obstructionum magnitudine (B)
Descriptio / Propositum
Valorem (pro quibusdam certum est

chunkId
4
Definiens lima in media continens
0x52494646 in Big-Endian ("RIFF")

chunkSize
4
Magnitudo totius fasciculi sine chunkId et chunkSize
FILE_SIZE - 8

forma
4
Type definition from RIFF
0x57415645 in Big-Endian.

subchunk1Id
4
Ut tabella maius spatium continuum format
0x666d7420 in Big-Endian ("fmt")

subchunk1Size
4
Reliquis header (per bytes)
16 per defaltam (nam causa sine compressione amnis audio)

audioFormat
2
Audio format (dependet modo compressionis et structurae datae audio)
1 (pro PCM, quod est quod agimus);

numChannels
2
Number of channels
1/2, capiemus 1 alveum (3/4/5/6/7... - soni soni specifici, e.g. 4 pro quad- sono, etc.)

sampleRate
4
Audio sampling rate (in Hertz)
Quanto altior, sonus melior erit, sed memoria plus requiretur ut eiusdem longitudinis tramitem audio, utilitas commendatur (48000 sonus acceptissimus)

byteRate
4
Numerus bytes per alterum
sampleRate numChannels bitsPerSample (ultra)

blockAlign
2
Numerus bytes pro I sample
numChannels * bitsPerSample: 8

bitsPerSample
2
Numerus bits per I specimen (profundum)
Quilibet numerus qui multiplex est 8. Quo numero, quo melior, graviorque auditur, Ex 32 frenis nulla differentia est hominibus.

subchunk2Id
4
Data relatio notae (quia alia elementa capitis elementa pendere possunt ab audioFormat)
0x64617461 in Big-Endian("data")

subchunk2Size
4
Data area magnitudine
magnitudinem data in int

Data
byteRate * audio durationem
Audio data
?

FLUCTUS exemplum

Prior tabula facile transferri potest in structuram in C, sed lingua nostra hodie Python est. Facillime rem facere potes uti "fluctus" - sonus generantis. Ad hoc opus non opus est magno byteRate et compressione.
Primum, moduli necessarii importemus:

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

Deinde, necesse est ut omnes variabiles e mensa necessarias secundum mensuras habeant. Valores variabiles in ea tantum a numSamplis pendent. Quo plures sunt, eo diutius sonus noster erit.

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

Reliquum est ut ea ordine scribantur (ut in tabula);

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

Itaque parati. Scriptum utamur, necesse est ut rationes rectae imperandi necessarias addamus;
python3 WAV.py [num of samples] [output]
nnm exempla — numerare. exempla
output - iter ad output lima

Hic nexus cum strepitu documenti tabellae audiendi est, sed ad memoriam conservandam submisi BPS ad 1b/s et numerum canalium ad 1 submisi (cum a 32-bit incompresso stereo audio amnis in 64kbs, evenit ut 80M fasciculi puri .wav, et solum 10). https://instaud.io/3Dcy

Totum codicem (WAV.py) (codex multum valorum variabilium duplicatorum habet, hoc modo adumbrationem);

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

exitum

Sic paulo plus de sono digitale didicisti et quomodo repositum est. In hoc poste non utebamus pressionem (audioFormat), sed ut singulas populares consideres, 10 articuli requirentur: spero te aliquid novi pro te didicisse et hoc te in progressionibus futuris adiuvabit.
Tibi gratias ago?

fontibus

WAV file structure
WAV - Wikipedia

Source: www.habr.com

Add a comment