【问题标题】:Why write to BinaryWriter twice?为什么要写入 BinaryWriter 两次?
【发布时间】:2016-01-08 18:54:31
【问题描述】:

我正在实现这个音调发生器程序,效果很好:

https://social.msdn.microsoft.com/Forums/vstudio/en-US/c2b953b6-3c85-4eda-a478-080bae781319/beep-beep?forum=vbgeneral

我想不通的是为什么下面两行代码:

BW.Write(Sample)
BW.Write(Sample)

一个“写”是有道理的,但为什么第二个“写”呢?

【问题讨论】:

  • 你可以自己回答这个问题:注释掉其中一个并运行它,看看结果如何
  • 我试过了,结果很奇怪。如果我注释掉第一个,SP.Play() 命令会出错。如果我注释掉第二个,我会得到音调,但要高一个八度。无法解释这些结果...
  • 第二次写入可能只是在刷新第一次写入
  • 在这两条语句之后实际上有一个 Flush 命令,用于清除 BinaryWriter (BW) 并将数据推送到 MemoryStream (MS) 中。但是,我想这可能是……我认为可能有更具体的目的。
  • 它可能是一个立体声流,两个写入只是将相同的样本发送到两个通道 - 交错。

标签: vb.net audio memorystream binarywriter tone-generator


【解决方案1】:

这个例子有点神秘,但波形文件配置为 2 个通道,因此两次写入只是将相同的音频数据发送到两个通道。

波头就是这个硬编码位:

Dim Hdr() As Integer = {&H46464952, 36 + Bytes, &H45564157, _
                        &H20746D66, 16, &H20001, 44100, _
                        176400, &H100004, &H61746164, Bytes}

解码的意思是:

H46464952 = 'RIFF'(小端序) 36+Bytes = 头部长度 + 数据长度 H45564157 = 'WAVE'(小端序) H20746D66 = 'fmt'(小端序) 16 = fmt 块的长度(总是 16) H20001 = 0x0001:PCM, 0x0002:2 个通道 44100 = 采样率 176400 = sampleRate*numChannels*bytesPerSample = 44100*2*2 H100004 = 0x0004:numChannels*bytesPerSample, 0x0010:bitsPerSample (16) H61746164 = '数据' 字节 = 数据块的大小

【讨论】:

  • 很好的解释。我在哪里可以找到有关这些值的一些文档?哦,“endian”是什么意思?那应该是“中位数”还是其他什么...
  • soundfile.sapp.org/doc/WaveFormat。 Endian 指的是字节顺序 - 大端 0x1234 是小端 0x3412。如果您查看字符串的 ascii 代码,您会发现它是反向拼写出来的。
  • 太棒了-谢谢。我在网上找到了一些文档。
猜你喜欢
  • 2019-08-26
  • 2016-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多