WAVE ۽ JPEG فارميٽ ۾ ميڊيا ڊيٽا کي گڏ ڪرڻ/اسٽور ڪرڻ جا طريقا، حصو 1

سلام! مضمونن جو منهنجو پهريون سلسلو تصوير/آڊيو ڪمپريشن ۽ اسٽوريج طريقن جهڙوڪ JPEG (تصوير) ۽ WAVE (آواز) جي مطالعي تي ڌيان ڏيندو، ۽ انهن فارميٽ (.jpg، .wav) کي عملي طور استعمال ڪندي پروگرامن جا مثال پڻ شامل ڪندو. هن حصي ۾ اسان ڏسنداسين WAVE.

История

WAVE (Waveform آڊيو فائل فارميٽ) هڪ ڪنٽينر فائل فارميٽ آهي جيڪو هڪ آڊيو اسٽريم جي رڪارڊنگ کي محفوظ ڪرڻ لاءِ. هي ڪنٽينر عام طور تي استعمال ڪيو ويندو آهي ذخيرو ڪرڻ لاءِ اڻ سڌريل پلس ڪوڊ ماڊل ٿيل آڊيو. (وڪيپيڊيا تان ورتل)

اهو ايجاد ڪيو ويو ۽ 1991 ۾ RIFF سان گڏ Microsoft ۽ IBM (ان وقت جي معروف آئي ٽي ڪمپنيون) پاران شايع ڪيو ويو.

فائل جي جوڙجڪ

فائل ۾ ھڪڙو مٿو حصو آھي، ڊيٽا پاڻ، پر ڪو فوٽر. هيڊر مجموعي طور تي 44 بائيٽ جو وزن آهي.
هيڊر نموني ۾ بٽ جي تعداد، نموني جي شرح، آواز جي کوٽائي، وغيره لاء سيٽنگون شامل آهن. سائونڊ ڪارڊ لاءِ گهربل معلومات. (سڀني عددي جدول جي قيمتن کي ننڍي-انڊين آرڊر ۾ لکڻ گھرجي)

بلاڪ جو نالو
بلاڪ سائيز (B)
وضاحت / مقصد
قدر (ڪجهه لاءِ اهو طئي ٿيل آهي

chunkId
4
ھڪڙي فائل کي ميڊيا ڪنٽينر طور بيان ڪرڻ
0x52494646 بگ-انڊين ۾ ("RIFF")

chunksize
4
chunkId ۽ chunkSize کان سواءِ پوري فائل جي سائيز
FILE_SIZE - 8

شڪل
4
RIFF مان قسم جي تعريف
0x57415645 بگ-انڊين ۾ ("WAVE")

subchunk1Id
4
انهي ڪري ته فائل فارميٽ جي تسلسل جي طور تي وڌيڪ جاء وٺي
0x666d7420 بگ-انڊين ۾ ("fmt")

subchunk1 سائيز
4
باقي هيڊر (بائيٽس ۾)
16 ڊفالٽ طور (آڊيو اسٽريم ڪمپريشن کان سواءِ ڪيس لاءِ)

آڊيو فارميٽ
2
آڊيو فارميٽ (انحصار ڪمپريشن جو طريقو ۽ آڊيو ڊيٽا جي جوڙجڪ تي)
1 (PCM لاءِ، جيڪو اسان غور ڪري رهيا آهيون)

num چينلز
2
شاخن جو تعداد
1/2، اسان 1 چينل کڻنداسين (3/4/5/6/7... - هڪ مخصوص آڊيو ٽريڪ، مثال طور 4 کواڊ آواز لاءِ، وغيره)

نموني جي شرح
4
آڊيو نموني جي شرح (Hertz ۾)
جيترو وڌيڪ اوترو بهتر آواز هوندو، پر هڪ ئي ڊگھي آڊيو ٽريڪ ٺاهڻ لاءِ وڌيڪ ميموري جي ضرورت پوندي، تجويز ڪيل قيمت 48000 آهي (سڀ کان وڌيڪ قابل قبول آواز جو معيار)

byteRate
4
في سيڪنڊ بائيٽ جو تعداد
نموني جي شرح num چينلز bitsPerSample (وڌيڪ)

بلاڪ الائن
2
1 نموني لاء بائيٽ جو تعداد
numChannels * bitsPerSample: 8

bitsPerSample
2
بٽس جو تعداد في 1 نمونو (کوٽائي)
ڪو به انگ جيڪو 8 جو ملٽيل هوندو. جيترو وڌيڪ نمبر هوندو، اوترو بهتر ۽ ڳرو آواز هوندو؛ 32 بٽس مان انسانن لاءِ ڪو به فرق ناهي.

subchunk2Id
4
ڊيٽا ريفرنس مارڪ (جيئن ته آڊيو فارميٽ جي لحاظ کان ٻيا هيڊر عنصر هوندا)
0x64617461 بگ-انڊين ۾ ("ڊيٽا")

subchunk2 سائيز
4
ڊيٽا علائقي جي ماپ
int ۾ ڊيٽا جي ماپ

ڊيٽا
byteRate * آڊيو مدت
آڊيو ڊيٽا
?

WAVE مثال

پوئين جدول کي آسانيءَ سان ترجمو ڪري سگھجي ٿو ھڪڙي جوڙجڪ ۾ C ۾، پر اسان جي اڄ جي ٻولي پٿون آھي. سڀ کان آسان ڪم جيڪو توهان ڪري سگهو ٿا اهو آهي ”موج“ - هڪ شور جنريٽر. هن ڪم لاءِ اسان کي اعليٰ بائيٽ ريٽ ۽ ڪمپريشن جي ضرورت ناهي.
پهرين، اچو ته ضروري ماڊل درآمد ڪريو:

# 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 - output فائل ڏانهن رستو

هتي شور سان ٽيسٽ آڊيو فائل جي لنڪ آهي، پر ميموري کي بچائڻ لاءِ مون BPS کي 1b/s تائين گهٽايو ۽ چينلن جو تعداد 1 تائين گهٽ ڪيو (32kbs تي 64-bit uncompressed اسٽيريو آڊيو اسٽريم سان، اهو نڪتو. 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

تبصرو شامل ڪريو