Войти
ПрограммированиеФорумЗвук

Длина WAV в секундах по размеру файла

#0
1:52, 1 авг. 2009

может я не "в теме"...
никто не сталкивался? есть какие-то общие алгоритмы для подсчета длительности записи WAV относительно байтов?
мм... то-бишь, что бы такое-эдакое провернуть с (вместо % подставить нужное):

размер файла (-44 заголовок) % битрейт % сэмплов в секунду % кол-во каналов = длина в секундах.

в WAV-формате не разбирался особо, он у меня вскользь проходит... в частности меня интересует A-Law (телефония). это если есть разница между PCM/u-Law/A-Law.
сразу говорю - в гугле долго сидел. времени больше нет на поиски.


#1
2:09, 1 авг. 2009

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

#2
9:38, 1 авг. 2009

batment,

та у меня есть описание формата... RIFF, чанки, чанки... :)
уверен, найти решение можно.
просто спрашиваю, может есть что попроще? вот знаешь размер файла, качество записи, битрейт... как, типа, не обращаясь к внутреннему устройству WAV'ки?
там же сжатия нет... ну как в битмапе, знаешь его характеристики - можно посчитать размер файла.

#3
11:23, 1 авг. 2009

Тогда найди какую-нибудь готовую библиотечку.

#4
11:38, 1 авг. 2009

batment

в принципе - вариант... у меня скриптовая система IVR... она может обращаться к COM-обеъктам... вызывать exe-шники - крайне нежелательно, подключить dll - невозможно.

мне в БД писать длину записей надо.

можно и считать на момент записи: разницу времени начала/конца (а сейчас это и реализовано), но часть записей попадает другим путем, плюс, другие исключительные ситуации.

просто думаю, что есть простая возможность - легко и просто считать по размеру файла. о чем и спрашиваю.

#5
13:40, 1 авг. 2009

Как то так. Это в милисекундах


WAVEFORMATEX *pwfxSrc;
.....
  if (pwfxSrc->wFormatTag == WAVE_FORMAT_PCM)
  {
    dwSamples = m_dwDataSize / (pwfxSrc->nChannels * pwfxSrc->wBitsPerSample / 8);
  }
  else
  {
    dwSamples = m_dwDataSize / pwfxSrc->nAvgBytesPerSec * pwfxSrc->nSamplesPerSec;
  }

m_nTrackTime = (DWORD)((UINT64)dwSamples * 1000 / pwfxSrc->nSamplesPerSec);

#6
10:22, 3 авг. 2009

ITALY

вот почему-то на практике не сходится никак...

#7
10:58, 3 авг. 2009

_g
Хз, код из готового по сути проекта, используется каждый день, пока все четко.

Правка: еще там есть код для обработки "Fact chunk", All (compressed) non-PCM formats must have a Fact chunk (Rev. 3 documentation). The chunk contains at least one value, the number of samples in the file. © (http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html). В этом случае количество сэмплов берется оттуда а не высчитывается.

#8
13:46, 3 авг. 2009

ITALY

у меня все файлы 8 гц / 8 или 16 бит / 11 кб.сек / моно / aLaw...

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

думаю, путаюсь по данным:
pwfxSrc->nAvgBytesPerSec - есть кб. сек (что в моем случае 11025)?
что есть pwfxSrc->nSamplesPerSec..?

к примеру, у меня файлы: 42870 в байтах, запись 5,350 секунд (в том же формате 8/8/11/моно) и произвольный 235990 байт (44100гц/16 бит/352кб.сек/моно)
что куда подставлять? как я ни пробовал... результат - черти-что.

не, понимаю, надо разбираться с WAV. понимаю, что прошу готовое решение. будь время, написал бы COM для подсчета WAV по заголовку, как ты показал... дык. сроки у меня... успеть бы логику сервиса реализовать... :)

%)))

Правка: непомерно туплю от перетруженности :). ведь можно заголовок вычитать заранее, на С... поскольку качественно - все записи с входящего звонка одинаковые. вопрос в другом, нет ли подводных камней? может все-таки будет разница в каких-то характеристиках (как я написал, не понял ничего, что и какой параметр по приведенной формуле значит :-[ )?

#9
15:42, 3 авг. 2009

_g
http://msdn.microsoft.com/en-us/library/ms713497(VS.85).aspx

Для первого файла:
dwSamples = m_dwDataSize / (pwfxSrc->nChannels * pwfxSrc->wBitsPerSample / 8);
dwSamples = 42870 / (1 * 8 / 8) == 42870;

m_nTrackTime = (DWORD)((UINT64)dwSamples * 1000 / pwfxSrc->nSamplesPerSec);
m_nTrackTime = (42870 * 1000 / 8000) == 5,358 секунд

Для закодированного aLaw я так полагаю нужно будет брать кол-во сэмлов из чанка "fact" (cм мой прошлый пост)

Правка: 5,358 а не 5,350 может быть либо от погрешности какойто, либо от того что ты неправильно определяешь размер данных.

#10
16:29, 3 авг. 2009

ITALY

> Для первого файла:
> dwSamples = m_dwDataSize / (pwfxSrc->nChannels * pwfxSrc->wBitsPerSample / 8);
>
> dwSamples = 42870 / (1 * 8 / 8) == 42870;
>
> m_nTrackTime = (DWORD)((UINT64)dwSamples * 1000 / pwfxSrc->nSamplesPerSec);
> m_nTrackTime = (42870 * 1000 / 8000) == 5,358 секунд
>
> Для закодированного aLaw я так полагаю нужно будет брать кол-во сэмлов из чанка
> "fact" (cм мой прошлый пост)

так в чем и дело, что оно и есть - aLaw. этот самый первый файл. по формуле должно быть что после else?

> Правка: 5,358 а не 5,350 может быть либо от погрешности какойто, либо от того что ты неправильно определяешь размер данных.

я это не подсчетом получил. это в плеере и Cool Edit так написано... может округляют... так мне и надо - в секундах.

спасибо за информацию! суть уловил!

#11
16:44, 3 авг. 2009

_g
>>> так в чем и дело, что оно и есть - aLaw. этот самый первый файл. по формуле должно быть что после else?

Нет, во всяком случае в том месте где я стырил этот код, dwSamples берется, как я и говорил в прошлом и позапрошлом постах, из чанка "fact" у wav файла. Данные 2 формулы в таком случае не нужны, считается только m_nTrackTime сразу. Возможно это и необязательно, раз ответ совпал и так, а возможноможет вылезти какаянить бяка, этого я уже не могу сказать.

#12
18:20, 3 авг. 2009

ITALY

спасибо!


мне еще вариант подсказали (вроде как практикуемый), для ALaw:

(filesize - 44 (header)) /  (битрейт (если 8=1/если 16=2) * samples per second (8000/11020) * кол-во каналов(mono/stereo)) = длина в секундах.

что больше запутывает ситуацию... %)

вывод: надо мне-таки изучать устройство WAV-формата. :)

в итоге, я беру время в начале и конце записи - вычисляю интервал. плюс, считаю "только m_nTrackTime сразу" - на иные WAV'ки...

ПрограммированиеФорумЗвук

Тема в архиве.