Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/128: Рейтинг темы: голосов - 128, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 14.11.2009
Сообщений: 8
1

Запись звука с микрофона

14.11.2009, 17:52. Показов 26378. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Попытался записать звук с микрофона компиляция ошибок не дает но при запуске виснет.
Помогите разобраться.

C#
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.DirectSound;
using Buffer = Microsoft.DirectX.DirectSound.Buffer;
using System.IO; 
 
 
namespace DirectSound_
{
    public partial class Form1 : Form
    {
        Device device;
        Capture capture;
        Buffer buffer;
        BufferDescription bufferDesc;
        CaptureBuffer captureBuffer;
        WaveFormat waveFormat;
        CaptureBufferDescription captureBuffDesc;
        MemoryStream stream;
        byte[] streamBuffer; 
 
        public Form1()
        {
            InitializeComponent();
            
            device = new Device(); // Setup DirectSound 
 
            waveFormat = new WaveFormat();// Load the sound 
            waveFormat.BitsPerSample = 8;
            waveFormat.BlockAlign = 1;
            waveFormat.Channels = 1;
            waveFormat.AverageBytesPerSecond = 20500;
            waveFormat.SamplesPerSecond = 20500;
            waveFormat.FormatTag = WaveFormatTag.Pcm;
 
            bufferDesc = new BufferDescription();
            bufferDesc.Format = waveFormat;
            bufferDesc.BufferBytes = 100000;
            bufferDesc.ControlPositionNotify = true;
            bufferDesc.ControlFrequency = true;
            bufferDesc.ControlPan = true;
            bufferDesc.ControlVolume = true;
 
            buffer = new Buffer(bufferDesc, this.device);
 
            device.SetCooperativeLevel(this, CooperativeLevel.Priority); // Set the cooperative level 
 
            capture = new Capture();
            
            captureBuffDesc = new CaptureBufferDescription();
            captureBuffDesc.BufferBytes = 100000;
            captureBuffDesc.Format = this.waveFormat;
 
            captureBuffer = new CaptureBuffer(captureBuffDesc, capture);
            
            streamBuffer = new byte[100000];
            
            
            for (int i = 0; i < 100000; i++)
            {
                
                streamBuffer[i] = 0;
            }
            stream = new MemoryStream(streamBuffer); 
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            this.captureBuffer.Read(0, this.stream, 100000, LockFlag.None);
            buffer.Write(0, this.stream, (int)this.stream.Length, LockFlag.EntireBuffer);
            buffer.Play(0, BufferPlayFlags.Looping); 
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            buffer.Stop(); 
        }
 
        private void button3_Click(object sender, EventArgs e)
        {
            this.captureBuffer.Start(true); 
        }
 
        private void button4_Click(object sender, EventArgs e)
        {
            this.captureBuffer.Stop(); 
        }
        
 
 
    }
}
прикремпил весь проект на вский случай
Вложения
Тип файла: zip DirectSound;.zip (42.7 Кб, 722 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.11.2009, 17:52
Ответы с готовыми решениями:

Запись звука с микрофона
Всем привет. Дорогие форумчане, у меня возникла проблема. В ходе решения задачи понадобилось...

Запись звука с микрофона
Всем привет, думаю тема баян, но что-то не прёт меня с микрофонов... Пробовал делать через...

Запись звука с микрофона и сохранение в wav
Добрый день, как записать wav файл с микрофона? Частота дискретизации = 122кб/с моно. Спасибо.

Спектр звука с микрофона
Пишу программу которая должна выводить график амплитудного спектра звука, посылаемого с микрофона....

20
159 / 156 / 47
Регистрация: 29.04.2009
Сообщений: 636
14.11.2009, 22:47 2
а какие ошибки можно?
p.S или виснет ОС?
1
0 / 0 / 0
Регистрация: 14.11.2009
Сообщений: 8
14.11.2009, 23:02  [ТС] 3
Виснет программа в отладчике если первый раз нажать на плей нечего не воспроизводит.
второй раз виснет.
а вот запись идет или не те знаю.
0
Комбайнёр
1606 / 704 / 77
Регистрация: 27.05.2008
Сообщений: 2,535
15.11.2009, 10:43 4
Посмотрите
Вложения
Тип файла: zip fister.zip (117.2 Кб, 850 просмотров)
2
0 / 0 / 0
Регистрация: 14.11.2009
Сообщений: 8
15.11.2009, 14:07  [ТС] 5
Проэкт fister написан на с++ использует MFC и версия кажется 6.0 а мне хотелось бы под NET.
Меня поразило что он нормально откомпелировался на VS2008 и даже запускается в отладчике.
А говорили что 2008 только под NET расчитан и если хотите писать без NET ставьте 6.0 версию визуал студио.
0
Комбайнёр
1606 / 704 / 77
Регистрация: 27.05.2008
Сообщений: 2,535
16.11.2009, 09:01 6
Цитата Сообщение от Старик Посмотреть сообщение
Проэкт fister написан на с++ использует MFC и версия кажется 6.0 а мне хотелось бы под NET.
Меня поразило что он нормально откомпелировался на VS2008 и даже запускается в отладчике.
А говорили что 2008 только под NET расчитан и если хотите писать без NET ставьте 6.0 версию визуал студио.
В вижуал включен с++ как под MFC так и под dot.net.
0
0 / 0 / 0
Регистрация: 21.04.2015
Сообщений: 3
21.09.2010, 10:14 7
Visual Studio 2008, DirectX SDK Jun10
У меня работает без сбоев.

C#
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
using System;
using System.Threading;
using System.IO;
using Microsoft.DirectX.DirectSound;
using Buffer = Microsoft.DirectX.DirectSound.Buffer;
 
namespace Remi
{
    static class RecordPlay
    {
 
        private static WaveFormat _waveFormat;
        public static WaveFormat waveFormat
        {
            get
            {
                return _waveFormat;
            }
        }
        private static UInt16 sizeBufer = 44100;
        private static MemoryStream stream;
        private static MemoryStream tempStream;
        public static int Length { get { return (int)stream.Length; } }
        public static byte[] Data
        {
            get
            {
                switch (regim)
                {
                    case 0: break;
                    case 1: RecordStop(); break;
                    case 2: PlayStop(); break;
                }
                return stream.ToArray();
            }
        }
        private static byte regim = 0;
        ////////////////////////////////////////////////
        private static Capture capture;
        private static CaptureBufferDescription captureBuffDesc;
        private static CaptureBuffer recordBuff;
 
        private static AutoResetEvent autoResetEventRec;
        private static BufferPositionNotify[] positionNotifyRec;
        private static Notify notifyRec;
 
        private static Thread threadRec;
        ///////////////////////////////////////////////
        private static Device device;
        private static Buffer playBuff;
        private static BufferDescription secondBuffDesc;
 
        private static System.Windows.Forms.Control control=null;
        private static Thread threadPlay;
 
        private static AutoResetEvent autoResetEventPlay;
        private static BufferPositionNotify[] positionNotifyPlay;
        private static Notify notifyPlay;
 
        ///////////////////////////////////////////////
 
        public static void Create(System.Windows.Forms.Control _control)
        {
            control = _control;
            SetWaveFormat();
            SetTempStream();
            SetPlayBuff();
            SetRecordBuff();
            SetNotifyPlay();
            SetNotifyRecord();
        }
        private static void SetTempStream()
        {
            ushort i, n = (ushort)(sizeBufer);
            byte[] temp = new byte[n];
            if (_waveFormat.BitsPerSample == 8)
            {
                for (i = 0; i < n; i++) temp[i] = 127;
                tempStream = new MemoryStream(temp);
                return;
            }
            if (_waveFormat.BitsPerSample == 16)
            {
                for (i = 0; i < n; i++) temp[i] = 0;
                tempStream = new MemoryStream(temp);
                return;
            }
        }
        private static void SetWaveFormat()
        {
            _waveFormat = new WaveFormat();
            _waveFormat.BitsPerSample = 8;
            _waveFormat.BlockAlign = 1;
            _waveFormat.Channels = 1;
            _waveFormat.AverageBytesPerSecond = 22050;
            _waveFormat.SamplesPerSecond = 22050;
            _waveFormat.FormatTag = WaveFormatTag.Pcm;
        }
        private static void SetRecordBuff()
        {
            capture = new Capture();
            captureBuffDesc = new CaptureBufferDescription();
            captureBuffDesc.BufferBytes = sizeBufer;
            captureBuffDesc.Format = _waveFormat;
            recordBuff = new CaptureBuffer(captureBuffDesc, capture);
        }
        private static void SetNotifyRecord()
        {
            autoResetEventRec = new AutoResetEvent(false);
            positionNotifyRec = new BufferPositionNotify[2];
            positionNotifyRec[0].Offset = sizeBufer / 2 - 1;
            positionNotifyRec[0].EventNotifyHandle = autoResetEventRec.SafeWaitHandle.DangerousGetHandle();
            positionNotifyRec[1].Offset = sizeBufer - 1;
            positionNotifyRec[1].EventNotifyHandle = autoResetEventRec.SafeWaitHandle.DangerousGetHandle();
            notifyRec = new Notify(recordBuff);
            notifyRec.SetNotificationPositions(positionNotifyRec, 2);
        }
        private static void Recording()
        {
            int offset = 0;
            int a, b;
            recordBuff.GetCurrentPosition(out a, out b);
            if (a == 0) { offset = sizeBufer / 2; b = sizeBufer / 2; }
            else if (a < sizeBufer / 2) { offset = sizeBufer / 2; b = sizeBufer / 2 - a; }
            else { offset = 0; b = sizeBufer - a; }
 
 
 
            recordBuff.Start(true);
            autoResetEventRec.WaitOne(Timeout.Infinite, true);
            recordBuff.Read(a, stream, b, LockFlag.None);
            for (; ; )
            {
                autoResetEventRec.WaitOne(Timeout.Infinite, true);
                recordBuff.Read(offset, stream, sizeBufer / 2, LockFlag.None);
                offset = (offset + sizeBufer / 2) % (sizeBufer);
            }
        }
        private static void RecordStart()
        {
            switch (regim)
            {
                case 0:  break;
                case 1: RecordStop(); break;
                case 2: PlayStop(); break;
            }
            regim = 1;
            stream = new MemoryStream();
            threadRec = new Thread(new ThreadStart(Recording));
            threadRec.Start();
        }
        private static void RecordStop()
        {
            if (regim != 1) return;  
            int a, b;
            
            threadRec.Abort();
            recordBuff.Stop();
            recordBuff.GetCurrentPosition(out a, out b);
 
            if (a == sizeBufer / 2 || a == sizeBufer) { regim = 0; return; }
 
            if (a < sizeBufer / 2)
            {
                recordBuff.Read(0, stream, a, LockFlag.None);
            }
            else
            {
                recordBuff.Read(sizeBufer / 2, stream, a - sizeBufer / 2, LockFlag.None);
            }      
            regim = 0;
        }
        private static void SetPlayBuff()
        {
            device = new Device();
            device.SetCooperativeLevel(control, CooperativeLevel.Priority);
            secondBuffDesc = new BufferDescription();
            secondBuffDesc.Format = _waveFormat;
            secondBuffDesc.BufferBytes = sizeBufer;
            secondBuffDesc.LocateInSoftware = true;
            secondBuffDesc.ControlPositionNotify = true;
            secondBuffDesc.ControlFrequency = true;
            secondBuffDesc.ControlPan = true;
            secondBuffDesc.ControlVolume = true;          
            playBuff = new Buffer(secondBuffDesc, device);
 
        }
        private static void SetNotifyPlay()
        {        
                autoResetEventPlay = new AutoResetEvent(false);
                positionNotifyPlay = new BufferPositionNotify[2];
                positionNotifyPlay[0].Offset = sizeBufer / 2 - 1;
                positionNotifyPlay[0].EventNotifyHandle = autoResetEventPlay.SafeWaitHandle.DangerousGetHandle();
                positionNotifyPlay[1].Offset = sizeBufer - 1;
                positionNotifyPlay[1].EventNotifyHandle = autoResetEventPlay.SafeWaitHandle.DangerousGetHandle();
                notifyPlay = new Notify(playBuff);
                notifyPlay.SetNotificationPositions(positionNotifyPlay, 2);
        }
        private static void Playing()
        {
 
            uint i, num = (uint)(stream.Length / (sizeBufer / 2));
            int offset, ostatok = (int)stream.Length % (sizeBufer / 2);
 
            if (num < 2)
            {
                playBuff.Write(0, stream, (int)stream.Length, LockFlag.None);
                playBuff.Write((int)stream.Length, tempStream, sizeBufer - (int)stream.Length, LockFlag.None);
                playBuff.Play(0, BufferPlayFlags.Default);
                return;
            }
 
            playBuff.Write(0, stream, sizeBufer, LockFlag.None);
            playBuff.Play(0, BufferPlayFlags.Looping);
            autoResetEventPlay.WaitOne(Timeout.Infinite, true);
            for (offset = 0, i = 2; i <= num; i++)
            {   
                if (i != num)
                {
                    playBuff.Write(offset, stream, sizeBufer / 2, LockFlag.None);     
                }
                else
                {
                    playBuff.Write(offset, stream, ostatok, LockFlag.None);
                    playBuff.Write(offset + ostatok, tempStream, sizeBufer / 2 - ostatok, LockFlag.None);
                }
                offset = (offset + sizeBufer / 2) % sizeBufer;
                autoResetEventPlay.WaitOne(Timeout.Infinite, true);
            }
            autoResetEventPlay.WaitOne(Timeout.Infinite, true);
            playBuff.Stop();
            regim = 0;
        }
        private static void PlayStart()
        {
            switch (regim)
            {
                case 0: break;
                case 1: RecordStop(); break;
                case 2: PlayStop(); break;
            }
            regim = 2;
            stream.Position = 0;
            playBuff.SetCurrentPosition(0);
            tempStream.Position = 0;
            threadPlay = new Thread(new ThreadStart(Playing));
            threadPlay.Start();
        }
        private static void PlayStop()
        {
            if (regim == 2)
            {
                threadPlay.Abort();
                playBuff.Stop();         
                regim = 0;
            }
        }
        public static void Record()
        {
            RecordStart();
        }
        public static void Play()
        {
            PlayStart();
        }
        public static int Stop()
        {
            switch (regim)
            {
                case 1: RecordStop(); return 1;
                case 2: PlayStop(); return 2;
                default: return 0;
            }
        }
    }
}
0
72 / 72 / 5
Регистрация: 03.11.2009
Сообщений: 492
12.12.2010, 19:58 8
Поидее если виснет то из за
captureBuffDesc.BufferBytes = 100000;
Надо вроде
C++
1
captureBuffDesc.BufferBytes = 20500 / 20;
0
6280 / 3565 / 898
Регистрация: 28.10.2010
Сообщений: 5,926
06.01.2011, 18:47 9
Remi. Все отлично работает, но как сделать качество звука лучше?
1
Slava_32
03.05.2011, 13:21 10
Петррр, а как вы создали обьект System.Windows.Forms.Control который требует функция Create(System.Windows.Forms.Control _control) в примере Remi? Потомучто если просто вызвать для него конструктор (вызывал без параметров), то при вызове Create и передаче его туда, программа выдает ошибку... Спасибо.
P.S. Использую Visual Studio 2010
Заблокирован
04.05.2011, 09:49 11
Цитата Сообщение от Петррр Посмотреть сообщение
Все отлично работает, но как сделать качество звука лучше?
Скинь проект, если тебе нетрудно. И почему Remi я не могу нажать на +1 ?
0
nio
04.05.2011, 12:57
  #12

Не по теме:

Цитата Сообщение от Sergei_ Посмотреть сообщение
И почему Remi я не могу нажать на +1 ?
ему по сроку службы не положено благодарности получать :D Вот еще постов добавит, тога и кнопка появится.
Sergei_, пока что можешь ему отзыв положительный сделать :)

0
Sergei_
04.05.2011, 13:41
  #13

Не по теме:

Цитата Сообщение от nio Посмотреть сообщение
ему по сроку службы не положено благодарности получать
Понятно.
Цитата Сообщение от nio Посмотреть сообщение
Sergei_, пока что можешь ему отзыв положительный сделать
Хорошо.
Отзыв положительный.
Правильно?

0
6048 / 3457 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
04.05.2011, 13:42 14
Цитата Сообщение от Sergei_ Посмотреть сообщение
Правильно?
верно
0
Slava_32
07.05.2011, 13:00 15
хмм... а куда Петррр пропал что в ету тему незаходит.... емо можно както сообщение написать чтобы зашел в ету тему? потомучто очень от него ответ нужен.....
6048 / 3457 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
09.05.2011, 22:51 16
Цитата Сообщение от Slava_32 Посмотреть сообщение
емо можно както сообщение написать чтобы зашел в ету тему? потомучто очень от него ответ нужен.....
Все, кто постил в теме, автоматически получают подписку на нее и им приходят уведомления, если в теме появляется новый пост. Так что Петррр скорее всего не видит необходимости что-либо здесь писать.
Также обращаю внимание на то, что правила запрещают задавать несколько вопросов в одной теме (п.3.15). Хотите получить ответ на свой вопрос создавайте новую тему.
0
5 / 5 / 1
Регистрация: 17.06.2010
Сообщений: 42
17.03.2012, 20:21 17
Аналогичный вопрос, как у Slava_32
0
9 / 9 / 1
Регистрация: 27.12.2010
Сообщений: 95
02.04.2012, 00:34 18
В коде Remi не могу справиться с ошибками, при попытке записать появляется исключительная ситуация. Кто-нибудь может скинуть готовый проект?
0
_
2364 / 1243 / 78
Регистрация: 28.10.2009
Сообщений: 4,331
02.04.2012, 00:52 19
DarkLogic, вам обязательно через DirectX? А то в этой теме - я приводил пример записи звука с микрофона с помощью NAudio.
1
3 / 3 / 1
Регистрация: 30.08.2013
Сообщений: 36
30.08.2013, 10:53 20
Remi, проблема тут образовалась при вставке вашего кода появляется ошибка :
Ошибка 1 Программа "c:\users\администратор\documents\visual studio 2010\Projects\ConsoleApplication6\ConsoleApplication6\obj\x86\Debug\ConsoleAppli cation6.exe" не содержит статического метода "Main", подходящего для точки входа ConsoleApplication6
Не подскажете в чём проблема?
0
30.08.2013, 10:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.08.2013, 10:53
Помогаю со студенческими работами здесь

Захват звука с микрофона и воспроизведение
Здравствуйте! Подскажите чем можно брать звук с микрофона, чтоб можно было его передавать по сети и...

Библиотеки для записи звука с микрофона
Подскажите пожалуйста библиотеки для записи звука с микрофона. NAudio не предлагать, т.к. его я и...

Запись с микрофона и динамиков (Запись телефонного разговора)
Доброй ночи! Уважаемые граждане, помогите примером кода для записи в wav файл с микрофона и...

Голосовое управление: как получить график звука с микрофона
Хочу сделать голосовое управление. Знаю что нужно получить график(время, амплитуда) и сравнивать с...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru