读取.wav文件的标记

10
2个回答

5
编辑:这里是更新版本的scipy.io.wavfile,它添加了许多功能(支持读/写24位.wav文件、提示标记、提示标记标签以及一些其他元数据,如音高(如果定义)等):

wavfile.py(增强版)

欢迎分享!


我终于找到了一个解决方案(它使用了scipy.io.wavfile的一些函数):

def readmarkers(file, mmap=False):
    if hasattr(file,'read'):
        fid = file
    else:
        fid = open(file, 'rb')
    fsize = _read_riff_chunk(fid)
    cue = []
    while (fid.tell() < fsize):
        chunk_id = fid.read(4)
        if chunk_id == b'cue ':
            size, numcue = struct.unpack('<ii',fid.read(8))
            for c in range(numcue):
              id, position, datachunkid, chunkstart, blockstart, sampleoffset = struct.unpack('<iiiiii',fid.read(24))
              cue.append(position)
        else:
            _skip_unknown_chunk(fid)
    fid.close()
    return cue

如果有人感兴趣,可以随意将其添加到Scipy的wavfile.py中。


很好!谢谢分享。 - loopbackbee
我的标记是“范围”类型的(id,start,end,duration?)。使用您的函数,我只能读取每个范围的起始位置。如何修改您的函数以使其适用于范围? - Eric
这是我使用的参考文献:http://www.sonicspot.com/guide/wavefiles.html... 存储了哪些“range”类型的标记?在“Cue Chunk”(http://www.sonicspot.com/guide/wavefiles.html#cue)还是“Playlist Chunk”(http://www.sonicspot.com/guide/wavefiles.html#plst)中? - Basj
如果有帮助的话,你的代码对我来说运行良好,但在_skip_unknown_chunk中引发了一个异常,因为它找到了无法读取的内容。由于这是在正确读取标记后发生的,所以我只是在for循环之后添加了一个break :)(我使用Adobe Audition添加了标记) - wizbcn
这个是否曾经提交给Scipy? - endolith
是的,它在这里:https://github.com/scipy/scipy/pull/6852 还有另一个版本在这里 https://github.com/X-Raym/wavfile.py - endolith

-2

2
我真的不明白为什么这不会引发“NotImplemented”异常。 - loopbackbee
如果你想自己实现这个功能,这里有很多好的信息(请参阅关于提示点的部分):http://home.roadrunner.com/~jgglatt/tech/wave.htm。顺便说一句,这对你可能有用。 - loopbackbee
我还没有足够的技能来自己打开文件、跳转到特定位置、提取块等操作。对于NotImplemented,我们如何将其设置为状态NotImplemented - Basj
你认为你能帮我吗,@goncalopp? - Basj
1
@Basj 我现在没有太多时间,也没有已知标记的波形文件。如果你能给我发送一个,我可能需要一两天时间来想出一些东西。否则,这是一个学习openfilesstruct的绝佳机会。 - loopbackbee
这就是我最终所做的,我在开放、文件和结构方面学到了很多有趣的东西!(请查看我的答案) - Basj

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