Я пытаюсь записать программу для отображения данных 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 секунд. Что продолжается здесь?
Кроме того, как я должен знать, подписываются ли байты или не подписаны?
Большое спасибо!
Мое (по общему признанию, ограниченное) понимание до сих пор это было, если имя переменной указано в маршруте, который соответствует указано в действии контроллера определение, оно будет предполагать, что независимо от порядка.
Привязка значений маршрута к аргументам действия происходит ПОСЛЕ того, как рамка определит, какой маршрут использовать. Выбор маршрута выполняется с использованием эвристики «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-файлом.
Спасибо за вашу помощь! У меня все заработало, и я отправлю решение здесь, чтобы все могли использовать его на случай, если это понадобится какой-то другой бедняге:
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
Я знаю, что ответ уже принят, но Некоторое время назад я проделал кое-что со звуком, и вам нужно распаковать волну, выполнив что-то вроде этого.
pcmdata = wave.struct.unpack("%dh"%(wavedatalength),wavedata)
Кроме того, один пакет, который я использовал, назывался PyAudio, хотя мне все еще приходилось использовать с ним пакет wave.
Каждая выборка состоит из 16 бит и имеет 2 канала, поэтому кадр занимает 4 байта
Продолжительность - это просто количество кадров, деленное на количество кадров в секунду. По вашим данным это: 96333/44100 = 2,18 секунды
.