powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / open для звуковых файлов
21 сообщений из 21, страница 1 из 1
open для звуковых файлов
    #37904152
QlewerBZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
нужно считать содержимое .wav файла для последующей отправки на сервер. можно ли просто открыть файл через open+input, как обычный текстовый файл?(был неприятный опыт, когда не считывалось содержимое ехе файла) пытался мудиться с бинарным чтением - ничего не получается
...
Рейтинг: 0 / 0
open для звуковых файлов
    #37904255
Тупиздень
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
QlewerBZ,

Код того что ты пытался сделать в студию!!!! Или лесом иди!
...
Рейтинг: 0 / 0
open для звуковых файлов
    #37904327
QlewerBZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ТупизденьQlewerBZ,

Код того что ты пытался сделать в студию!!!! Или лесом иди! а мозгов хватит разобраться? ну, послушаем...
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
F = FreeFile
Open "C:\SysPlus\" & fileN & ".wav" For Binary As #F
Dim l As Long
Dim s As String
l = FileLen("C:\SysPlus\" & fileN & ".wav")
s = Space(l)
Get #F, 1, s
Close #F
Dim kodik As String
Dim MyTextAll As String
Dim x As Long
MsgBox "4"
For x = 1 To l
    If Asc(Mid(s, x, 1)) >= 100 Then
    kodik = Asc(Mid(s, x, 1))
    ElseIf Asc(Mid(s, x, 1)) >= 10 Then
    kodik = "0" & Asc(Mid(s, x, 1))
    Else
    kodik = "00" & Asc(Mid(s, x, 1))
    End If
MyTextAll = MyTextAll & kodik
Text1.Text = Text1.Text & "." & MyTextAll
Next x
MsgBox MyTextAll

что-то с кодом не-то. что - хз. ошибок нет, грузится цп под 100%(файл 100кб), но до последней строчки код почему-то не доходит

а вопрос вроде конкретный: можно ли считывать .wav файлы через open+input?
...
Рейтинг: 0 / 0
open для звуковых файлов
    #37904420
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
open для звуковых файлов
    #37909774
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> что-то с кодом не-то. что - хз. ошибок нет, грузится цп под 100%(файл 100кб), но до последней строчки код почему-то не доходит

Синтаксических ошибок нет. Но есть логические и алгоритмические:
1. Происходит двойное накопление строки в цикле:
Код: vbnet
1.
2.
3.
4.
5.
For x = 1 To l
    'формируется kodik длиной 3 символа
    MyTextAll = MyTextAll & kodik
    Text1.Text = Text1.Text & "." & MyTextAll
Next x


При каждом проходе цикла MyTextAll удлиняется на 3 символа, а Text1.Text - на длину MyTextAll и еще точку.
Через n проходов цикла длина Text1.Text составит (при исходном пустом Text1)
Код: plaintext
(3n 2 +5n)/2
При длине файла 10000 байт это уже 150'025'000 символов , а при 100000 байт это должно было бы составить 15 миллиардов символов . Бедный Text1
2. Если вынести работу с Text1.Text из цикла, все равно плохо. При каждом проходе цикла создается новая строка, т.е. выделяется память под новую строку, туда переписывается прежнее содержимое строки плюс добавка, освобождается память, занятая прежней строкой.
Лучше сразу создать строку-буфер окончательной длины и вписывать в нее фрагменты:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
MyTextAll = Space(3 * l)
Dim i&
i = 1
For x = 1 To l
    'формируется kodik длиной 3 символа
    Mid(MyTextAll, i) = kodik
    i = i + 3
Next x



3. Вы в курсе, что строки в VB - это Юникод, каждый символ занимает 2 байта?
При загрузке двоичного файла в строку каждый байт перекодируется в 2 байта в соответствии с кодовой таблицей по умолчанию.
Функция Asc обратно перекодирует 2 байта в один.
Таким извратом приходится заниматься при обработке двоичных файлов на VBS, где нет типа Byte. Но в VB/VBA он есть!
Поэтому окончательно данный фрагмент следует написать так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Dim F%, l&, b() As Byte, x&, i&, MyTextAll$
F = FreeFile
Open "C:\SysPlus\" & fileN & ".wav" For Binary As #F
'Open "C:\windows\explorer.exe" For Binary As #F    '1MB
l = LOF(1)
ReDim b(1 To l)
Get #F, , b
Close #F
'MsgBox "4"
MyTextAll = Space(l * 3)
i = 1
For x = 1 To l
    Select Case b(x)
    Case Is > 99: Mid(MyTextAll, i) = b(x)
    Case Is > 9: Mid(MyTextAll, i) = "0" & b(x)
    Case Else: Mid(MyTextAll, i) = "00" & b(x)
    End Select
'    Mid(MyTextAll, i) = Format$(b(x), "000")    'работает в 2.2 раза медленнее
    i = i + 3
Next x
MsgBox Len(MyTextAll)
'Text1.Text = Text1.Text & "." & MyTextAll


Байтовый массив ~1MB обрабатывается за 0,56 с (проц 1.6 ГГц).
...
Рейтинг: 0 / 0
open для звуковых файлов
    #37909789
Фотография Qlewer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Казанский,

мм... да, большое спасибо, что объяснил)
в бинарном чтении я мало что смыслю. основная цель - закачать из vb6 проги звуковой файл .wav на сервер. на данный момент считываю .wav файл при помощи open+input, перекодирую каждый символ в ASCII код и отправляю полученную строку из цифр скрипту на сервер. не знаю ещё, правильный это способ, или нет. других норм способов простой отправки файла на сервер я не нашёл)
...
Рейтинг: 0 / 0
open для звуковых файлов
    #37909934
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Казанский,
раз пошла такая пьянка борьба за скорость...
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Dim F%, l&, b() As Byte, x&, i&, MyTextAll$, k&
F = FreeFile
Open "C:\SysPlus\" & fileN & ".wav" For Binary As #F
l = LOF(1)
ReDim b(1 To l)
Get #F, , b
Close #F
MyTextAll = String(l * 3, "0")
i = 1
For x = 1 To l
    If b(x) < 10 Then
            k = i + 2
    ElseIf b(x) < 100 Then
            k = i + 1
    Else:   k = i
    End If
    Mid(MyTextAll, k) = b(x)
    i = i + 3
