Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование Windows Phone

Войти
Регистрация
Восстановить пароль
 
AynurSib23
0 / 0 / 0
Регистрация: 26.07.2016
Сообщений: 3
#1

Захват и передача/сохранение звука, получаемого с микрофона - Windows Phone

27.07.2016, 13:26. Просмотров 934. Ответов 0

Здравствуйте. Передо мной стоит такая задача: мне нужно брать звук из микрофона и передавать его. На данный момент я могу захватывать звук двумя способами:
  1. С помощью mediacapture;
  2. С помощью AudioGraph.

Рассмотрим второй вариант.

При работе с AudioGraph я создал и соединил такие узлы, как:
  1. узел устройства захвата;
  2. узел устройства вывода;
  3. узел вывода аудиокадра.
Все сделано по вот этому уроку: Звуковые графики
Вот как у меня выглядит метод вывода аудиокадра:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private byte[] _audioInBytes;
    unsafe private void ProcessFrameOutput(AudioFrame frame)
    {
        using (AudioBuffer buffer = frame.LockBuffer(AudioBufferAccessMode.Write))
        using (IMemoryBufferReference reference = buffer.CreateReference())
        {
            byte* dataInBytes;
            uint capacityInBytes;
            float* dataInFloat;
            ((IMemoryBufferByteAccess)reference).GetBuffer(out dataInBytes, out capacityInBytes);
            dataInFloat = (float*)dataInBytes;
            _audioInBytes = new byte[capacityInBytes];
            Marshal.Copy((IntPtr)dataInFloat, _audioInBytes, 0, capacityInBytes);
        }
    }


И каждые 480 миллисек. вызывается этот метод и я получаю массив байтов со звуком. Но я думаю, что тут у меня ошибка, потому что я не могу воспроизвести их, если засуну эти байты в InMemoryRandomAccessStream и отправлю этот поток в MediaElement как источник. Ну, или же мне сначала нужно добавить header, но какой именно? Я при настройке AudioGraph задаю лишь то, что сжатие не должно производится, то есть ставлю AudioProccessing.Raw.

По первому варианту:

Я могу или периодически вызывать _mediaCapture.StopRecordAsync(), а затем считывать данные из потока (ранее я вызываю _mediaCapture.StartRecordToStreamAsync()), а затем заново запускать запись. Но я думаю, что это было бы глупо, потому что сильно замедлилась бы работа.
Или же я могу периодически считывать данные из потока, не останавливая запись. Но я так пробовал, но опять таки снова не могу воспроизводить все это.
Так, подскажите пожалуйста, что мне делать?

Добавлено через 16 часов 43 минуты
Вот со вчерашнего дня кое-что сделал по первому варианту. Теперь я могу считывать байты и записывать их в mp3 файл, и все нормально работает.
Только вот почему то не могу записать их wav файл.
Можете сказать, из-за чего это?
Вот код начала записи в поток:
C#
1
2
3
4
MediaEncodingProfile encodingProfile = MediaEncodingProfile.CreateMp3(AudioEncodingQuality.Auto);
encodingProfile.Audio.ChannelCount = 1;
stream = new InMemoryRandomAccessStream();
await this.AudioCapture.StartRecordToStreamAsync(encodingProfile, stream);
А вот код, считывающий байты из потока:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private ulong FirstPos=0;
private async Task GetBytesFromStream()
{
     var reader = new DataReader(stream.GetInputStreamAt(0));
     newBytes = new byte[this.stream.Position-FirstPos];
     try
     {
           Bytes.Text = FirstPos + " " + this.stream.Position;
           ulong pos = this.stream.Position;
           this.stream.Seek(FirstPos);
           await reader.LoadAsync((uint)(this.stream.Size-FirstPos)); reader.ReadBytes(newBytes);
           FirstPos = this.stream.Size;
           this.stream.Seek(FirstPos);
     }
     catch (Exception ex)
     {
           rootPage.NotifyUser(ex.ToString()+ " GetBytesFromStream");
      }
}
И вот код, записывающий байты в файл:
C#
1
2
3
4
5
6
if (isPreviewing)
{
      await GetBytesFromStream();
      StorageFile file = await KnownFolders.PicturesLibrary.CreateFileAsync("sound.mp3",                       CreationCollisionOption.GenerateUniqueName);
      await FileIO.WriteBytesAsync(file, newBytes);
}
Добавлено через 12 минут
Как оказалось, байты берутся лишь из начала потока. Так что не работает.

Добавлено через 1 час 11 минут
Я дурак, там я не сменил вот это:
C#
1
var reader = new DataReader(stream.GetInputStreamAt(0));
На это:
C#
1
var reader = new DataReader(stream.GetInputStreamAt(FirstPos));
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.07.2016, 13:26
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Захват и передача/сохранение звука, получаемого с микрофона (Windows Phone):

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

Захват звука с микрофона - Java
Нужно считать звук с двух микрофонов и возможность выбирать микрофон для считывания. audioFormat = new AudioFormat(44100,...

Захват звука с микрофона - JavaScript
Какие существуют средства в HTML5 для захвата звука с микрофона, сохранения и последующей его передачи на динамики компьютера? Меня...

Захват звука с микрофона - C (СИ)
Подскажите пожалуйста с помощью каких библиотек и каких их функций можно захватить звук с микрофона. Нужен массив звуковых значений для...

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

Захват звука с микрофона без графической оболочки - C#
Добрый день, дамы и господа. Сразу скажу, что в C# я нуб полнейший, на уровне чайника писал простейшие скрипты под свои надобности. Сейчас...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.07.2016, 13:26
Привет! Вот еще темы с ответами:

Захват видео с экрана с записью звука с микрофона - C#
Добрый день. Требуется средствами C# 3.5 записать видео со звуком. Изображение - это состояние экрана, звук с микрофона. Необходима...

Реализовать захват звука с микрофона и его воспроизведение - Delphi
Мне необходимо реализовать захват звука с микрофона и его воспроизведение. Набросал такой код по этой статье:...

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru