میڈیا ڈیٹا کو WAVE اور JPEG فارمیٹس میں کمپریس کرنے/اسٹور کرنے کے طریقے، حصہ 1

ہیلو! مضامین کی میری پہلی سیریز تصویر/آڈیو کمپریشن اور اسٹوریج کے طریقوں جیسے JPEG (تصویر) اور WAVE (آواز) کے مطالعہ پر توجہ مرکوز کرے گی، اور عملی طور پر ان فارمیٹس (.jpg، .wav) کو استعمال کرنے والے پروگراموں کی مثالیں بھی شامل کریں گی۔ اس حصے میں ہم WAVE کو دیکھیں گے۔

کہانی

ویو (ویوفارم آڈیو فائل فارمیٹ) آڈیو اسٹریم کی ریکارڈنگ کو اسٹور کرنے کے لیے ایک کنٹینر فائل فارمیٹ ہے۔ یہ کنٹینر عام طور پر غیر کمپریسڈ پلس کوڈ ماڈیولڈ آڈیو کو ذخیرہ کرنے کے لیے استعمال ہوتا ہے۔ (وکی پیڈیا سے ماخوذ)

یہ 1991 میں RIFF کے ساتھ مائیکروسافٹ اور IBM (اس وقت کی معروف آئی ٹی کمپنیوں) نے ایجاد اور شائع کیا تھا۔

فائل کا ڈھانچہ

فائل میں ہیڈر کا حصہ ہے، خود ڈیٹا، لیکن کوئی فوٹر نہیں۔ ہیڈر کا وزن کل 44 بائٹس ہے۔
ہیڈر میں نمونے میں بٹس کی تعداد، نمونے کی شرح، آواز کی گہرائی وغیرہ کی ترتیبات شامل ہیں۔ ساؤنڈ کارڈ کے لیے درکار معلومات۔ (تمام عددی جدول کی قدریں لٹل اینڈین ترتیب میں لکھی جانی چاہئیں)

بلاک کا نام
بلاک سائز (B)
تفصیل/مقصد
قدر (کچھ کے لیے یہ طے شدہ ہے۔

chunkId
4
ایک فائل کو میڈیا کنٹینر کے طور پر بیان کرنا
بگ اینڈین میں 0x52494646 ("RIFF")

chunkSize
4
chunkId اور chunkSize کے بغیر پوری فائل کا سائز
FILE_SIZE - 8

فارمیٹ
4
RIFF سے قسم کی تعریف
بگ اینڈین میں 0x57415645 ("WAVE")

subchunk1Id
4
تاکہ فائل فارمیٹ کے تسلسل کے طور پر زیادہ جگہ لے
بگ اینڈین میں 0x666d7420 ("fmt")

ذیلی حصہ 1 سائز
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

ذیلی حصہ 2 سائز
4
ڈیٹا ایریا کا سائز
int میں ڈیٹا کا سائز

اعداد و شمار
byteRate * آڈیو دورانیہ
آڈیو ڈیٹا
?

لہر کی مثال

پچھلی جدول کا آسانی سے 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]
نمونوں کی تعداد - شمار۔ نمونے
آؤٹ پٹ - آؤٹ پٹ فائل کا راستہ

یہاں شور کے ساتھ ٹیسٹ آڈیو فائل کا لنک ہے، لیکن میموری کو بچانے کے لیے میں نے BPS کو 1b/s تک کم کر دیا اور چینلز کی تعداد کو 1 کر دیا (32kbs پر 64 بٹ غیر کمپریسڈ سٹیریو آڈیو سٹریم کے ساتھ، یہ نکلا 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

نیا تبصرہ شامل کریں