Интерпретация данных WAV

Я пытаюсь записать программу для отображения данных PCM. Я был очень расстроен, пытаясь найти библиотеку с правильным уровнем абстракции, но я нашел библиотеку волны Python и использовал это. Однако я не уверен, как интерпретировать данные.

wave.getparams функционируют возвраты (2 канала, 2 байта, 44 100 Гц, 96 333 кадра, Никакое сжатие, Никакое сжатие). Это все кажется радостным, но затем я пытался печатать единственный кадр: '\xc0\xff\xd0\xff', который составляет 4 байта. Я предполагаю, что возможно, что кадр является 2 образцами, но неоднозначности не заканчиваются там.

96 333 кадра * 2 образца/кадра * (1/44.1k секунда/образец) = 4,3688 секунды

Однако iTunes сообщает о времени как ближе к 2 секундам, и вычисления на основе размера файла и скорости передачи находятся на приблизительной оценке 2,7 секунд. Что продолжается здесь?

Кроме того, как я должен знать, подписываются ли байты или не подписаны?

Большое спасибо!

7
задан SapphireSun 9 February 2010 в 05:01
поделиться

5 ответов

Мое (по общему признанию, ограниченное) понимание до сих пор это было, если имя переменной указано в маршруте, который соответствует указано в действии контроллера определение, оно будет предполагать, что независимо от порядка.

Привязка значений маршрута к аргументам действия происходит ПОСЛЕ того, как рамка определит, какой маршрут использовать. Выбор маршрута выполняется с использованием эвристики «first match wins»: используется первый маршрут, который может успешно соответствовать входящему запросу, даже если «лучший» маршрут был определен позже.

Решение Майкла правильное. Сначала необходимо вывести маршрут по умолчанию, используя ограничения маршрута для сопоставления только URL-адресов с числовым идентификатором. Ваш второй, менее ограничительный маршрут должен быть следующим.

ПРИМЕЧАНИЕ : Если вы будете следовать решению Майкла, у вас возникнут проблемы, если у вас есть пользователи с именем пользователя, состоящим только из цифр. Вы можете подумать о том, чтобы добавить какой-то другой фактор различения к маршрутам, например, поставить ключевое слово «пользователь» во 2-м:

routes.MapRoute(
    "Default", "{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = "0" },
    new { id = @"\d+" } 
 );

routes.MapRoute(
    "CustomerView", "{controller}/{action}/user/{username}",
    new { controller = "Home", action = "Index", username = "" }
);
-121--4195990-

ну, ответ Геннадия С. это то, что я бы использовал для решения вашей проблемы.

Я пишу программу на Java, которая требует от меня сравнить данные в 2 файлах

, однако я бы предпочел не кодировать это снова.. Я бы предпочел использовать что-то вроде http://code.google.com/p/java-diff-utils/

-121--2809792-

«Два канала» означает стерео, поэтому нет смысла суммировать длительность каждого канала - так что вы выключены в два раза (2,18 секунд, не 4,37). Что касается signedness, как объясняется, например, здесь , и я цитирую:

8-битные выборки хранятся как неподписанные байт, в диапазоне от 0 до 255. 16-битный образцы хранятся в виде 2-х дополнений целые числа со знаком, в диапазоне от -32768 до 32767.

Это часть спецификаций формата WAV (фактически его супернабора RIFF) и, таким образом, не зависит от того, какую библиотеку вы используете для работы с WAV-файлом.

9
ответ дан 6 December 2019 в 05:08
поделиться

Спасибо за вашу помощь! У меня все заработало, и я отправлю решение здесь, чтобы все могли использовать его на случай, если это понадобится какой-то другой бедняге:

import wave
import struct

def pcm_channels(wave_file):
    """Given a file-like object or file path representing a wave file,
    decompose it into its constituent PCM data streams.

    Input: A file like object or file path
    Output: A list of lists of integers representing the PCM coded data stream channels
        and the sample rate of the channels (mixed rate channels not supported)
    """
    stream = wave.open(wave_file,"rb")

    num_channels = stream.getnchannels()
    sample_rate = stream.getframerate()
    sample_width = stream.getsampwidth()
    num_frames = stream.getnframes()

    raw_data = stream.readframes( num_frames ) # Returns byte data
    stream.close()

    total_samples = num_frames * num_channels

    if sample_width == 1: 
        fmt = "%iB" % total_samples # read unsigned chars
    elif sample_width == 2:
        fmt = "%ih" % total_samples # read signed 2 byte shorts
    else:
        raise ValueError("Only supports 8 and 16 bit audio formats.")

    integer_data = struct.unpack(fmt, raw_data)
    del raw_data # Keep memory tidy (who knows how big it might be)

    channels = [ [] for time in range(num_channels) ]

    for index, value in enumerate(integer_data):
        bucket = index % num_channels
        channels[bucket].append(value)

    return channels, sample_rate
19
ответ дан 6 December 2019 в 05:08
поделиться

Я знаю, что ответ уже принят, но Некоторое время назад я проделал кое-что со звуком, и вам нужно распаковать волну, выполнив что-то вроде этого.

pcmdata = wave.struct.unpack("%dh"%(wavedatalength),wavedata)

Кроме того, один пакет, который я использовал, назывался PyAudio, хотя мне все еще приходилось использовать с ним пакет wave.

4
ответ дан 6 December 2019 в 05:08
поделиться

Каждая выборка состоит из 16 бит и имеет 2 канала, поэтому кадр занимает 4 байта

2
ответ дан 6 December 2019 в 05:08
поделиться

Продолжительность - это просто количество кадров, деленное на количество кадров в секунду. По вашим данным это: 96333/44100 = 2,18 секунды .

2
ответ дан 6 December 2019 в 05:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: