Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
 Аватар для Donet
23 / 23 / 3
Регистрация: 19.11.2013
Сообщений: 74

Запись звука с микрофонов Line-In и Mic

16.01.2015, 14:06. Показов 2118. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написал программу на NAudio которая считывает уровни сигнала с микрофонов и записывает их в файл. Использую 4 моно микрофона два прикрепляю к правому и левому каналу Mic входа остальных два к правому и левому каналу Line-In входа. Считывания происходит нормально но возникает задержка между микрофонами которые подключены к Mic и Line-In как можно исправить эту задержку?

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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using NAudio;
using NAudio.Wave;
using System.IO;
 
namespace Audio2
{
    public partial class Form1 : Form
    {
        int i, j;
        private WaveIn waveInI;
        private WaveIn waveInII;
        Thread ControlCaller;
        short[] leftl = new short[48000];
        short[] rightl = new short[48000];
        short[] leftr = new short[48000];
        short[] rightr = new short[48000];
        ulong[] product = new ulong[48000];
        ulong k;
        bool write = true;
        public Form1()
        {
            InitializeComponent();
        }
        public void ControlMethod()
        {
            while (true)
            {
                if (i == 48000 || j == 48000)
                {
                    if(write)
                    {
                        string path = @"c:\temp\MyTest.txt";
                        string table = "\t";
                        FileStream fs = File.Create(path);
                        label4.BeginInvoke(new Action(() => { label4.Text = "Считано..."; }));
                        for (int n = 0; n < 48000; n++)
                        {
                            product[n] = (ulong)((ulong)leftl[n] * (ulong)rightl[n] * (ulong)leftr[n] * (ulong)rightr[n]);
                            k = k + product[n];
                            Byte[] info = new UTF8Encoding(true).GetBytes(leftl[n] + table + rightl[n] + table + leftr[n] + table + rightr[n] + table + product[n] + "\n");
                            fs.Write(info, 0, info.Length);
                        }
                        fs.Close();
                        label4.BeginInvoke(new Action(() => { label4.Text = k.ToString(); }));
 
                        write = false;
                    }
                    
                }
                else
                {
                    label4.BeginInvoke(new Action(() => { label4.Text = "Считуютса..."; }));
                }
                Thread.Sleep(5);
            }
 
        }
        private void button1_Click(object sender, EventArgs e)
        {
            if (i == 0)
            {
                if (comboBox1.SelectedIndex > -1)
                {
                    waveInI = new WaveIn();
                    waveInI.DeviceNumber = comboBox1.SelectedIndex;
                    waveInI.DataAvailable += waveInI_DataAvailable;
                    int sampleRate = 48000;
                    int channels = 2;
                    waveInI.WaveFormat = new WaveFormat(sampleRate, channels);
                    waveInI.StartRecording();
                }
                if (comboBox2.SelectedIndex > -1)
                {
                    waveInII = new WaveIn();
                    waveInII.DeviceNumber = comboBox2.SelectedIndex;
                    waveInII.DataAvailable += waveInII_DataAvailable;
                    int sampleRate = 48000;
                    int channels = 2;
                    waveInII.WaveFormat = new WaveFormat(sampleRate, channels);
                    waveInII.StartRecording();
                }
            }
            else
            {
                i = 0;
                j = 0;
                k = 0;
                write = true;
            }
        }
        void waveInI_DataAvailable(object sender, WaveInEventArgs e)
        {
            for (int index = 0; index < e.BytesRecorded; index += 4)
            {
                if (i < 48000)
                {
                    leftl[i] = (short)((e.Buffer[index + 1] << 8) | e.Buffer[index + 0]);
                    rightl[i] = (short)((e.Buffer[index + 3] << 8) | e.Buffer[index + 2]);
                    i++;
                }
            }
        }
        void waveInII_DataAvailable(object sender, WaveInEventArgs e)
        {
            for (int index = 0; index < e.BytesRecorded; index += 4)
            {
                if (j < 48000)
                {
                    leftr[j] = (short)((e.Buffer[index + 1] << 8) | e.Buffer[index + 0]);
                    rightr[j] = (short)((e.Buffer[index + 3] << 8) | e.Buffer[index + 2]);
                    j++;
                }
            }
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            int waveInDevices = WaveIn.DeviceCount;
            for (int waveInDevice = 0; waveInDevice < waveInDevices; waveInDevice++)
            {
                WaveInCapabilities deviceInfo = WaveIn.GetCapabilities(waveInDevice);
                comboBox1.Items.Add(deviceInfo.ProductName + ", " + deviceInfo.Channels + ")");
                comboBox2.Items.Add(deviceInfo.ProductName + ", " + deviceInfo.Channels + ")");
            }
            ControlCaller = new Thread(new ThreadStart(ControlMethod));
            ControlCaller.Start();
        }
 
        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            ControlCaller.Abort();
        }
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.01.2015, 14:06
Ответы с готовыми решениями:

WinAPI и запись звука с нескольких микрофонов
Прочитал в статьях о записи звука в Windows. Как я понял, существует две основные возможности: ASIO и Windows MME. Возникли следующие...

Запись звука одновременно с двух микрофонов
Как записать звук одновременно с двох микрофонов. есть встроенный в ноут микрофон - и подключаемый через вход для микрофона. ...

Существует ли способ перенаправить вывод аналогового звука на 3,5-джеки "Line In" и "Mic In", так чтобы слушать 5.1 аккустику?
Всем привет! Подскажите, существует ли способ перенаправить вывод аналогового звука на 3,5-джеки &quot;Line In&quot; и &quot;Mic In&quot;,...

4
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
16.01.2015, 15:08
...попробовать сменить драйвера на ASIO.
1
 Аватар для Donet
23 / 23 / 3
Регистрация: 19.11.2013
Сообщений: 74
22.01.2015, 16:37  [ТС]
Не помогло… :-(
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
22.01.2015, 16:43
- месторасположение всех микрофонов и расстояние?
- использовать корреляцию сигналов (первого и задержанного) для получения величины задержки и далее задерживать сохранение/запись выборок первого сигнала на эту величину. В стационарных условиях при одинаковом расстоянии скорее это будет константа, следовательно можно обойтись без корреляции.
1
8 / 8 / 6
Регистрация: 01.11.2012
Сообщений: 55
01.06.2016, 15:41
Когда я использовал ASIO, то заметил, что в задержке между линейным и микрофонным входом есть некая постоянная составляющая (17 семплов если не ошибаюсь) и случайная 1-6 семплов при частоте дискретизации 44100 и при уменшении например в 3 раза постоянная составляющая сдвига тоже в 3 раза уменьшается. Мне рекомендовали использовать WASAPI. Текст рекдомендации:
use WASAPI and perform synchronization manually. WASAPI's IAudioCaptureClient::GetBuffer method will give you both the stream position and stream time at which the position was recorded, from there you should be able to work out the time shift between each of the 4 mics and then perform "unshifting" yourself.
Если получится побороть задержку с помощью WASAPI, то прошу отписаться, сейчас нет времени проверять, но если это работает, то мне это пригодилось бы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.06.2016, 15:41
Помогаю со студенческими работами здесь

Простейший усилитель Mic-Out -> Line-Out
Начну с задачи. Есть некий боард на борту которого разведены только разъемы head-phone &amp; Line-in. Есть usb веб-камера с микрофоном....

Запись звука
привет всем. у меня случилась такая проблема. вообщем, записываю звук через стандартное приложение в Windows XP ( Пуск - все программы -...

Запись звука
OpenSuse 11.3 KDE Требуется снять звук с линейного входа. И в KMix и в alsamixer громкость показывается нормальная. Однако при этом...

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

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Семь 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. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера 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. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru