په WAVE او JPEG فارمیټونو کې د میډیا ډیټا کمپریس کولو / ذخیره کولو میتودونه ، برخه 1

سلام! زما د مقالو لومړۍ لړۍ به د عکس/آډیو کمپریشن او ذخیره کولو میتودونو لکه JPEG (انځور) او WAVE (اواز) په مطالعې تمرکز وکړي، او په عمل کې به د دې فارمیټونو (.jpg، .wav) کارولو مثالونه هم شامل کړي. پدې برخه کې به موږ WAVE وګورو.

История

WAVE (د ویوفارم آډیو فایل فارمیټ) د آډیو جریان ثبت کولو ذخیره کولو لپاره د کانټینر فایل فارمیټ دی. دا کانټینر عموما د غیر کمپریس شوي نبض کوډ ماډل شوي آډیو ذخیره کولو لپاره کارول کیږي. (د ویکیپیډیا څخه اخیستل شوی)

دا په 1991 کې د مایکروسافټ او IBM (د هغه وخت مخکښ IT شرکتونه) لخوا د RIFF سره یوځای اختراع او خپور شو.

د فایل جوړښت

فایل د سر برخه لري، ډاټا پخپله، مګر فوټر نلري. سرلیک ټولټال 44 بایټ وزن لري.
سرلیک په نمونه کې د بټونو شمیر لپاره ترتیبات لري، د نمونې کچه، د غږ ژوروالی، او نور. د غږ کارت لپاره اړین معلومات. (ټول عددي جدول ارزښتونه باید په کوچني-اینډین ترتیب کې ولیکل شي)

د بلاک نوم
د بلاک اندازه (B)
توضیحات/هدف
ارزښت (د ځینو لپاره دا ثابت دی

chunkId
4
د میډیا کانټینر په توګه د فایل تعریف کول
0x52494646 په لوی انډین کې ("RIFF")

د ټوټې اندازه
4
د ټولې فایل اندازه پرته له chunkId او chunkSize څخه
FILE_SIZE - 8

شکل
4
د RIFF څخه د ډول تعریف
0x57415645 په Big-Endian کې ("WAVE")

subchunk1Id
4
د دې لپاره چې فایل د فارمیټ دوام په توګه ډیر ځای ونیسي
0x666d7420 په لوی انډین ("fmt")

subchunk1 اندازه
4
پاتې سرلیک (په بایټ کې)
16 د ډیفالټ لخوا (د آډیو جریان کمپریشن پرته د قضیې لپاره)

آډیو بڼه
2
د آډیو بڼه (د کمپریشن میتود او آډیو ډیټا جوړښت پورې اړه لري)
1 (د PCM لپاره، کوم چې موږ یې په پام کې نیسو)

د چینلونو شمیره
2
د چینلونو شمیر
1/2، موږ به 1 چینل واخلو (3/4/5/6/7... - یو ځانګړی آډیو ټریک، د مثال په توګه 4 د کواډ غږ لپاره، او داسې نور)

نمونوې بیه
4
د آډیو نمونې نرخ (په هرټز کې)
هرڅومره چې لوړ وي ، غږ به ښه وي ، مګر د ورته اوږدوالي آډیو ټریک رامینځته کولو لپاره به ډیرې حافظې ته اړتیا وي ، وړاندیز شوی ارزښت 48000 دی (د منلو وړ غږ کیفیت)

بایټ ریټ
4
په هره ثانیه کې د بایټونو شمیر
نمونوې بیه د چینلونو شمیره bitsPerSample (نور)

بلاک الین
2
د 1 نمونې لپاره د بایټس شمیر
numChannels * bitsPerSample: 8

bitsPerSample
2
په هر 1 نمونه کې د بټونو شمیر (ژورتیا)
هر هغه شمیر چې د 8 ضرب وي. څومره چې شمیره لوړه وي، غږ به ښه او دروند وي؛ د 32 بټونو څخه د انسان لپاره هیڅ توپیر نشته.

subchunk2Id
4
د ډیټا حوالې نښه (ځکه چې ممکن د آډیو فارمیټ پورې اړوند نور سرلیک عناصر شتون ولري)
0x64617461 په Big-Endian کې ("ډاټا")

subchunk2 اندازه
4
د معلوماتو ساحه اندازه
په int کې د معلوماتو اندازه

معلومات
byteRate * د آډیو موده
د آډیو ډاټا
?

د WAVE مثال

پخوانی جدول په اسانۍ سره په C کې جوړښت ته ژباړل کیدی شي، مګر د نن ورځې لپاره زموږ ژبه Python ده. ترټولو اسانه شی چې تاسو یې کولی شئ د "څپې" څخه کار واخلئ - د شور جنراتور. د دې کار لپاره موږ لوړ بایټ ریټ او کمپریشن ته اړتیا نلرو.
لومړی، راځئ چې اړین ماډلونه وارد کړو:

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

بیا، موږ اړتیا لرو چې د میز څخه ټول اړین تغیرات د دوی د اندازې مطابق جوړ کړو. په دې کې متغیر ارزښتونه یوازې په numSamples (د نمونو شمیر) پورې اړه لري. هرڅومره چې دوی شتون ولري ، زموږ شور به اوږد وي.

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

ټول هغه څه چې پاتې دي دا دي چې په اړین ترتیب کې یې ولیکئ (لکه څنګه چې په جدول کې):

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

نو، چمتو دی. د سکریپټ کارولو لپاره، موږ اړتیا لرو چې اړین کمانډ لاین دلیلونه اضافه کړو:
python3 WAV.py [num of samples] [output]
د نمونو شمیر - شمیره. نمونې
output - د آوټ پټ فایل ته لاره

دلته د شور سره د ازموینې آډیو فایل لپاره لینک دی ، مګر د حافظې خوندي کولو لپاره ما BPS 1b/s ته راټیټ کړ او د چینلونو شمیر یې 1 ته راټیټ کړ (د 32-bit غیر کمپریس شوي سټیریو آډیو سټریم سره په 64kbs کې ، دا ثابت شو. 80M خالص .wav فایل، او یوازې 10): https://instaud.io/3Dcy

ټول کوډ (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)

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

نتیجه

نو تاسو د ډیجیټل غږ او دا څنګه ذخیره کیږي په اړه لږ څه زده کړل. په دې پوسټ کې موږ کمپریشن (آډیو فارمیټ) نه دی کارولی، مګر د هرې مشهورې په پام کې نیولو لپاره به 10 مقالې ته اړتیا وي، زه هیله لرم چې تاسو د ځان لپاره یو څه نوي زده کړي او دا به تاسو سره په راتلونکو پرمختګونو کې مرسته وکړي.
ساپی!

سرچینې

د WAV فایل جوړښت
WAV - ويکيپېډيا

سرچینه: www.habr.com

Add a comment