在不加载当前内容的情况下向波形声音文件追加数据

5

我试图将数据追加到声音文件中,而不加载其内容(因为它可能有数千兆字节的数据),目前我正在使用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格式的文件就可以解决问题了... 如果有人能够给我指点一下,那就太棒了, 提前感谢!

1个回答

3
我成功地做到了我想要的事情,而不需要显式地使用文件描述符:
    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

希望我表述清晰有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接