问题标签 [riff]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
694 浏览

c++ - 8 位(每个样本的位数)PCM WAV 文件可以包含多个通道吗?

我意识到忽视这个想法对我来说是不好的,因为我没有读过任何关于这个观点的number of channels东西bits per sample。我的原因是我不确定 2 通道 8 位 PCM 文件的样本会是什么样子。

1 sample = 1 channel吗?或者1 sample = 4 bits (left) + 4 bits (right)

上下文:我正在编写一个读取 WAV 文件的程序,我突然想到,如果我遇到 8 位 PCM WAV 文件,并且我的代码以这种方式读取(见下文),那么我的程序无法正确读取多通道 8 位 PCM WAV 文件。


0 投票
0 回答
61 浏览

wav - RIFF 文件格式标准是否有任何现代替代方案?

我喜欢 RIFF 标准,但我不喜欢文件长度限制为 4GB。是否有一个很好的现代文件格式标准来存储像 RIFF 这样的二进制数据?

我看到对于长 WAV 文件,Adobe 程序基本上只会忽略文件长度字节,但如果我正在制作新的文件格式,只包含字节而不使用它们似乎很奇怪。如果 RIFF 通常以现代格式不受欢迎,或者不?

0 投票
0 回答
393 浏览

java - Java:在不诉诸对象和类型转换的情况下解析 RIFF 容器

我正在编写一些代码来解析 Java 中的 RIFF 容器(出于教育目的,我知道有大量的 Java 库可以加载.wav或其他 RIFF 文件)。我的设计目标是尽可能地坚持格式。

根据维基百科,基本的 RIFF 格式非常简单:

  • 4 个字节:该块的 ASCII 标识符(例如“fmt”和“data”;注意“fmt”中的空格)。
  • 4 个字节:一个无符号、小端序的 32 位整数,具有该块的长度(除了该字段本身和块标识符)。
  • 可变大小字段:块数据本身,大小在前一个字段中给出。
  • 如果块的长度不均匀,则填充字节。

我目前正在努力处理可变大小字段的表示。到目前为止,我想出的最好的看起来是这样的。首先是 abstract class BaseFormat,它是所有格式解析类的基础:

它只是存储对流的引用,并充当read要实现的方法的接口。然后有两个主要的格式类:

那里没有什么花哨的东西。为简洁起见,我没有发布MyStream课程,它是一个非常简单的包装器InputStream,具有有用的实用功能,如getInt, getByte,getAsciiString等。

每一种 RIFF 格式都有自己的类别。整个 RIFF 文件是Riff,它依次尝试将块读取为Chunk类,然后读取块头 + 正文,然后魔术发生:一个大switch内部Chunk.read()选择要应用块内的哪个格式类 - 即Fmt1Body,Fmt2Body等。

它可以工作,您实际上可以用它读取 RIFF 文件。我遇到的问题是所有不同的块格式都由没有共同点的不同类表示。因此,当处理在内存中解析的文件时,我最终会进行大量类型检查和向上转换,例如:

等等等等。这在许多函数式语言中是正常的,但我想这是在 Java 中做事的一种不好的方式。有没有更好的方法来表示内存中的 RIFF 容器而不诉诸Object+ 类型检查 + 向上转换(或者像BaseFormat这样的一些等效无用的接口无论如何都需要转换)?

子格式类的来源

对于那些对子格式类感兴趣的人,这里有一些示例来证明它们除了使用streamandread()方法之外没有任何共同点:

0 投票
0 回答
762 浏览

javascript - 在 JS 中创建 .wav 文件 - “不是 WAVE 文件 - 没有 RIFF 头”

我正在尝试从浏览器的麦克风录制音频,并将其保存为 .wav 文件(发送到 API)

我有我所追求的二进制块,我可以将它转换为在 VLC(以及浏览器)中播放的 .wav 文件

但是当我尝试将其发送到http://www.beyondverbal.com/api/时,我收到

本质上的问题是,我怎样才能添加我需要的 RIFF 标头,或者我完全错了?

谢谢

0 投票
1 回答
141 浏览

php - 生成 WAV 并添加第二个(立体声)通道

我在stackoverflow上发现了以下令人难以置信的代码。请任何人都可以帮我添加第二个频道(立体声)

将有 nchannels = 2 必须(以某种方式)增加文件大小,并且必须添加 2. 数组(即 samples2)。

