【问题标题】:How to remove the riff headers from wav file in Swift?如何从 Swift 中的 wav 文件中删除 riff 标头?
【发布时间】:2020-01-21 22:17:46
【问题描述】:

我只想拥有 .wav 文件的数据块并排除所有其他块,即 riff 标头。

        let voiceData = try? Data(contentsOf: soundUrl).advanced(by: 44)

我确实尝试过,但由于某种原因,在实际音频之前仍有一些包袱。谁能帮我解决这个问题。如果有一种有效的方法来读取 .wav 文件并且只包含数据部分?

【问题讨论】:

  • 如果去掉header,就不再是wav文件了。你能解释一下你真正想要做什么吗? iOS 会给你一个 PCM 版本,那你为什么要弄乱数据呢?
  • 我向其发送音频文件的服务器不接受任何标题,如果有则抛出错误。我知道这是一个棘手的情况,但我没有选择剥离标题。
  • 好吧,正如我所说,您可以很容易地转换为原始 PCM 数据。但是,如果您删除标头,服务器将不知道这是多少个频道,它们是否交错,比特率是多少等等等等。您要求做的事情没有意义。没有描述符的原始声音数据没有任何用处,它只是一堆无法解释的字节。

标签: ios swift wav riff


【解决方案1】:

首先,您确定这实际上是一个 WAV 文件吗? WAV 通常有 44 字节的标头。为什么你相信有“一些包袱”?你是怎么确定的?

您当然可以直接解析 RIFF 格式。最简单(最草率)的方法是向下扫描,直到找到字节“数据”(0x64 61 74 61)。接下来的 4 个字节将是长度(采用 little-endian 格式,如果您只是要读到最后,可以跳过),然后是您想要的实际数据。

使用range(of:) 查找data 字节

let dataBytes = Data([0x64, 0x61, 0x74, 0x61])
if let dataRange = riff.range(of: dataBytes) {
    let start = dataRange.endIndex + 4  // Skip over length bytes
    let samples = riff[start...] // read the rest of the bytes
    // use samples
}

【讨论】:

  • 我对 swift 非常陌生,想知道如何完成这个确切的过程。先生,如果您能帮助我,那将是非常有帮助的。我确实通读了 .wav 格式,发现 RiffChunkId = 0x46464952, // "RIFF" WavChunkId = 0x45564157, // "WAVE" FormatChunkId = 0x20746D66, // "fmt " DataChunkId = 0x61746164 // "data"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-03
  • 1970-01-01
  • 1970-01-01
  • 2014-11-19
  • 1970-01-01
  • 1970-01-01
  • 2020-07-23
相关资源
最近更新 更多