WAVE和JPEG中媒体的压缩/存储方法,第1部分

你好 我的第一系列文章将致力于研究压缩和存储图像/声音的方法,例如JPEG(图像)和WAVE(声音),并且还将包括在实践中使用这些格式(.jpg,.wav)的程序的示例。 在这一部分中,我们将考虑WAVE。


故事


WAVE(波形音频文件格式)是用于存储音频流记录的容器文件格式。 该容器通常用于存储脉冲编码调制中的未压缩声音。 (改编自维基百科)

它是由Microsoft和IBM(当时的领先IT公司)于1991年与RIFF一起发明和出版的。


档案结构


该文件具有标题部分,即数据本身,但是没有页脚。 标题共重44个字节。
标题包含样本中位数,除频频率,声音深度等的设置。 声卡所需的信息。 (所有数字表值必须以Little-Endian顺序编写)


块名块大小(B)描述/目的值(对于某些值是固定的
chunkId4将文件定义为媒体容器Big-Endian(“ RIFF”)中的0x52494646
chunkSize4不含chunkId和chunkSize的整个文件的大小FILE_SIZE-8
格式4RIFF的类型定义Big-Endian中的0x57415645(“ WAVE”)
subchunk1Id4占用更多文件空间 续格式Big-Endian(“ fmt”)中的0x666d7420
subchunk1Size4剩余标头(以字节为单位)默认情况下为16(对于没有音频流压缩的情况)
audioFormat2音频格式(取决于压缩方法和音频数据结构)1(对于PCM,我们正在考虑)
numChannels2通道数1/2,我们占用1个通道(3/4/5/6/7 ...-特定的音轨,例如4代表四声道声音,等等)
sampleRate4声音采样频率(赫兹)越多,声音越好,但是创建相同长度的音轨需要更多的内存,建议值为48000(最可接受的音质)
byteRate41秒内的字节数sampleRate numChannels bitsPerSample(以下简称)
blockAlign21个样本的字节数numChannels * bitsPerSample:8
bitsPerSample2每1个样本的位数(深度)任何8的倍数。音频越大,音频越好,越难听,从32位开始,一个人没有区别
subchunk2Id4数据开头的参考标记(因为可能有其他标头元素,取决于audioFormat)Big-Endian中的0x64617461(“数据”)
subchunk2Size4数据区大小int的数据大小
资料byteRate *音频持续时间音频数据

WAVE示例


上表可以很容易地转换为C结构,但是今天我们的语言是Python。 使用电波最简单的方法是产生噪声。 对于此任务,我们不需要较高的byteRate和压缩率。
首先,我们导入必要的模块:


# 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'\x10\x00\x00\x00' # 0d16 audioFormat = b'\x01\x00' numChannels = b'\x02\x00' # 2-    () sampleRate = pack('<L', 1000) # 1000 ,    ,     .  1000-  ,   bitsPerSample = b'\x20\x00' # 0d32 byteRate = pack('<L', 1000 * 2 * 4) # sampleRate * numChannels * bitsPerSample / 8 (32 bit sound) blockAlign = b'\x08\x00' # 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(使用64kbs的32位未压缩立体声音频流,我们得到了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'\x10\x00\x00\x00' # 0d16 audioFormat = b'\x01\x00' numChannels = b'\x02\x00' # 2-    () sampleRate = pack('<L', 1000) # 1000 ,    . bitsPerSample = b'\x20\x00' # 0d32 byteRate = pack('<L', 1000 * 2 * 4) # sampleRate * numChannels * bitsPerSample / 8 (32 bit sound) blockAlign = b'\x08\x00' # 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) #     

总结


因此,您了解了更多有关数字声音及其存储方式的知识。 在本文中,我们没有使用压缩(audioFormat),但要阅读每篇热门文章,您将需要使用文章10。希望您自己学到了一些新知识,这对以后的发展会有所帮助。
谢谢你


资料来源

WAV文件结构
WAV-维基百科

Source: https://habr.com/ru/post/zh-CN450774/


All Articles