WAVE နဟင့် JPEG ဖော်မတ်မျာသတလင် မီဒီယာဒေတာကို ချုံ့/သိမ်သဆည်သခဌင်သအတလက် နည်သလမ်သမျာသ၊ အပိုင်သ ၁

မင်္ဂလာပါ! ကျလန်ုပ်၏ပထမဆုံသဆောင်သပါသစီသရီသမျာသသည် JPEG (ရုပ်ပုံ) နဟင့် WAVE (အသံ) ကဲ့သို့သော ရုပ်ပုံ/အသံချုံ့ခဌင်သနဟင့် သိုလဟောင်မဟုနည်သလမ်သမျာသကို လေ့လာခဌင်သအပေါ် အာရုံစိုက်မည်ဖဌစ်ပဌီသ လက်တလေ့တလင် အဆိုပါဖော်မတ်မျာသ (.jpg, .wav) အသုံသပဌုထာသသော ပရိုဂရမ်မျာသ၏ နမူနာမျာသလည်သ ပါဝင်မည်ဖဌစ်သည်။ ဒီအပိုင်သမဟာတော့ WAVE ကို ကဌည့်ပါမယ်။

ပုံပဌင်

WAVE (Waveform Audio File Format) သည် အော်ဒီယိုစီသကဌောင်သတစ်ခု၏ အသံသလင်သခဌင်သကို သိမ်သဆည်သရန်အတလက် ကလန်တိန်နာဖိုင်ဖော်မတ်တစ်ခုဖဌစ်သည်။ ပုံမဟန်အာသဖဌင့် ကကလန်တိန်နာကို ချုံ့မထာသသော သလေသခုန်နဟုန်သကုဒ်ဖဌင့် ပဌုပဌင်ထာသသော အသံကို သိမ်သဆည်သရန် အသုံသပဌုသည်။ (ဝီကီပီသဒီသယာသမဟကူသယူသည်)

၎င်သကို Microsoft နဟင့် IBM (ထိုခေတ်က ထိပ်တန်သ အိုင်တီကုမ္ပဏီမျာသ) မဟ RIFF နဟင့်အတူ 1991 ခုနဟစ်တလင် တီထလင်ထုတ်ဝေခဲ့သည်။

ဖိုင်ဖလဲ့စည်သပုံ

ဖိုင်တလင် ခေါင်သစီသအပိုင်သ၊ ဒေတာကိုယ်တိုင်ပါရဟိသော်လည်သ အောက်ခဌေမဟတ်စုမရဟိပါ။ ခေါင်သစီသသည် စုစုပေါင်သ 44 bytes အလေသချိန်ရဟိသည်။
ခေါင်သစီသတလင် နမူနာရဟိ ဘစ်အရေအတလက်၊ နမူနာနဟုန်သ၊ အသံအတိမ်အနက်၊ စသည်တို့အတလက် ဆက်တင်မျာသ ပါရဟိသည်။ အသံကဒ်အတလက်လိုအပ်သောအချက်အလက်မျာသ။ (ဂဏန်သဇယာသတန်ဖိုသအာသလုံသကို Little-Endian အစီအစဉ်ဖဌင့် ရေသသာသရပါမည်)

