سلام! زما د مقالو لومړۍ لړۍ به د عکس/آډیو کمپریشن او ذخیره کولو میتودونو لکه 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):
ټول کوډ (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 مقالې ته اړتیا وي، زه هیله لرم چې تاسو د ځان لپاره یو څه نوي زده کړي او دا به تاسو سره په راتلونکو پرمختګونو کې مرسته وکړي.
ساپی!
سرچینې
سرچینه: www.habr.com