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

Код того что ты пытался сделать в студию!!!! Или лесом иди!
...
Рейтинг: 0 / 0
04.08.2012, 13:22
    #37904327
QlewerBZ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
open для звуковых файлов
Тупиздень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
04.08.2012, 16:09
    #37904420
Казанский
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
open для звуковых файлов
...
Рейтинг: 0 / 0
09.08.2012, 01:18
    #37909774
Казанский
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
open для звуковых файлов
> что-то с кодом не-то. что - хз. ошибок нет, грузится цп под 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
09.08.2012, 01:48
    #37909789
Qlewer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
open для звуковых файлов
Казанский,

мм... да, большое спасибо, что объяснил)
в бинарном чтении я мало что смыслю. основная цель - закачать из vb6 проги звуковой файл .wav на сервер. на данный момент считываю .wav файл при помощи open+input, перекодирую каждый символ в ASCII код и отправляю полученную строку из цифр скрипту на сервер. не знаю ещё, правильный это способ, или нет. других норм способов простой отправки файла на сервер я не нашёл)
...
Рейтинг: 0 / 0
09.08.2012, 09:22
    #37909934
скукотища
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
open для звуковых файлов
Казанский,
раз пошла такая пьянка борьба за скорость...
Код: 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
09.08.2012, 10:10
    #37910022
Казанский
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
open для звуковых файлов
скукотища,

да, я тоже об этом подумал вчера уже после того, как выключил комп
Еще пара вариантов, с измерением времени.
Код: 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
27.08.2012, 14:21
    #37931821
Qlewer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
open для звуковых файлов
Казанский, скукотища,

спасибо, файл превращается в строку из цифр. а как так же грамотно перекодировать его обратно?
...
Рейтинг: 0 / 0
27.08.2012, 14:35
    #37931864
Qlewer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
open для звуковых файлов
пробую так, что-то о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
27.08.2012, 14:58
    #37931911
Qlewer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
open для звуковых файлов
описка
Код: 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
27.08.2012, 15:05
    #37931926
Qlewer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
open для звуковых файлов
воть. работает но ооооч медленно. кодируется за доли секунды а раскодируется секунд 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
27.08.2012, 15:43
    #37932004
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
open для звуковых файлов
Qlewer,

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

Код: 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
27.08.2012, 17:05
    #37932208
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
open для звуковых файлов
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
27.08.2012, 17:57
    #37932349
Qlewer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
open для звуковых файлов
VSVLAD,

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

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


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