我正在将音频文件以WAVE 格式实时写入 SD/MMC 存储卡,在ARM 板上工作。所述卡是(并且必须保持)FAT32 格式。只要我事先知道要写多少,我就可以写一个有效的 WAVE 文件。
我希望能够将占位符数据放在 RIFF 和数据块的块数据大小字段中,写入我的音频数据,然后返回并更新这两个块中的块数据大小字段,以便它们具有正确的值,但是...
我有一个工作文件系统和一些 stdio 函数,但有一些警告:
- fwrite() 支持
r
、w
和a
,但不支持任何+
模式。 - fseek() 在写入模式下不起作用。
我没有编写上述函数的实现(我使用的是 ARM 的 RL-FLashFS),我不确定限制/部分实现的理由是什么。个人添加缺少的功能可能是一种选择,但如果可能的话,我想避免它(我对这些功能没有其他需要,不要预见任何功能,也不能在上面花费太多时间。)切换到不同的实现也不是这里的选择。
我的可用内存非常有限,我不知道会收到多少音频数据,但几乎可以肯定它会超过我在任何时候都可以保存在内存中的数据。
我可以写一个包含原始交错音频数据的文件,同时跟踪我写了多少字节,关闭它,然后再次打开它进行读取,打开第二个文件进行写入,将标题写入第二个文件,然后复制音频数据结束。也就是说,我可以将其后处理为格式正确的有效 WAVE 文件。我已经这样做了,而且效果很好。但我想尽可能避免对大量数据进行后处理。
也许我可以以某种方式连接两个文件?(即写入数据,然后将块写入一个单独的文件,然后将它们加入文件系统,避免花费大量时间复制潜在的大量数据。)我对此的理解是,如果可能的话,它仍然会涉及由于存储的块方向,一些复制。
建议?
编辑:我真的应该提到这一点,但这里没有运行操作系统。我在硬件抽象层之上运行了一些 stdio 函数,仅此而已。