当我尝试时,我只会达到更高的频率。

非常感谢来自德国:马丁

0 投票
1 回答
727 浏览

wav - 如何确定 ADPCM wav 文件中的样本数?

我在规范的 WAV 结构中看不到这样的字段,但也许可以使用现有的字段?

我知道我们可以很容易地计算 PCM 流的样本数(raw_sound_data_size / (bits_pers_sample / 8)),但是如何处理 ADPCM?

在此处输入图像描述

0 投票
1 回答
47 浏览

javascript - 我有一个以 RIFF 编码的文件。如何通过 ajax 发布响应发送此文件?

我试图保留文件的 RIFF 编码,同时将其作为响应发送回来,如下所示。

当我收到来自我的 AJAX 调用的响应并检查它是 ASCII 格式的响应时。我试图将 readFileSync 的编码更改为 utf8,但这不起作用。我怎样才能做到这一点?

0 投票
0 回答
462 浏览

javascript - 以“RIFF(小端)数据”类型的纯 Javascript 处理图像文件

这些天我是一名服务器端开发人员,正在学习纯 JS 的技巧。我正在研究的一个实际例子是图像处理。

这个问题是关于探索如何支持加载(在纯 JS 中)类型为RIFF (little-endian) data. 有关该文件类型的更多信息在这里

例如,如果将这样的文件类型呈现给以下代码,则它永远不会加载和onerror触发:

此外,如果通过 分析文件头readAsArrayBuffer,则返回的头签名是52494646(这既不是 PNG、GIF 也不是 JPEG)。更有趣的是,我尝试上传一个示例 .avi 视频文件(也是 RIFF 格式)。这同样具有相同的标头签名。

也就是说,通过header分析我无法判断它是否是一个图像文件。

我的问题是:是否有任何解决方法支持通过纯 JS 处理这些图像,还是不可能?我的意思是调整大小并随后通过processingAJAX 请求发送有效负载。

我问这个是因为作为服务器端开发人员,我习惯于使用 Python 的 PIL 库将这些照片上传到服务器上,而RIFF 图像文件在那里可以完美地工作。JS 实现有什么不同,我该如何克服它?很想找出这一切背后的技术细节,并且需要一个说明性的例子。


如果有必要,以下是我分析文件头的方式:

0 投票
1 回答
80 浏览

c# - RIFF ICMT 标签大小似乎与数据不匹配

我正在尝试读取存储在由噪声监控设备生成的 WAV 文件上的 ICMT 标签中的数据。

RIFF 解析代码似乎工作正常,除了 ICMT 标签似乎在声明的大小之后有数据。幸运的是,它是时间戳,对于我的应用程序来说,这是一条绝对重要的信息。

SYN是十六进制 16,其大小为 22,最多包含时间戳之前的 NUL。监视器文档没有帮助;它说标签包括时间,但他们的例子也有同样的问题。

在此处输入图像描述

它是封闭列表中的最后一个标签,并且列表的大小确实包含它 - 这是否意味着它不需要块 ID?我正在努力寻找像样的 RIFF 文档,但我找不到任何表明这种情况的东西;我也看不出如何确定它是最后一个块,因此知道在没有块 ID 的情况下读取它。

或者,ICMT 注释块是文件中的最后一件事——这是特例吗?我可以通过阅读从声明长度 ICMT 末尾到文件末尾的所有内容来获取时间,并假设这将始终有效吗?

当前的解析器行为是在通道/dB信息作为块ID +大小之后读取它,然后抱怨文件中没有足够的数据来满足请求。

0 投票
1 回答
2531 浏览

wav - sox 生成的 wav 标头不正确

我正在使用 sox 将 2 个通道、48000Hz、24 位 wav 文件(new.wav)转换为单声道 wav 文件(post.wav)。以下是相关的命令和输出:

看起来不错。但是让我们检查一下 post.wav 的标题:

这是标准的 wav 文件头结构

第一行没有问题。

第二行“2800 0000”显示子块“fmt”的大小,它应该是0x00000028(因为这是小端)= 40字节。但是有 54 个字节(在子块“fmt”和子块“数据”之前)。

第三行显示“ExtraParamSize”为 0x0018 = 22 字节。但实际上它是 36 个字节(从第三行的“1600”到第五行的“0100”)。前 16 个字节是标准的。

那么额外的 36 个字节是多少呢?