python - 将数据附加到波形声音文件而不加载其当前内容

标签 python audio wave

我正在尝试将数据附加到声音文件而不加载其内容(因为它可能有千兆字节的数据),我目前正在使用 pysoundfile 库,我已经找到了一种方法来为 wave64 做这件事,但是在 wav 中,由于某种原因它会抛出错误。

根据 pysoundfile 文档,当使用文件描述符打开 SoundFile 时,它​​应该在不截断的情况下写入,这就是我目前正在做的事情

    fd = open('foo.wav',mode='ab')
    with sf.SoundFile(fd, mode = 'w', samplerate = self._samplerate,channels = self._channels, format = 'wav') as wfile:
        wfile.seek(0,sf.SEEK_END)
        wfile.write(self._samples)
        wfile.close()
    fd.close()

当我使用 wave 文件类型时,出现以下错误:

RuntimeError: Error opening <_io.BufferedWriter name='../datasets/emddf_clean/qcoisa.wav'>: Unspecified internal error.

但是对于以 w64 格式格式化的文件,它以某种方式工作...... 如果有人能对我有所启发,那将是惊人的, 提前致谢!

最佳答案

我成功地做了我想做的,没有显式地使用文件描述符:

    with sf.SoundFile(path['full_path'], mode = 'r+') as wfile:
        wfile.seek(0,sf.SEEK_END)
        wfile.write(self._samples)

如果文件处于r+模式(读/写),它支持查找,这意味着我们可以指向文件的末尾允许追加。 唯一的问题是,如果该文件不存在,它会抛出一个错误,但您可以通过执行以下操作轻松修复它:

    if(self.mode == my_utils.APPEND and os.path.isfile(path['full_path'])):
        with sf.SoundFile(path['full_path'], mode = 'r+', samplerate = samplerate) as wfile:
            wfile.seek(0,sf.SEEK_END)
            wfile.write(self.file.getSamples())
    else:
        sf.write(path['full_path'], self.file.getSamples(), samplerate,format=path['extension']) # writes to the new file 
    return

希望我说清楚并帮助别人!

关于python - 将数据附加到波形声音文件而不加载其当前内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56058997/

相关文章:

python-2.7 - 24位深的WAV文件生成器

java - 无法读取 MP3 帧头字节?

python - 查找关键字符之间的单词模式

python - 如何编写多频音频文件?

IO 直接从 UDP 流 (NSData) 播放原始音频

JavaScript 预加载音频

python - 波形文件如何存储多个 channel ?

python - 计算复杂度

python - 使用 Pybind11 包装 STL 容器返回类型

Python:为什么 “~” 现在包含在 urllib.parse.quote() 的保留字符集中?