es geht mir gut
11264 / 4746 / 1183
Регистрация: 27.07.2011
Сообщений: 11,437
1

Низкое качество записи потока

25.10.2017, 15:11. Показов 1098. Ответов 3
Метки нет (Все метки)

Приветствую всех, друзья.

Код сочинил по мотивам этих источников:

Отсюда

И отсюда

В итоге в файл записывается не пойми что.


Код такой (лишнее убрал)
VB.NET
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
        Private _fileStream As IO.FileStream
        Public _myRecProc As Audio.RECORDPROC ' make it global, so that the GC can not remove it
        Private _byteswritten As Integer = 0
        Private _recbuffer() As Byte ' local recording buffer
        Private _recHandle As IntPtr
 
        '=======================================================
 
    Private Sub WriteWavHeader()
        Using stream As IO.FileStream = New FileStream("test1.wav", FileMode.Create, FileAccess.Write, FileShare.None)
            Dim channelCount As Integer = 2
            Dim sampleRate As Integer = 44100
            Dim bitDepth As Integer = 16
            Dim sh As UShort = 1
            Dim sh1 As UShort = channelCount * (bitDepth / 8)
            stream.Position = 0
            stream.Write(Encoding.ASCII.GetBytes("RIFF"), 0, 4)
            stream.Write(BitConverter.GetBytes(36), 0, 4)
            stream.Write(Encoding.ASCII.GetBytes("WAVE"), 0, 4)
            stream.Write(Encoding.ASCII.GetBytes("fmt "), 0, 4)
            stream.Write(BitConverter.GetBytes(16), 0, 4)
            stream.Write(BitConverter.GetBytes(sh), 0, 2)
            stream.Write(BitConverter.GetBytes(channelCount), 0, 2)
            stream.Write(BitConverter.GetBytes(sampleRate), 0, 4)
            stream.Write(BitConverter.GetBytes(sampleRate * channelCount * (bitDepth / 8)), 0, 4)
            stream.Write(BitConverter.GetBytes(sh1), 0, 2)
            stream.Write(BitConverter.GetBytes(bitDepth), 0, 2)
            stream.Write(Encoding.ASCII.GetBytes("data"), 0, 4)
            stream.Write(BitConverter.GetBytes(0), 0, 4)
        End Using
    End Sub
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If IO.File.Exists("test1.wav") Then IO.File.Delete("test1.wav")
        If Audio.BASS_RecordInit(intCurAudioDevice) Then 'здесь intCurAudioDevice=-1
            _myRecProc = New Audio.RECORDPROC(AddressOf MyRecording)
            Dim recHandle As Integer = Audio.BASS_RecordStart(44100, 2, Audio.BASSFlag.BASS_RECORD_PAUSE, _myRecProc, IntPtr.Zero)
            ' start recording
            WriteWavHeader()
            _fileStream = New FileStream("test1.wav", FileMode.Open, FileAccess.Write, FileShare.None)
            _fileStream.Position = 44
            Audio.BASS_ChannelPlay(recHandle, False)
        End If
    End Sub
 
    Private Function MyRecording(ByVal handle As Integer, ByVal buffer As IntPtr, ByVal length As Integer, ByVal user As IntPtr) As Boolean
        Dim cont As Boolean = True, buf() As Byte
        If length > 0 AndAlso buffer <> IntPtr.Zero Then
            buf = New Byte(length) {}
            Marshal.Copy(buffer, buf, 0, length)
            _fileStream.Write(buf, 0, buf.Length)
            _byteswritten += length
            If _byteswritten > 800000 Then ' stop recording
                cont = False
                _fileStream.Position = 40
                _fileStream.Write(BitConverter.GetBytes(_fileStream.Length - 44), 0, 4)
                _fileStream.Close()
                _byteswritten = 0
            End If
        End If
        Return cont
    End Function
 
 
    '=========       В модуле  Audio ========================
 
    Public Declare Function BASS_ChannelPlay Lib "bass.dll" (ByVal handle As IntPtr, ByVal restart As Boolean) As Boolean
    Public Declare Function BASS_RecordInit Lib "bass.dll" (ByVal device As Integer) As Boolean
    Public Declare Function BASS_RecordFree Lib "bass.dll" () As Boolean
    Public Declare Function BASS_RecordStart Lib "bass.dll" (ByVal freq As Integer, ByVal chans As Integer, ByVal flags As Integer, ByVal proc As RECORDPROC, ByVal user As Integer) As IntPtr
    Public Delegate Function RECORDPROC(ByVal handle As Integer, ByVal buffer As IntPtr, ByVal length As Integer, ByVal user As IntPtr) As Boolean

Вот что получается
test1.rar

Вопрос: Что я делаю не так, и как это победить.

Спасибо за внимание
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.10.2017, 15:11
Ответы с готовыми решениями:

Записать число в начало потока вернувшись с конца потока после записи нескольких элементов...
public static void Save(List&lt;SomeClass&gt; listSC, String fileName) { using...

на записи получается очень низкое качество
У меня звуковая карта Realtek ALC850, должна вроде бы быть хорошей для записи. Я пишу через...

Низкое качество графики в браузерах после переустановки Windows 7
Добрый день. Недавно переустановил систему Windows 7. Графика на рабочем столе,в...

Плохое качество записи
Приветствую. Расскажу всё сначала. Изначально была гарнитура Razer USB, которая по сути своей...

3
Модератор
8978 / 3326 / 849
Регистрация: 22.02.2013
Сообщений: 5,012
Записей в блоге: 78
26.10.2017, 10:45 2
Лучший ответ Сообщение было отмечено SoftIce как решение

Решение

Ошибки в 2-х местах.
1-я: не обновляется поле RIFF:fileSize которое должно равняться размеру всех субчанков, в данном случае можно просто заменить на размер файла - 8, сейчас туда фиксировано пишется 36;
2-я: _fileStream.Write(buf, 0, buf.Length), buf.Length нужно заменить на length.
Не знаю как в NET, если на WINAPI я бы посоветовал использовать стандартные WaveIn функции или DirectSound. Также для корректной записи RIFF файлов посоветовал функции mmioOpen/mmioWrite etc.
4
es geht mir gut
11264 / 4746 / 1183
Регистрация: 27.07.2011
Сообщений: 11,437
26.10.2017, 11:07  [ТС] 3
Спасибо, Анатолий, все получилось!
0
Yury Komar
28.10.2017, 07:57     Низкое качество записи потока
  #4

Не по теме:

The trick, как всегда - все на высшем уровне :)

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.10.2017, 07:57

Мужская солидарность и плохое качество записи
Мужики, очень рассчитываю на вашу солидарность и помощь. Проблема банальна и общеизвестна - жена...

Ffmpeg изменение bit_rate не влияет на качество записи видео
имеется код выполняющий кодирование и запись видео в файл extern &quot;C&quot; { #include...

Качество воспроизведения на Youtube. Разные WiFi, разное качество
Здарова народ. У меня дома стоит инет от Билайна (естественно роутер с WiFi). Так вот, когда я...

Почему в процессе квантования изменяется качество звуковой записи; и к чему приводит небольшая разрядность АЦП
Почему в процессе квантования изменяется качество звуковой записи? и к чмупривдит небольшая...

Через что можно подключить HyperX Cloud Core чтоб улучишь качество записи микрофона
Добрый день. Купил гарнитуру HyperX Cloud Core, вроде как там микрофон не плохой, но у меня...

Где в DVD Architect Pro выбрать качество HD, для записи на DVD диск
Здравствуйте! Знающие люди, подскажите, где в этой программе можно выбрать качевство ХД, для записи...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru