Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/105: Рейтинг темы: голосов - 105, средняя оценка - 4.54
20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2

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

11.12.2012, 15:32. Показов 22433. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, как записать wav файл с микрофона? Частота дискретизации = 122кб/с моно.
Спасибо.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.12.2012, 15:32
Ответы с готовыми решениями:

Запись звука с микрофона в файл WAV
Здравствуйте друзья! Думаю многим начинающим программистам Delphi будет интересна эта тема. К делу! В общем пытаюсь средствами API Windows...

Запись звука с микрофона в файл WAV
Здравствуйте друзья! Думаю многим начинающим программистам Delphi будет интересна эта тема. К делу! В общем пытаюсь средствами API Windows...

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

17
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
11.12.2012, 21:03
Лучший ответ Сообщение было отмечено как решение

Решение

с использованием библиотеки NAudio
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
using NAudio;
using NAudio.Wave;
 
WaveIn waveIn;
WaveFileWriter writer;
string outputFilename = "D:/demo.wav";
 
void waveIn_DataAvailable(object sender, WaveInEventArgs e)
{
    writer.WriteData(e.Buffer, 0, e.BytesRecorded);
}
 
void waveIn_RecordingStopped(object sender, EventArgs e)
{
    waveIn.Dispose();
    waveIn = null;
    writer.Close();
    writer = null;
}
 
private void button1_Click(object sender, EventArgs e)
{
    waveIn = new WaveIn();
    waveIn.DeviceNumber = 0;
    waveIn.DataAvailable += waveIn_DataAvailable;
    waveIn.RecordingStopped += new EventHandler(waveIn_RecordingStopped);
    waveIn.WaveFormat = new WaveFormat(44100, 2);
    writer = new WaveFileWriter(outputFilename, waveIn.WaveFormat);
    waveIn.StartRecording();
}
 
private void button2_Click(object sender, EventArgs e)
{
    waveIn.StopRecording();
}

или вариант через API
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
using System.Runtime.InteropServices;
 
[DllImport("winmm.dll")]
private static extern int mciSendString(string lpstrCommand,
    string lpstrReturnString, int uReturnLength, int hwndCallback);
 
private void button1_Click(object sender, EventArgs e)
{
    mciSendString("open new Type waveaudio Alias recsound", "", 0, 0);
    mciSendString("record recsound", "", 0, 0);
 
    mciSendString("open new Type waveaudio Alias recsound", "", 0, 0);
    mciSendString("set recsound bitspersample 16", "", 0, 0);
    mciSendString("set recsound samplespersec 44100", "", 0, 0);
    mciSendString("record recsound", "", 0, 0);
}
 
private void button2_Click(object sender, EventArgs e)
{
    mciSendString("save recsound c:\\record.wav", "", 0, 0);
    mciSendString("close recsound ", "", 0, 0);
    Computer c = new Computer();
    c.Audio.Stop();
 
    mciSendString("save recsound d:/demo.wma", "", 0, 0);
    mciSendString("close recsound", "", 0, 0);
}
 
private void button3_Click(object sender, EventArgs e)
{
    Computer computer = new Computer();
    computer.Audio.Play("c:\\record.wav", AudioPlayMode.Background);
}
5
20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2
12.12.2012, 11:20  [ТС]
_lunar_, а с помощью API можно в flac формате записывать?
Если нет, то можно ли с помощью NAudio?

Добавлено через 2 часа 37 минут
Что за класс такой Computer c = new Computer();?
Может из-за того, что я на WPF создал приложение, а класс есть только в Form?

Добавлено через 19 минут
С Computer разобрался...

Добавлено через 2 минуты
Цитата Сообщение от _lunar_ Посмотреть сообщение
mciSendString("set recsound samplespersec 44100", "", 0, 0);
И почему нельзя брать 16 кГц а 8 кГц можно(?
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
12.12.2012, 18:38
Цитата Сообщение от Костяныч Посмотреть сообщение
а с помощью API можно в flac формате записывать?
flac это контейнер для не пережатого кодеком аудио потока, wav тоже самое.

Цитата Сообщение от Костяныч Посмотреть сообщение
И почему нельзя брать 16 кГц а 8 кГц можно(?
это был просто пример, попробуйте, может получится.
1
20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2
12.12.2012, 18:39  [ТС]
дак все таки можно записывать flac?
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
12.12.2012, 18:54
нет, winmm.dll поддерживает только wav.
1
20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2
12.12.2012, 18:59  [ТС]
Значит способ конвертирования искать придется....(

Добавлено через 3 минуты
А можно реализовать следующее: человек говорит, программа пишет, человек не говорит, программа ждет?
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
12.12.2012, 19:32
Цитата Сообщение от Костяныч Посмотреть сообщение
Значит способ конвертирования искать придется....(
не нужно ничего конвертировать, я же вам написал контейнер, в котором лежит аудио поток (поток байтов), почитайте в интернете про аудио и видео контейнеры, чтобы разобраться
вот видео как менять видео контейнер
Кликните здесь для просмотра всего текста

А так, ищите программу для смены контейнера (собственно можно и самому написать, нужно только найти все спецификации по заголовкам\смещений требуемых контейнеров).

Цитата Сообщение от Костяныч Посмотреть сообщение
А можно реализовать следующее: человек говорит, программа пишет, человек не говорит, программа ждет?
думаю можно. Посмотрите информацию об уровне шума: если микрофон просто лежит и уровень равен скажем 10 dB, то программа ждёт, как только уровень превысил 10 dB программа начинает писать, простое условие if\else.
1
20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2
12.12.2012, 21:10  [ТС]
А с помощью API можно громкость менять?
А окна открывать?
Приложения закрывать(прерывать)?
0
Почетный модератор
 Аватар для Памирыч
23251 / 9163 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
12.12.2012, 21:16
Цитата Сообщение от Костяныч Посмотреть сообщение
А окна открывать?
Приложения закрывать
Это нужно спросить в отдельной теме.
0
20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2
14.12.2012, 17:56  [ТС]
Я сделал вот так:
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
public MainWindow()
        {
            InitializeComponent();
 
            waveIn = new WaveIn();
            waveIn.DeviceNumber = 0;
            waveIn.DataAvailable += waveIn_DataAvailable;
            waveIn.RecordingStopped += new EventHandler(waveIn_RecordingStopped);
            waveIn.WaveFormat = new WaveFormat(8000, 1);
            writer = new WaveFileWriter(outputFilename, waveIn.WaveFormat);
        }
 
        WaveIn waveIn;
        WaveFileWriter writer;
        string outputFilename = "demo.wav";
 
        void waveIn_DataAvailable(object sender, WaveInEventArgs e)
        {
            writer.WriteData(e.Buffer, 0, e.BytesRecorded);
        }
 
        void waveIn_RecordingStopped(object sender, EventArgs e)
        {
            waveIn.Dispose();
            waveIn = null;
            writer.Close();
            writer = null;
        }
 
        private void button1_Click(object sender, RoutedEventArgs e)//Start recording
        {
            
            waveIn.StartRecording();
        }
 
        private void button2_Click(object sender, RoutedEventArgs e)//Stop recording, save
        {
            waveIn.StopRecording();
        }
Когда на запись нажимаю, он пишет, на стоп, сохраняет. Когда снова на запись нажимаю вылетает ошибка типа "Ссылка на объект не указывает на экземпляр объекта."....Как это исправить?
0
LisovskijArtyom
17.01.2013, 09:08
Цитата Сообщение от Костяныч Посмотреть сообщение
Я сделал вот так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public MainWindow()
        {
           [B] waveIn = new WaveIn();[/B]
// ...
            [B]writer = new WaveFileWriter(outputFilename, waveIn.WaveFormat);[/B]
        }
// ....
        void waveIn_RecordingStopped(object sender, EventArgs e)
        {
  [B]          waveIn.Dispose();
            waveIn = null;
            writer.Close();
            writer = null;[/B]
        }
Когда на запись нажимаю, он пишет, на стоп, сохраняет. Когда снова на запись нажимаю вылетает ошибка типа "Ссылка на объект не указывает на экземпляр объекта."....Как это исправить?
Ты создаешь элемент класса при инициализации. Создавай при записи, если в RecordingStopped всё разрушаешь.
Или же делай менее кординальное разрушение, а то от былого waveIn и writer ничего не остается совсем, а ты к этому "ничего" потом повторно пытаешься обратиться
369 / 341 / 108
Регистрация: 12.02.2013
Сообщений: 653
12.02.2013, 17:59
Неявное преобразование типа "System.EventHandler" в "System.EventHandler<NAudio.Wave.Stopped EventArgs>" невозможно.... Как быть?
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,231
12.02.2013, 19:26
подписываясь на событие, пишите не += new EventHandler(...);
а += new EventHandler<NAudio.Wave.StoppedEventArg s>(...);
3
369 / 341 / 108
Регистрация: 12.02.2013
Сообщений: 653
19.02.2013, 17:30
Создал кнопку Сохранить файл
C#
1
2
3
4
5
6
7
8
9
        private void button4_Click(object sender, EventArgs e)
        {
            saveFileDialog1.Filter = "wav files (*.wav)|*.wav|All files|*.*";
            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                saveFileDialog1.FileName = "запись.wav";
 
            }
        }
При записи wav-файл сохраняется в папке с программой, как его связать с кнопкой Сохранить, подскажите пожалуйста!!
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
20.02.2013, 21:28
C#
1
2
3
4
5
6
7
8
9
private void button1_Click(object sender, EventArgs e)
{
    var sfd = new SaveFileDialog();
    sfd.Filter = "wav files (*.wav)|*.wav|All files|*.*";
    sfd.FileName = "запись.wav";
    if (sfd.ShowDialog() == DialogResult.OK)
    {
    }
}
открывается диалоговое окно, выбираете куда сохранить и нажимаете ОК.
2
0 / 0 / 0
Регистрация: 14.02.2013
Сообщений: 3
06.04.2013, 22:22
Цитата Сообщение от Костяныч Посмотреть сообщение
Добавлено через 19 минут
С Computer разобрался...
Не подскажешь как? Сам не могу разобраться.
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
07.04.2013, 09:50
Цитата Сообщение от xakeppro Посмотреть сообщение
Не подскажешь как? Сам не могу разобраться.
в Ссылках добавьте библиотеку Microsoft.VisualBasic и пространство имён
C#
1
2
using Microsoft.VisualBasic;
using Microsoft.VisualBasic.Devices;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.04.2013, 09:50
Помогаю со студенческими работами здесь

Запись звука с микрофона и сохранение его в файл
Как записать звук с микрофона и сохранить его в файл. Например: Нажимаю на кнопку &quot;Записать&quot;, запись начинается. Нажимаю на...

Запись с микрофона в формат .wav
Добрый день! Задача такая нужен диктофон, который записывал бы в формате *.wav. Изначально я пробовал так: procedure...

Захват и сохранение звука с микрофона в реальном времени
Если есть готовое решение - дайте ссылку где посмотреть. Нужно следующее: Программа слушает микрофон, желательно не монопольно, и...

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

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


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru