Узнать продолжительность WAV

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
AD'onis
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 50
Зарегистрирован: 05.10.2006 (Чт) 20:19
Откуда: не секрет, я б сказал, но забаннят

Узнать продолжительность WAV

Сообщение AD'onis » 06.09.2007 (Чт) 11:14

Доброго времени суток!
Хочу задать следующий вопрос: Можно ли (и если можно, то как) узнать продолжительность WAV-файла? По поиску не нашел, может и смотрел криво, если что не судите слишком строго :). Спасибо.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 06.09.2007 (Чт) 12:39

А что внутри WAV? Какой кодек?
Как правило, длительность указывается в заголовке.
Lasciate ogni speranza, voi ch'entrate.

CodeName33
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 297
Зарегистрирован: 01.09.2004 (Ср) 13:25
Откуда: SPb

Сообщение CodeName33 » 06.09.2007 (Чт) 14:28

Что то типа такого

Код: Выделить всё
Private Type WAVEFORMAT
  wFormatTag As Integer
  nChannels As Integer
  nSamplesPerSec As Long
  nAvgBytesPerSec As Long
  nBlockAlign As Integer
  nBitsPerSample As Integer
End Type

Public Function GetWaveInfo(FileName As String, Optional Channels As Long, Optional Freq As Long, Optional BytePerSec As Long, Optional fInfo As String, Optional Bits As Long) As Byte
Dim F As Long, L As Long, S As String, fPos As Long, W As WAVEFORMAT
F = FreeFile
Open FileName For Binary Access Read As F

  S = Input$(4, F)
  If Not S = "RIFF" Then Exit Function
 
  fPos = 5
  Get F, fPos, L
  fPos = fPos + 4
  fPos = fPos + 4 'WAVE
  fPos = fPos + 4 'fmt_
  Get F, fPos, L
  fPos = fPos + 4
  Get F, fPos, W
  Channels = W.nChannels
  Freq = W.nSamplesPerSec
  BytePerSec = W.nAvgBytesPerSec
  Select Case W.nBitsPerSample
    Case 8, 16, 32
      Bits = W.nBitsPerSample
  End Select
 
  fInfo = GetFormatInfo(W.wFormatTag)
 
Close F
GetWaveInfo = 1
End Function

Private Function GetFormatInfo(code As Integer) As String
Select Case code
  Case 1: GetFormatInfo = "Windows PCM"
  Case 2: GetFormatInfo = "Microsoft ADPCM"
  Case 6: GetFormatInfo = "a-Law"
  Case 7: GetFormatInfo = "u-Law"
  Case 10: GetFormatInfo = "OKI ADPCM"
  Case 11: GetFormatInfo = "IMA ADPCM"
  Case 12: GetFormatInfo = "MediaSpace ADPCM"
  Case 13: GetFormatInfo = "Sierra ADPCM"
  Case 14: GetFormatInfo = "GSM 7.23 ADPCM"
  Case 49: GetFormatInfo = "GSM 6.10"
  Case 64: GetFormatInfo = "GSM 7.21 ADPCM"
  Case 65: GetFormatInfo = "GSM 7.28 CELP"
  Case 80: GetFormatInfo = "MPEG"
  Case 85: GetFormatInfo = "MPEG Layer 3 <MP3>"
  Case 96: GetFormatInfo = "Cirrus"
  Case 98: GetFormatInfo = "Voxvare"
  Case 100: GetFormatInfo = "GSM 7.26 ADPCM"
  Case 101: GetFormatInfo = "GSM 7.23 ADPCM"
  Case 353: GetFormatInfo = "DivX WMA V2"
End Select
End Function


Зная размер файла и BytePerSec можно вычислить его примерную длину +/- несколько сек
Программисты не глючат - глючат компиляторы...

AD'onis
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 50
Зарегистрирован: 05.10.2006 (Чт) 20:19
Откуда: не секрет, я б сказал, но забаннят

Сообщение AD'onis » 06.09.2007 (Чт) 18:43

Спасибо за ответы. Но ведь есть же более простые способы? Каким образом стандартная "звукозапись" узнает длительность файла?
Ну, предположим, что файл сжат PCM, 22 050 кГц, 16 бит, стерео. Т.е. имеем конкретное качество. Ведь можно же точно узнать его длительность вплоть до миллисекунд. Я конечно понимаю, что и это выход, но хотелось бы конкретно :)
З.Ы. А все равно спасибо за ответы и код

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 06.09.2007 (Чт) 19:15

AD'onis писал(а):Спасибо за ответы. Но ведь есть же более простые способы? Каким образом стандартная "звукозапись" узнает длительность файла?
Ну, предположим, что файл сжат PCM, 22 050 кГц, 16 бит, стерео. Т.е. имеем конкретное качество. Ведь можно же точно узнать его длительность вплоть до миллисекунд. Я конечно понимаю, что и это выход, но хотелось бы конкретно :)
З.Ы. А все равно спасибо за ответы и код

Кхм.. Это тебе и есть способ, которым "стандартные" проигрыватели узнают длительность. Точнее, это способ упрощенный.
А проигрыватели еще учитывают внутренний формат RIFF-файла, тот факт, что внутри может быть не только музыка, несколько дорожек, может использоваться сжатие, и.т.д..

Причем AvgBytesPerSec - это Average Bytes. То есть "В среднем".
Соответственно, точно ты узнаешь длину файла только распарсив его целиком.

Вот формат:
http://www.codenet.ru/progr/formt/rawsam.php
Последний раз редактировалось iGrok 06.09.2007 (Чт) 19:26, всего редактировалось 1 раз.
label:
cli
jmp label

AD'onis
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 50
Зарегистрирован: 05.10.2006 (Чт) 20:19
Откуда: не секрет, я б сказал, но забаннят

Сообщение AD'onis » 06.09.2007 (Чт) 19:20

iGrok
Ясненько, учту, спасибо за объяснение :)

CodeName33
Спасибо за код, сейчас его оттестил: взял файл на 23 с лишним минуты. Реальная ошибка составила всего 0,1 секунды (!). Этого мне более, чем достаточно :) Спасибо :cheers:


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Majestic-12 [Bot], Yandex-бот и гости: 103

    TopList