Next x
MsgBox Len(MyTextAll)

...
Рейтинг: 0 / 0
open для звуковых файлов
    #37910022
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
скукотища,

да, я тоже об этом подумал вчера уже после того, как выключил комп
Еще пара вариантов, с измерением времени.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
Sub bb()
Dim F%, l&, b() As Byte, x&, i&, MyTextAll$, k&
F = FreeFile
'Open "C:\SysPlus\" & fileN & ".wav" For Binary As #F
Open "C:\windows\explorer.exe" For Binary As #F    '1MB
l = LOF(1)
ReDim b(1 To l)
Get #F, , b
Close #F
'MsgBox "4"
Dim t!: t = Timer
MyTextAll = String(l * 3, "0")
i = 1
For x = 1 To l
''                      скукотища 0,45с
'    If b(x) < 10 Then
'            k = i + 2
'    ElseIf b(x) < 100 Then
'            k = i + 1
'    Else:   k = i
'    End If
'    Mid(MyTextAll, k) = b(x)
''                      Казанский-2 0,45с
'    Select Case b(x)
'    Case Is > 99: Mid(MyTextAll, i) = b(x)
'    Case Is > 9: Mid(MyTextAll, i + 1) = b(x)
'    Case Else: Mid(MyTextAll, i + 2) = b(x)
'    End Select
''                      Казанский-3 0,42с
    k = b(x)
    Mid(MyTextAll, i - (k > 99) - (k > 9)) = k
    i = i + 3
Next
MsgBox Len(MyTextAll) & vbLf & Timer - t
End Sub
...
Рейтинг: 0 / 0
open для звуковых файлов
    #37931821
Фотография Qlewer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Казанский, скукотища,

спасибо, файл превращается в строку из цифр. а как так же грамотно перекодировать его обратно?
...
Рейтинг: 0 / 0
open для звуковых файлов
    #37931864
