问题标签 [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.
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 文件。
wav - RIFF 文件格式标准是否有任何现代替代方案?
我喜欢 RIFF 标准,但我不喜欢文件长度限制为 4GB。是否有一个很好的现代文件格式标准来存储像 RIFF 这样的二进制数据?
我看到对于长 WAV 文件,Adobe 程序基本上只会忽略文件长度字节,但如果我正在制作新的文件格式,只包含字节而不使用它们似乎很奇怪。如果 RIFF 通常以现代格式不受欢迎,或者不?
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
这样的一些等效无用的接口无论如何都需要转换)?
子格式类的来源
对于那些对子格式类感兴趣的人,这里有一些示例来证明它们除了使用stream
andread()
方法之外没有任何共同点:
javascript - 在 JS 中创建 .wav 文件 - “不是 WAVE 文件 - 没有 RIFF 头”
我正在尝试从浏览器的麦克风录制音频,并将其保存为 .wav 文件(发送到 API)
我有我所追求的二进制块,我可以将它转换为在 VLC(以及浏览器)中播放的 .wav 文件
但是当我尝试将其发送到http://www.beyondverbal.com/api/时,我收到
本质上的问题是,我怎样才能添加我需要的 RIFF 标头,或者我完全错了?
谢谢
php - 生成 WAV 并添加第二个(立体声)通道
我在stackoverflow上发现了以下令人难以置信的代码。请任何人都可以帮我添加第二个频道(立体声)
将有 nchannels = 2 必须(以某种方式)增加文件大小,并且必须添加 2. 数组(即 samples2)。
当我尝试时,我只会达到更高的频率。
非常感谢来自德国:马丁
javascript - 我有一个以 RIFF 编码的文件。如何通过 ajax 发布响应发送此文件?
我试图保留文件的 RIFF 编码,同时将其作为响应发送回来,如下所示。
当我收到来自我的 AJAX 调用的响应并检查它是 ASCII 格式的响应时。我试图将 readFileSync 的编码更改为 utf8,但这不起作用。我怎样才能做到这一点?
javascript - 以“RIFF(小端)数据”类型的纯 Javascript 处理图像文件
这些天我是一名服务器端开发人员,正在学习纯 JS 的技巧。我正在研究的一个实际例子是图像处理。
这个问题是关于探索如何支持加载(在纯 JS 中)类型为RIFF (little-endian) data
. 有关该文件类型的更多信息在这里。
例如,如果将这样的文件类型呈现给以下代码,则它永远不会加载和onerror
触发:
此外,如果通过 分析文件头readAsArrayBuffer
,则返回的头签名是52494646
(这既不是 PNG、GIF 也不是 JPEG)。更有趣的是,我尝试上传一个示例 .avi 视频文件(也是 RIFF 格式)。这同样具有相同的标头签名。
也就是说,通过header分析我无法判断它是否是一个图像文件。
我的问题是:是否有任何解决方法支持通过纯 JS 处理这些图像,还是不可能?我的意思是调整大小并随后通过processing
AJAX 请求发送有效负载。
我问这个是因为作为服务器端开发人员,我习惯于使用 Python 的 PIL 库将这些照片上传到服务器上,而RIFF 图像文件在那里可以完美地工作。JS 实现有什么不同,我该如何克服它?很想找出这一切背后的技术细节,并且需要一个说明性的例子。
如果有必要,以下是我分析文件头的方式:
c# - RIFF ICMT 标签大小似乎与数据不匹配
我正在尝试读取存储在由噪声监控设备生成的 WAV 文件上的 ICMT 标签中的数据。
RIFF 解析代码似乎工作正常,除了 ICMT 标签似乎在声明的大小之后有数据。幸运的是,它是时间戳,对于我的应用程序来说,这是一条绝对重要的信息。
SYN
是十六进制 16,其大小为 22,最多包含时间戳之前的 NUL。监视器文档没有帮助;它说标签包括时间,但他们的例子也有同样的问题。
它是封闭列表中的最后一个标签,并且列表的大小确实包含它 - 这是否意味着它不需要块 ID?我正在努力寻找像样的 RIFF 文档,但我找不到任何表明这种情况的东西;我也看不出如何确定它是最后一个块,因此知道在没有块 ID 的情况下读取它。
或者,ICMT 注释块是文件中的最后一件事——这是特例吗?我可以通过阅读从声明长度 ICMT 末尾到文件末尾的所有内容来获取时间,并假设这将始终有效吗?
当前的解析器行为是在通道/dB信息作为块ID +大小之后读取它,然后抱怨文件中没有足够的数据来满足请求。
wav - sox 生成的 wav 标头不正确
我正在使用 sox 将 2 个通道、48000Hz、24 位 wav 文件(new.wav)转换为单声道 wav 文件(post.wav)。以下是相关的命令和输出:
看起来不错。但是让我们检查一下 post.wav 的标题:
第一行没有问题。
第二行“2800 0000”显示子块“fmt”的大小,它应该是0x00000028(因为这是小端)= 40字节。但是有 54 个字节(在子块“fmt”和子块“数据”之前)。
第三行显示“ExtraParamSize”为 0x0018 = 22 字节。但实际上它是 36 个字节(从第三行的“1600”到第五行的“0100”)。前 16 个字节是标准的。
那么额外的 36 个字节是多少呢?