Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
Windows Phone Трудности с настройкой TexBox http://www.cyberforum.ru/windows-phone-dev/thread1785142.html
Делаю приложение для Windows Phone 7, в приложении есть три TextBoxа, в которые вводятся числа, в том числе и дробные, при нажатии на кнопку программа обсчитывает их взаимоотношение и выдает ответ. Столкнулся со следующими проблемами: 1. Приложение вылетает при введении букв в поля Textboxa, как это исправить или вовсе закрыть возможность ввода букв в эти поля? 2. Все дробные числа в TextBox...
Windows Phone Программное изменение цвета grid привет подскажите как можно изменить цвет grid программно http://www.cyberforum.ru/windows-phone-dev/thread1784032.html
Windows Phone Счетчик времени для плеера
Помоги создать счетчик времени для плеера. Типа после 00:60, должна появиться первая минута, а секунды идти с начала (01:00), но у меня просто продолжаются идти секунды (60, 61, 62 и т.д.), как это можно исправить?
При выборе видео приложение вылетает Windows Phone
private void Video_Click(object sender, RoutedEventArgs e) { FileOpenPicker filePicker = new FileOpenPicker(); filePicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary; filePicker.ViewMode = PickerViewMode.Thumbnail; // Filter to include a sample subset of file types filePicker.FileTypeFilter.Clear(); ...
Windows Phone Как достучаться до listview? http://www.cyberforum.ru/windows-phone-dev/thread1780525.html
Создал я Hub примерно такой: <Hub x:Name="Hub" x:Uid="Hub" Margin="0,76,0,0"> <HubSection x:Uid="HubSection1" Header="Карта" FontSize="20"> <DataTemplate> <my:MapControl /> </DataTemplate> </HubSection> <HubSection x:Name="hb2" x:Uid="HubSection2" Header="Местоположения"> <DataTemplate>...
Windows Phone Работа с коллекцией фотографий WP 8.1 Задача такова: инициализировать переменную изображением из коллекции(галереи) фотографий пользователя и вывести ее на экран. Я реализовал функцию, при вызове которой попадаю в коллекцию фотографий и затем выбираю нужную мне фотографию: public async void pickPhoto() { FileOpenPicker openPicker = new FileOpenPicker(); openPicker.ViewMode =... подробнее

Показать сообщение отдельно
AynurSib23
0 / 0 / 0
Регистрация: 26.07.2016
Сообщений: 3

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

27.07.2016, 13:26. Просмотров 661. Ответов 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));
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru