2013-11-15 2 views
6

Я хотел бы использовать маркеры в .wav-файлах.читать маркеры .wav-файла

Это, кажется, поддерживается aifc модулем с getmarkers(): http://docs.python.org/2/library/aifc.html#aifc.aifc.getmarkers (для .aiff файлов), но не для wave модуля (http://docs.python.org/2/library/wave.html?highlight=wave#wave.Wave_read.getmarkers).

Как мы можем читать маркеры .wav файлов?

ответ

3

Edit: вот обновленная версия scipy.io.wavfile, что добавляет много вещей (.wav файлы 24 бит поддержки для чтение/запись, маркеры разметки, маркеры разметки этикеток, а также некоторые другие метаданные, как шаг (если они определены), и т.д.):

wavfile.py (enhanced)

Не стесняйтесь поделиться!


я наконец-то нашел решение (он использует некоторую функцию 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 

Не стесняйтесь, чтобы добавить его в wavfile.py SciPy, если кто-то заинтересован.

+0

Ницца! Спасибо за обмен – goncalopp

+0

Мои маркеры имеют тип 'range' (id, start, end, duration?). С вашей функцией я могу читать только начальную позицию каждого диапазона. Как я могу изменить вашу функцию, чтобы заставить ее работать и на диапазон? – Eric

+0

Это ссылка, которую я использовал: 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

-1

это в модулях wave.Wave_read, называется Wave_read.getmarkers() увидеть документы для деталей: http://docs.python.org/2/library/wave.html?highlight=wave#wave.Wave_read.getmarkers

+0

'Wave_read.getmarkers()': Возвращает None. – Basj

+1

Я, честно говоря, не понимаю, почему это не поднимает «NotImplemented» вместо – goncalopp

+0

FWIW, если вы хотите реализовать это самостоятельно, есть много хорошей информации [здесь] (http://home.roadrunner.com/~jgglatt /tech/wave.htm) (см. раздел о ключевых точках) – goncalopp