Срочно! Нужна помощь с WAV-файлами!

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Срочно! Нужна помощь с WAV-файлами!

Сообщение hCORe » 30.12.2003 (Вт) 13:37

Вкратце излагаю суть дела. Я создаю программу, которая в процессе работы создает несколько файлов в папке Temp с именами
<имя заданного файла>_tmp<номер записанного файла>.wav
например, beethoven01_tmp0.wav

После этого вызывается процедура ConcatenateFiles, которая в зависимости от параметра бинарно соединяет звуковые файлы в один. Однако при проигрывании (несмотря на присутствие данных из других файлов) слышны только данные из самого первого файла. Размер полученного соединением звукового файла равен суммарному размеру всех соединяемых файлов, но проигрывается только первый из них :cry: Что делать? Может быть есть специализированные функции для соединения звуковых данных в формате WAV?

ЗЫ. Пробовал отрезать "передний кусок" данных файлов, идущих за самым первым (содержит подпись RIFF...WaveFMT) и удалять последнюю тысячу байт (содержит пустые данные) в тех же самых файлах. Результат - нуль :evil:

Вот код самой процедуры:

Код: Выделить всё
Public Sub ConcatenateFiles(DestFileName As String, FileNumber)
On Error Resume Next
    Err.Clear
    Dim tmpDir As String
    Dim SourceArray() As Byte
    Dim DestArray() As Byte
    tmpDir = Environ("TEMP")
    If Len(Trim(tmpDir)) = 0 Then tmpDir = Environ("TMP")
    If Len(Trim(tmpDir)) = 0 Then
        tmpDir = "C:\Temp\"
    End If
    If Mid(tmpDir, Len(tmpDir), 1) <> "\" Then tmpDir = tmpDir & "\"
    tmpDir = tmpDir & "PROG123.TMP\"
    Err.Clear
    Close #1
    Open DestFileName For Binary As #1
    For i = 0 To FileNumber
        DoEvents
        Open tmpDir & _
        Mid(GetFileNameIN(DestFileName), 1, _
        Len(GetFileNameIN(DestFileName)) - 4) & _
        "_tmp" & Trim(Str(i)) & ".wav" For Binary As #2
        ReDim SourceArray(LOF(2) + 1)
        Get #2, , SourceArray()
        xi = UBound(DestArray)
        Err.Clear
        If xi = 0 Then
            xi = 0
            ReDim DestArray(UBound(SourceArray))
        Else
            ReDim Preserve DestArray(xi + UBound(SourceArray))
        End If
        xx = 0
        For inx = xi To xi + UBound(SourceArray)
        DoEvents
            If xi <> 0 And xx = 0 Then xx = 42
            If (xi + UBound(SourceArray)) - xx <= 1000 Then
                ReDim Preserve DestArray(inx)
                Exit For
            End If
            DestArray(inx) = SourceArray(xx)
            xx = xx + 1
        Next inx
        Close #2
    Next i
    Put #1, , DestArray()
    Close #1
End Sub


ЗЗЫ. При соединении утилитой copy из командной строки Windows XP результат такой же.

ЗЗЗЫ. Заранее спасибо за любую помощь в этом деле :wink:
Моду создают модоки, а распространяют модозвоны.

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

Сообщение alibek » 30.12.2003 (Вт) 16:21

Когда-то хотел сделать класс для работы с WAV-файлами, но дела, дела... Вообщем забросил. Но кое-что есть (структура)
Код: Выделить всё
Option Explicit

'Заголовок RIFF файла
Private Type wavHeaderType
  wtID As String * 4                   ' идентификатор файла = "RIFF" = 0x46464952
  wtLength As Long                     ' длина файла без этого заголовка
End Type

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

'Заголовок куска WAV
Private Type wavPartHeaderType
  wtID As String * 4                   ' идентификатор = "WAVE" = 0x45564157
  wtFormat As String * 4               ' идентификатор = "fmt " = 0x20746D66
  wtLength As Long                     ' длина этого куска WAV - файла
End Type

'За ним непосредственно кусок WAV
Private Type wavPartType
  wtType As Integer                    ' тип звуковых данных (wavDataTypeEnum)
  wtChannels As Integer                ' число каналов (1, 2)
  wtSamplesPerSec As Long              ' частота выборки (сэмплов в секунду)
  wtAvgBytesPerSec As Long             ' частота выдачи байтов
  wtAlign As Integer                   ' выравнивание
  wtBits As Integer                    ' число бит на выборку
End Type

'Идентификатор выборки
Private Type wavWaveIDType
  wtID As String * 4                   ' идентификатор ="data" =0x61746164
  wtLength As Long                     ' длина выборки (кратно 2)
End Type

Private Type wavGeneralWaveType
  wtRIFF_ID As String * 4
  wtRIFF_Len As Long
  wtChuck_ID As String * 4
  wtChuck_Format As String * 4
  wtChuck_Len As Long
  wtType As Integer
  wtChannels As Integer
  wtFreq As Long
  wtBytes As Long
  wtAlign As Integer
  wtBits As Integer
  wtData_ID As String * 4
  wtData_Len As Long
End Type


Public Enum SoundStreamDataTypes 'Тип звуковых данных
  General = 1      ' просто выборка
  MuLaw = &H101&   ' IBM mu-law
  ALaw = &H102&    ' IBM a-law
  ADPCM = &H103&   ' ADPCM
End Enum

Public Enum SoundStreamReturnCodes
  GeneralError = -1
  NoError = 0
  Wrong_FileName
  WrongID_RIFF
  WrongLen_RIFF
  WrongID_Chuck
  WrongLen_Chuck
  WrongID_Fmt
  WrongID_Data
  WrongLen_Data
End Enum
Lasciate ogni speranza, voi ch'entrate.

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Help! Can anybody help! (c) beatles

Сообщение hCORe » 31.12.2003 (Ср) 12:45

Что, так никто и не знает :?: :?: :?: Помогите :cry:

ЗЫ. Проблема была решена с использованием другого алгоритма создания файлов :wink: (запись ведется теперь в один файл-"монолит"), но этот алгоритм по соединению кусков файлов до сих пор актуален, т.к. найденное решение глючит по страшному.
Моду создают модоки, а распространяют модозвоны.

Erkin
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 07.01.2004 (Ср) 18:22
Откуда: Uzbekistan

о wav файле

Сообщение Erkin » 07.01.2004 (Ср) 20:11

У меня была проблема создания автоинформатора
дата и время по телефону

я её решил может неординарно
пиши на мыло побеседуем
Erkin@dinosoft.uz

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 08.01.2004 (Чт) 11:40

alibek же всё написал :)
У всех файлов, начиная со второго, отрезаем заголовки, сырые данные приписываем к первому файлу, попутно запоминая суммарный размер. После всех сливов пишем правильный размер в соотв. поле заголовка первого файла.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10

    TopList  
cron