የሚዲያ መረጃን በ WAVE እና JPEG ቅርጸቶች የመጨመቅ/የማከማቸት ዘዴዎች፣ ክፍል 1

ሀሎ! የመጀመሪያ ተከታታይ ጽሑፎቼ ምስል/ድምጽ መጨመሪያ እና እንደ JPEG (ምስል) እና WAVE (ድምፅ) ያሉ የማከማቻ ዘዴዎችን በማጥናት ላይ ያተኩራሉ፣ እና እነዚህን ቅርጸቶች (.jpg, .wav) በተግባር ላይ የሚውሉ የፕሮግራሞችን ምሳሌዎችንም ይጨምራሉ። በዚህ ክፍል WAVEን እንመለከታለን.

История

WAVE (Waveform Audio File Format) የድምጽ ዥረት ቅጂን ለማከማቸት መያዣ ፋይል ቅርጸት ነው። ይህ መያዣ በተለምዶ ያልተጨመቀ የ pulse code የተቀየረ ኦዲዮን ለማከማቸት ይጠቅማል። (ከዊኪፔዲያ የተወሰደ)

እ.ኤ.አ. በ1991 ከRIFF በ Microsoft እና IBM (በዚያን ጊዜ መሪ የአይቲ ኩባንያዎች) ተፈለሰፈ እና ታትሟል።

የፋይል መዋቅር

ፋይሉ የራስጌ ክፍል አለው፣ ውሂቡ ራሱ፣ ግን ግርጌ የለውም። ራስጌው በድምሩ 44 ባይት ይመዝናል።
ራስጌው በናሙና ውስጥ ያሉት የቢት ብዛት፣ የናሙና መጠን፣ የድምጽ ጥልቀት ወዘተ ቅንብሮችን ይዟል። ለድምጽ ካርድ አስፈላጊ መረጃ. (ሁሉም የቁጥር ሰንጠረዥ ዋጋዎች በትንሽ-ኢንዲያን ቅደም ተከተል መፃፍ አለባቸው)

አግድ ስም
የማገጃ መጠን (ቢ)
መግለጫ/ዓላማ
ዋጋ (ለአንዳንዶች ተስተካክሏል

chunkId
4
ፋይልን እንደ ሚዲያ መያዣ መግለጽ
0x52494646 በቢግ-ኤንዲያን ("RIFF")

chunkSize
4
የጠቅላላው ፋይል መጠን ያለ chunkId እና chunkSize
FILE_SIZE - 8

ቅርጸት
4
ፍቺን ከRIFF ይተይቡ
0x57415645 በቢግ-ኤንዲያን ("WAVE")

subchunk1 መታወቂያ
4
ስለዚህ ፋይሉ እንደ ቅርጸቱ ቀጣይነት ተጨማሪ ቦታ ይወስዳል
0x666d7420 በቢግ-ኤንዲያን ("fmt")

subchunk1መጠን
4
የቀረው ራስጌ (በባይት)
16 በነባሪ (የድምጽ ዥረት መጭመቅ ለሌለው ጉዳይ)

የድምጽ ቅርጸት
2
የድምጽ ቅርጸት (በመጨመቂያ ዘዴ እና በድምጽ ውሂብ መዋቅር ላይ የተመሰረተ ነው)
1 (ለ PCM፣ እያሰብነው ያለነው)

numChannels
2
የሰርጦች ብዛት
1/2፣ 1 ቻናል እንወስዳለን (3/4/5/6/7... - የተወሰነ የድምጽ ትራክ፣ ለምሳሌ 4 ለኳድ ኦዲዮ፣ ወዘተ.)

የናሙና ደረጃ
4
የድምጽ ናሙና መጠን (በኸርዝ ውስጥ)
ከፍ ባለ መጠን ድምፁ የተሻለ ይሆናል፣ ነገር ግን ተመሳሳይ ርዝመት ያለው የድምጽ ትራክ ለመፍጠር ብዙ ማህደረ ትውስታ ያስፈልጋል፣ የሚመከረው ዋጋ 48000 ነው (በጣም ተቀባይነት ያለው የድምፅ ጥራት)

ባይት ተመን
4
በሰከንድ ባይት ብዛት
የናሙና ደረጃ numChannels bitsPerSample (ተጨማሪ)

አግድ አሰላለፍ
2
ለ 1 ናሙና የባይት ብዛት
ቁጥር ቻነሎች * bitsPerSample: 8

bitsPerSample
2
የቢቶች ብዛት በ 1 ናሙና (ጥልቀት)
የ 8 ብዜት የሆነ ማንኛውም ቁጥር. ቁጥሩ ከፍ ባለ ቁጥር የተሻለ እና ክብደት ያለው ድምጽ ይሆናል, ከ 32 ቢት በሰዎች ላይ ምንም ልዩነት የለም.

subchunk2 መታወቂያ
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]
የናሙናዎች ብዛት - ቆጠራ. ናሙናዎች
ውፅዓት - ወደ ውፅዓት ፋይል የሚወስደው መንገድ

የድምጽ ፋይል ከድምፅ ጋር የሚያገናኘው ማገናኛ እዚህ አለ ነገር ግን ማህደረ ትውስታን ለመቆጠብ BPSን ወደ 1b/s ዝቅ አድርጌ የቻናሎቹን ቁጥር ወደ 1 ዝቅ አድርጌ ነበር (በ 32 ቢት ያልተጨመቀ የስቴሪዮ የድምጽ ዥረት በ64 ኪ.ቢ.ኤስ. 80ሚ ንጹህ .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 - ዊኪፔዲያ

ምንጭ: hab.com

አስተያየት ያክሉ