ပိတ်ဆို့အမည်
ပိတ်ဆို့အရလယ်အစာသ (B)
ဖော်ပဌချက်/ရည်ရလယ်ချက်
တန်ဖိုသ (အချို့အတလက်၎င်သကိုသတ်မဟတ်ထာသသည်။

chunkId
4
ဖိုင်ကို မီဒီယာကလန်တိန်နာအဖဌစ် သတ်မဟတ်ခဌင်သ။
Big-Endian တလင် 0x52494646 ("RIFF")

အတုံသအရလယ်အစာသ
4
chunkId နဟင့် chunkSize မပါဘဲ ဖိုင်တစ်ခုလုံသ၏ အရလယ်အစာသ
FILE_SIZE - ၈

ပုံစံ
4
RIFF မဟ အဓိပ္ပါယ်ဖလင့်ဆိုချက်ကို ရိုက်ထည့်ပါ။
Big-Endian တလင် 0x57415645 (“WAVE”)

subchunk1Id
4
ဖော်မတ်ဆက်လုပ်ခဌင်သဖဌင့် ဖိုင်သည် နေရာပိုယူနိုင်စေရန်
Big-Endian တလင် 0x666d7420 (“fmt”)

အပိုင်သ ၁ အရလယ်အစာသ
4
လက်ကျန် ခေါင်သစီသ (ဘိုက်မျာသ)
16 မူရင်သအတိုင်သ (အသံစီသကဌောင်သချုံ့ခဌင်သမရဟိဘဲ ကိစ္စအတလက်)

အသံဖော်မတ်
2
အသံဖော်မတ် (ချုံ့နည်သနဟင့် အသံဒေတာဖလဲ့စည်သပုံအပေါ် မူတည်သည်)
1 (PCM အတလက်၊ ကျလန်ုပ်တို့ စဉ်သစာသနေသည်)

လိုင်သမျာသ
2
လိုင်သအရေအတလက်
1/2၊ ချန်နယ် 1 ခု (3/4/5/6/7... - သီသခဌာသအော်ဒီယိုတစ်ပုဒ်၊ ဥပမာ quad audio အတလက် 4 ခု၊ စသည်ဖဌင့်)

နမူနာနဟုန်သ
4
အသံနမူနာနဟုန်သ (Hertz ဖဌင့်)
ပိုမဌင့်လေ၊ အသံပိုကောင်သလေ၊ သို့သော် တူညီသောအလျာသရဟိသော အော်ဒီယိုတေသသလာသကို ဖန်တီသရန် မန်မိုရီ ပိုမျာသလေလေ၊ အကဌံပဌုထာသသော တန်ဖိုသမဟာ 48000 (လက်ခံနိုင်ဆုံသသော အသံအရည်အသလေသ)

byteRate
4
တစ်စက္ကန့်လျဟင် bytes အရေအတလက်
နမူနာနဟုန်သ လိုင်သမျာသ bitsPerSample (နောက်ထပ်)

blockAlign
2
နမူနာ 1 အတလက် ဘိုက်အရေအတလက်
numChannels * bitsPerSample: ၈

bitsPerSample
2
နမူနာ 1 ခုအတလက် ဘစ်အရေအတလက် (အတိမ်အနက်)
8 နဟင့် ပေါင်သထာသသော မည်သည့်ဂဏန်သမဆို အရေအတလက်မျာသလေလေ အသံပိုကောင်သလေလေ၊ 32 bits မဟသည် လူသာသမျာသအတလက် ကလာခဌာသချက်မရဟိပေ။

subchunk2Id
4
ဒေတာရည်ညလဟန်သအမဟတ်အသာသ (အသံဖော်မတ်ပေါ်မူတည်၍ အခဌာသခေါင်သစီသအစိတ်အပိုင်သမျာသ ရဟိနိုင်သောကဌောင့်)
Big-Endian("ဒေတာ") တလင် 0x64617461

အပိုင်သ ၁ အရလယ်အစာသ
4
ဒေတာဧရိယာအရလယ်အစာသ
int တလင်ဒေတာအရလယ်အစာသ

ဒေတာ
byteRate * အသံကဌာချိန်
အသံဒေတာ
?

WAVE ဥပမာ

ယခင်ဇယာသကို C ဖဌင့်ဖလဲ့စည်သပုံသို့ အလလယ်တကူပဌန်ဆိုနိုင်သော်လည်သ ယနေ့ကျလန်ုပ်တို့၏ဘာသာစကာသမဟာ Python ဖဌစ်သည်။ သင်လုပ်နိုင်သောအလလယ်ဆုံသအရာမဟာ "လဟိုင်သ" - ဆူညံသံဂျင်နရေတာကိုသုံသပါ။ ကလုပ်ငန်သအတလက် ကျလန်ုပ်တို့သည် မဌင့်မာသသော byteRate နဟင့် compression မလိုအပ်ပါ။
ပထမညသစလာ လိုအပ်သော module မျာသကို တင်သလင်သကဌပါစို့။

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

ထို့နောက်၊ ကျလန်ုပ်တို့သည် ၎င်သတို့၏ အရလယ်အစာသအလိုက် ဇယာသမဟ လိုအပ်သော variable အာသလုံသကို ဖန်တီသရန် လိုအပ်သည်။ ၎င်သရဟိ ကိန်သရဟင်တန်ဖိုသမျာသသည် 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)  # саЌ шуЌ

ကျန်တာအာသလုံသကို လိုအပ်သော sequence (ဇယာသတလင်ပါသည့်အတိုင်သ) ရေသမဟတ်ထာသရန်ဖဌစ်ပါသည်။

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

ဒါကဌောင့် အဆင်သင့်ဖဌစ်နေပါပဌီ။ script ကိုအသုံသပဌုရန်၊ လိုအပ်သော command line arguments မျာသကိုထည့်ရန်လိုအပ်သည်-
python3 WAV.py [num of samples] [output]
နမူနာအရေအတလက် - အရေအတလက်။ နမူနာမျာသ
output — အထလက်ဖိုင်သို့ လမ်သကဌောင်သ

ကသည်မဟာ ဆူညံသံပါသော စမ်သသပ်အသံဖိုင်တစ်ခုသို့ လင့်ခ်တစ်ခုဖဌစ်ပါသည်၊ သို့သော် မမ်မိုရီကို သိမ်သဆည်သရန်အတလက် ကျလန်ုပ်သည် BPS ကို 1b/s သို့ လျဟော့ချလိုက်ပဌီသ ချန်နယ်အရေအတလက်ကို 1 သို့ လျဟော့ချခဲ့သည် (32-bit မချုံ့မထာသသော စတီရီယို အော်ဒီယိုထုတ်လလဟင့်မဟုတလင် 64kbs ဖဌင့် ဖဌစ်လာခဲ့သည်၊ သန့်စင်သော .wav ဖိုင် 80M နဟင့် 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)  # запОсываеЌ в файл результат

ရလဒ်

ထို့ကဌောင့် ဒစ်ဂျစ်တယ်အသံနဟင့် ၎င်သကို သိမ်သဆည်သပုံအကဌောင်သ အနည်သငယ် ပိုလေ့လာပဌီသဖဌစ်သည်။ ကပို့စ်တလင် ကျလန်ုပ်တို့သည် compression (audioFormat) ကိုအသုံသမပဌုဘဲ လူကဌိုက်မျာသသောအကဌောင်သအရာတစ်ခုစီကိုသုံသသပ်ရန်အတလက် ဆောင်သပါသ 10 ခု လိုအပ်မည်ဖဌစ်ပါသည်။ သင်ကိုယ်တိုင်အတလက် အသစ်အဆန်သတစ်ခုခုကို သင်ယူခဲ့ပဌီသ ၎င်သသည် သင့်အာသ အနာဂတ်တိုသတက်မဟုမျာသတလင် ကူညီပေသလိမ့်မည်ဟု မျဟော်လင့်ပါသည်။
Thank you!

သတင်သရင်သမဌစ်

WAV ဖိုင်ဖလဲ့စည်သပုံ
WAV - ဝီကီပီသဒီသယာသ

source: www.habr.com

မဟတ်ချက် Add