Фотография Qlewer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пробую так, что-то о5 не очень выходит. проект зависает.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Private Sub Command2_Click()
Dim kodik As String
Dim MyTextAll As String
Dim f
Dim l As Long
MyTextAll = ""
f = FreeFile
Open "C:\1.txt" For Input As #f
                l = LOF(f)
                Line Input #f, kodik
                Dim x As Long
                MyTextAll = String(l / 3, "0")
                For x = 1 To l Step 3
                Mid(MyTextAll, x, 1) = MyTextAll & Chr(Val(Mid(kodik, x, 3)))
                Next x
                Close #f
                f = FreeFile
                Open "C:\1.wav" For Output As #f
                Print #f, MyTextAll
                Close #f
End Sub
...
Рейтинг: 0 / 0
open для звуковых файлов
    #37931911
Фотография Qlewer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
описка
Код: vbnet
1.
Mid(MyTextAll, x, 1) = MyTextAll & Chr(Val(Mid(kodik, x, 3)))

Код: vbnet
1.
Mid(MyTextAll, x, 1) = Chr(Val(Mid(kodik, x, 3)))
...
Рейтинг: 0 / 0
open для звуковых файлов
    #37931926
Фотография Qlewer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
воть. работает но ооооч медленно. кодируется за доли секунды а раскодируется секунд 10 наверно(я не знаю, где время смотреть)
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
Private Sub Command2_Click()
If Dir("C:\1.txt") <> "" Then
Dim kodik As String
Dim MyTextAll As String
Dim f
Dim k As Long
Dim l As Long
MyTextAll = ""
f = FreeFile
                Open "C:\1.txt" For Input As #f
                l = LOF(f)
                Line Input #f, kodik
                Dim x As Long
                MyTextAll = String(l / 3, "0")
                k = 1
                For x = 1 To l - 2 Step 3
                Mid(MyTextAll, k, 1) = Chr(Val(Mid(kodik, x, 3)))
                k = k + 1
                Next x
                Close #f
                f = FreeFile
                Open "C:\1.wav" For Output As #f
                Print #f, MyTextAll
                Close #f
End If
End Sub

поможете оптимизировать код?
...
Рейтинг: 0 / 0
open для звуковых файлов
    #37932004
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Qlewer,

Может тогда уже если такое дело сохранять данные в виде Hex последовательности... 30% экономии трафика
...
Рейтинг: 0 / 0
open для звуковых файлов
    #37932109
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код пока такой, бьюсь над оптимизацией...

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
Option Explicit

Sub T()
    Dim F As Integer, iLen As Long, I As Long, B() As Byte
    F = FreeFile
    
    Dim sHexCodes(255) As String, RetStr() As String
    
    'Препарируем
    For I = 0 To 255
        sHexCodes(I) = Right("0" & Hex(I), 2)
    Next

    'Читаем
    Open "C:\Windows\explorer.exe" For Binary As #F
        ReDim B(1 To LOF(1))
        Get #F, , B
    Close #F

    'Генерируем
    ReDim RetStr(UBound(B) - 1)
    For I = 0 To UBound(RetStr)
        RetStr(I) = sHexCodes(B(I + 1))
    Next

    MsgBox Join(RetStr, "")
End Sub
...
Рейтинг: 0 / 0
open для звуковых файлов
    #37932208
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VSVLAD,

Как извратский но быстрый вариант... Правда возможно с длиной массива на байт переборщил или мне кажется.. надо уточнить ещё.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
Option Explicit

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Private Type uHexCode
    HexStr As String
    Address As Long
End Type

Public Sub t()
    Dim F As Integer, B() As Byte, I As Long
    Dim HexCodes(255) As uHexCode, retStr As String
    Dim t!: t = Timer
    
    F = FreeFile
    
    'Препарируем
    For I = 0 To 255
        HexCodes(I).HexStr = Right("0" & Hex(I), 2)
        HexCodes(I).Address = StrPtr(HexCodes(I).HexStr)
    Next

    'Читаем
    Open "C:\Windows\explorer.exe" For Binary As #F
        ReDim B(1 To LOF(1))
        Get #F, , B
    Close #F

    'Генерируем совместимый тип String =)
    retStr = String(UBound(B), vbNullChar)
    Dim iBaseAddr As Long, pOffSet As Long
    iBaseAddr = StrPtr(retStr)
    Debug.Print "iBaseAddr = " & iBaseAddr & vbCrLf
    
    For I = 1 To UBound(B)
        CopyMemory ByVal iBaseAddr + pOffSet, ByVal HexCodes(B(I)).Address, 1
        CopyMemory ByVal iBaseAddr + pOffSet + 1, ByVal HexCodes(B(I)).Address + 2, 1
        
        pOffSet = pOffSet + 2
    Next

    retStr = StrConv(retStr, vbUnicode)
    
    MsgBox Len(retStr) & vbCrLf & (Timer - t)
End Sub
...
Рейтинг: 0 / 0
open для звуковых файлов
    #37932349
Фотография Qlewer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VSVLAD,

пасяп, попытаюсь вникнуть, напишу о результатах) тут нужно как-то увеличить скорость раскодировки в несколько раз(в моём примере 13069750 ) или искать другой способ передачи или кодировки файла. главная цель - передать файл с компа на комп посредством сервера. как работать с ftp я не догнал, поэтому маюсь переводом в кодировку ascii и передачей скриптам. в случае с лёгкими файлами всё работает хорошо, за несколько месяцев ни одной ошибки. а файлы около 1 мб раскодируются слишком долго
...
Рейтинг: 0 / 0
open для звуковых файлов
    #37932519
Фотография Qlewer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VSVLAD,

извини, тяжело вникнуть. если я правильно понял, это способ превратить файл в строку? с этим проблем нет. а обратно? из строки в файл
...
Рейтинг: 0 / 0
open для звуковых файлов
    #37932599
Фотография Qlewer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
оставил это же код 13070157 . доделал прогу. кажись, работает. теперь я могу удалённо записывать и прослушивать в онлайн-режиме(ну как онлайн... с задержкой в 12-13 секунд) звуки с микрофона. осталось ещё несколько дней тестить с 2 компов. самое скучное( сижу, слушаю свои же скороговорки...
в будущем хочу сделать и удалённую запись с камеры, но для этого нужны знания многопоточности, сжатия и работы с видео. т.е. через пару лет.
в моей проге для передачи звука около 1-1.5 мб файл содержащий 10 секундную запись голоса кодируется, передаётся на сервер, скачивается с него, раскодируется. всё это за <10 секунд
а для видео размеры файлов будут побольше, поэтому придётся повозиться.
если будут какие-то идеи по улучшению кода и вообще по теме, пишите, буду благодарен
...
Рейтинг: 0 / 0
open для звуковых файлов
    #37932612
Фотография Qlewer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
работает потрясающе!!! сам не ожидал. ну, надеялся, конешь, но не думал, что получится. только что спел квартетом сам с собой. прослезился аж. круто))
...
Рейтинг: 0 / 0
open для звуковых файлов
    #37932829
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Qlewer,
Вообще решение вопроса достигнуто, чтение есть. Другое дело каким образом вы передаёте эти байты на "сервер" HTTP сервер + PHP/ASP? Общая папка? Или что ещё? Так как метод чтения и кодирования в ASCII последовательность неэффективный. Или сервер - это программная часть? Тогда не проще ли писать и читать и писать байты напрямую через компонент WinSock - тогда не будет лишних конверсий и задержек. Это самый лучший вариант. А Хекс режим использовать тогда, когда нужно представить байты в принтейбл виде.
...
Рейтинг: 0 / 0
open для звуковых файлов
    #37933035
Фотография Qlewer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VSVLADметод чтения и кодирования в ASCII последовательность неэффективный да, в ASCII не выгодно, ресурсы во время кодировки жрёт + объём в 3 раза увеличивается, но альтернативы не нашёл. пробовал передавать буквы+цифры(объём увеличивается в 1.1 раз), но русские буквы не распознаются то ли некоторыми системами, то ли моим сервером)
принимающая часть и сервер принадлежат только мне. с винсок я очень долго мудился, ничего не понятно.
клиентская часть программы создаёт звуковой файл, кодирует, отсылает на сервер. отправка любым способом, но кроме PHP POST запросов я хз, как это грамотно делается. через FTP, винсок или ещё как-то надо. далее админская часть скачивает файл с сервера, раскодирует, воспроизводит звуковой файл. получается очень даже неплохо, даже без зависаний между звуковыми кусками VSVLADТогда не проще ли писать и читать и писать байты напрямую через компонент WinSock сразу с клиента на админскую часть в обход сервера? или так же через сервер? я самоучка, для этого нужны толковые работающие примеры, чтобы разобраться как и что)
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / open для звуковых файлов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]