Вопросы

Добрый день,

Может ктонибудь помочь разобраться с записью/проигрыванием звука на iOS устройствах? 
Нужно записывать звук в буффер (массив байтов). Нашли "замечатульную" библиотеку на github, которая позволяет обращаться к нативным методам устройства намрямую, и следуя инструкциям по записи звука в xCode пытаемся собрать тоже самое. Ниже привяжу ссылки... Библиотека мягко говоря не в лучшей кондиции такчто некоторые типы приходилось править вручную, и форматирование не вызывает восторга, но другого выбора нет. Если у когонибудь есть практика с другой библиотекой, или какиенибудь идеи, подскажите пожалуйста. Записывать надо обязательно в буффер, для дальнейшей обработки.

GitHub библиотека
Запись звука в xCode - github

IOS.rar

Изменено пользователем Martifan

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

17 ответов на этот вопрос

  • 0

Советую обратить внимание на библиотеку Bass. Буквально на днях решал похожую задачу под Android (аудио чат в пределах локальной сети) с использованием данной библиотеки. Она же доступна и под iOS.

Изменено пользователем Alex7wrt

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
9 часов назад, Alex7wrt сказал:

Советую обратить внимание на библиотеку Bass. Буквально на днях решал похожую задачу под Android (аудио чат в пределах локальной сети) с использованием данной библиотеки. Она же доступна и под iOS.

Эх примерчик бы того как вы захватываете потом и отправляете его клиентуи как принимаете. Уже нескольок недель гуглю в этом направлении и инфы ноль. А бы ло бы интересно посмотреть как это работает. И да находил инфу что через bass.dll это делают захватывают поток с устройсва (микрофона) в событии захвата потока добавляют заголовк для куска (заголовок кодека) и передают его на клиента, но инфы о том как клиент должен это получить и воспроизвести нету да и вообще не будет ли случаем прерывании мезжу полученными кусками и как с памятью обстоят дела ? я так понимаю что для этого мазахизма выделяется какойто буфер и внесго складывается или дописываетс и наверное передача идет попакетно а не потоком (record package). (и это толкьо малая часть вопросов :()

 

Вообщем если не сложно можете поделится примером :) а то вопросов больше чем ответов

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

спасибо за ответ но на Android как делать этого и без использывание Bass знаю мне интересует как это сделать на iOS

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 2
3 часа назад, Martifan сказал:

спасибо за ответ но на Android как делать этого и без использывание Bass знаю мне интересует как это сделать на iOS

Под Android я тоже делал аудио чат родными средствами, но через Bass получилось лучше и проще. В частности, там буферизация из коробки, можно эффекты накладывать, например усиление голоса при записи через микрофон. Поэтому и предложил, ведь под Bass код, что под Android, что под iOS, один и тот же.

4 часа назад, Виталий Иванов сказал:

Эх примерчик бы того как вы захватываете потом и отправляете его клиентуи как принимаете. Уже нескольок недель гуглю в этом направлении и инфы ноль. А бы ло бы интересно посмотреть как это работает. И да находил инфу что через bass.dll это делают захватывают поток с устройсва (микрофона) в событии захвата потока добавляют заголовк для куска (заголовок кодека) и передают его на клиента, но инфы о том как клиент должен это получить и воспроизвести нету да и вообще не будет ли случаем прерывании мезжу полученными кусками и как с памятью обстоят дела ? я так понимаю что для этого мазахизма выделяется какойто буфер и внесго складывается или дописываетс и наверное передача идет попакетно а не потоком (record package). (и это толкьо малая часть вопросов :()

 

Вообщем если не сложно можете поделится примером :) а то вопросов больше чем ответов

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

uses FMX.Radio.Bass;

var 
  BLoaded: boolean;
  chanPlay, ChanMic: Dword;
  avail, freq: word;
  buffer: TIDBytes;


procedure TForm1.OnCreate(Sender: TObject);
begin
    //Создаем UDP сервер 
    UDP_Rec:=TIDUDPServer.Create;
    with UDP_Rec do begin
        DefaultPort:=UDP_RecPort;
        BufferSize:=1600;
        BroadcastEnabled:=true;
        Active:=true;
    end;
    
    freq:=16000; //Частота дискретизации
    setlength(buffer,UDP_Rec.BufferSize);

    BLoaded:=BASS_Init(-1, 44100, 0, nil, nil); //Подключаем библиотеку
    BASS_RecordInit(-1); //Инициализируем запись
end;

//Захват звука с микрофона
procedure TForm1.Recording(Sender: TObject; const Point: TPointF);
begin
    isrecording:=not isrecording;
    if isrecording then begin
        UDP_Rec.OnUDPRead:=nil;
        chanMic:=BASS_RecordStart(freq, 1, 0, nil, nil);
        VoiceThread:=TVoiceThread.Create; //Создание потока для отправки по UDP
    end
end;

//Передача буффера в потоке
procedure TVoiceThread.Execute;
begin
    while isrecording do begin
        try
            avail:=BASS_ChannelGetData(chanMic, nil, BASS_DATA_AVAILABLE);
            if avail>=UDP_Rec.BufferSize then begin //Если в буффере собралось не меньше 1600 байт, отправляем
                try
                    BASS_ChannelGetData(chanMic, buffer, UDP_Rec.BufferSize);
                    UDP_Rec.Broadcast(Buffer,UDP_RecPort);
                except
                end;
            end;
        finally
            sleep(20);
        end;
    end;
    BASS_ChannelStop(chanmic);
    BASS_StreamFree(chanmic);
end;


//Создание канала для воспроизведения звука из буффера:
procedure TForm1.receiving(Sender: TObject);
begin
    chanPlay:= BASS_StreamCreate(freq, 1, 0, STREAMPROC_PUSH, nil);
    UDP_Rec.OnUDPRead:=UDP_RecRead;
    BASS_ChannelPlay(chanPlay, false);
end;

//Получаем буффер из UDP
procedure TForm1.UDP_RecRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle);
begin
    try
        BASS_StreamPutData(chanPlay, AData,length(AData))
    except
    end;
end;

Bass.zip

Изменено пользователем Alex7wrt

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

все хорошо спасибо большое
это все еще через Opus прогнать и будет просто супер

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
1 минуту назад, Martifan сказал:

все хорошо спасибо большое
это все еще через Opus прогнать и будет просто супер

Opus ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
1 минуту назад, Виталий Иванов сказал:

Opus ?

Opus это кодек который сжимает буфер и гораздо быстрее работает чат пре плохом интернете

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
28 минут назад, Martifan сказал:

Opus это кодек который сжимает буфер и гораздо быстрее работает чат пре плохом интернете

Это я понял, пример бы тоже был как ни ксате замечательным дополнением темы :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
41 минуту назад, Виталий Иванов сказал:

Это я понял, пример бы тоже был как ни ксате замечательным дополнением темы :)

сам у Bass есть этот модуль разберусь и результат вылажу

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
2 часа назад, Martifan сказал:

все хорошо спасибо большое
это все еще через Opus прогнать и будет просто супер

Методом проб и ошибок обнаружил, что для речи запись с частотой дискретизации 16000 выдает практически такое же качество, как и 44100, но ощутимо лучше, чем 8000. При этом используется одноканальная запись (моно), что с учетом 16 бит на семпл дает 32 кБ/с (256 кбит/с), что не сильно нагружает WiFi сеть. Потерь нет (и это в UDP протоколе).

Также, одна из причин, почему я не использую сжатие в данном приложении, это телефоны-приемники, которые у нас по большей части старые смартфоны с одноядерным процессорм. А в приложении кроме аудиочата есть и другие нагружающие фичи. Не хочется лишний раз нагружать проц и садить батарею, если и так все норм.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
4 минуты назад, Alex7wrt сказал:

Методом проб и ошибок обнаружил, что для речи запись с частотой дискретизации 16000 выдает практически такое же качество, как и 44100, но ощутимо лучше, чем 8000. При этом используется одноканальная запись (моно), что с учетом 16 бит на семпл дает 32 кБ/с (256 кбит/с), что не сильно нагружает WiFi сеть. Потерь нет (и это в UDP протоколе).

Также, одна из причин, почему я не использую сжатие в данном приложении, это телефоны-приемники, которые у нас по большей части старые смартфоны с одноядерным процессорм. А в приложении кроме аудиочата есть и другие нагружающие фичи. Не хочется лишний раз нагружать проц и садить батарею, если и так все норм.

да но при плохом интернете у вас будет дерганье речи или если это UDP вообще не дойдёт поток

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Может быть. Не могу подтвердить или опровергнуть ваше предположение, но в моем случае передача звука происходит в локальной сети, не в интернете. Через все роутеры, включая точку доступа со смартфона, все работало хорошо, без потерь. 

Изменено пользователем Alex7wrt

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

по локалке проблем не будет но у меня были такие проблемы при медленном интернете

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Можно еще поиграться с размером буфера в Bass, который измеряется в миллисекундах и по умолчанию равен 500. Чем он больше, тем меньше вероятность потерь, но больше задержка звука при стримминге.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Кому юудет интересно, собрал мини проект по примеру выше. Звук передает как ни странно, и да же приемлемого качества с минимальной задержкой :) спасибо всем кто участувет в этой теме :)

Сразу извиняюсь за говно код внутри примера, делалось не для эстетики, а показать другим что пример рабочий. :)

Chat Test_09.06.2018_19-04.rar

Изменено пользователем Виталий Иванов

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Теперь есть отправная точка :)  как это должно, теперь буду дальше эксперементировать. Нужно сделать теперь ещё сервер для того что бы это работало через NAT и проверить работу на Android

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 08.06.2018 в 14:44, Martifan сказал:

сам у Bass есть этот модуль разберусь и результат вылажу

Вечер добрый! И как успехи с прикручиванием кодека?

Изменено пользователем IVGSoft

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Похожий контент

    • От FREEFAR
      Всем доброго времени суток. 
      Казалось бы. Во время разработки и перед тем как подписали приложение сертификатом Distribution, пуши приходили норм. Но после того как прошли аудит Apple пуши куда-то пропали. FCM возвращал ошибку InvalidRegistration.
      Оказалось все достаточно просто. На сервере с которого мы отправляем пуш, В php скрипте, который отправляет пуши надо выставить
      sandbox = false
      Ура! Всем удачи)
    • От Bohdan
      Всем Привет!

      Платформа ios Delphi 10.2.2, хочу при нажатии на label показывать edit (для редактирования label.) Столкнулся с проблемой:
       Как отследить Tap  за пределами Edit чтобы его скрыть, не могу понять как это сделать.
    • От ENERGY
      Есть большой файл с анимацией, ~3 мб.  
      120 AnimCount - кадров, raws 10, одна картинка 400x400
      Под Android и Windows анимация прекрасно работает.
      Под iOS анимация скачет влево-вправо, или появляються куски предыдущего фрейма (нижней части) в верху текущей анимации.
      Я уже что только не делал, много раз менял файл, создавая его с разными raws, разными размерами картинок. Что-то меняется конечно, но остаются эти эффекты разной интенсивности.
      Файл склеиваю в своей проге из картинок, в финальном файле ошибок нет.
       
      Подскажите куда копать, просто замучался уже..
    • От Martifan
      Всем доброго времени суток
      может кто знает как на iOS распознать речь и получены результат записать текстовом поле
      как на Android сделать я знаю но на iOS не получается
       
      Спасибо за ранее
    • От Astghik
      Hello !!!
      I want onButtonClick create popup. I use TPopup component. All good, but on android "Back button" click closing forma. But I want close popup (when popup is shown).

       
      //---------------------------------------------------------------------------------
      void __fastcall  btn3PointsClick(TObject *Sender)
      {
          PopUpSettings->IsOpen = true;
          PopUpSettings->PlacementTarget = btn3Points;
          PopUpSettings->BringToFront();
      }
      //-------------------------------------------------------------------------------------
      void __fastcall FormCloseQuery(TObject *Sender, bool &CanClose)
      {
          try {
              if (PopUpSettings->IsOpen == true) {
                  CanClose = false;
              }
              else {
                  CanClose = true;
              }
          } __finally {
              PopUpSettings->IsOpen = false;
          }
      }
      //-------------------------------------------------------------------
       
    • От Rokweb
      Здравствуйте.
      Речь пойдёт об Android.
      Использовал в Berlin данный unit для проигрывания звуков (TMediaPlayer не подходит) и все отлично работало. Сейчас перешел на Tokyo и происходит зависание в цикле:
       
      while not GLoaded do begin Sleep(10); Application.ProcessMessages; end;  
      Модуль прикрепил в сообщении.
       
      Так же интересует - возможно ли, использовать стиль, созданный в процессе разработки Android приложения - в iOS и если да - то как это правильно реализовать (почти каждый контрол имеет сейчас свой стиль)?
       
      Прошу помощи.
      GameAudioManager.zip
    • От Edward Tarasov
      поставил этот патч 
      https://cc.embarcadero.com/item/30805
      Версия PAserver на mac стала - 10.1.1.37, test connection отвечает success, но при компиляции выдаеться ошибка - [PAClient Error] Error: E0014 Connection refused. Platform Assistant Server version mismatch - expecting version '10.0.1.23'. 
      10.0.1.23 - это старая версия PA... откатиться нельзя ибо не пашет, тоесть этот патч исправляет старую проблему - но добавляет эту... суть в том, как я понял после 4-х часовго гугления, что надо исправить PAclient, у которого версия почему то осталась старая... кто знает как с этим быть?
    • От tLink
      Всем доброго времени суток,
      Столкнулся с проблемой на iOS. На форме TabControl, на одной из вкладок лежит MapView (примерчик приложил). Если "свернуть/развернуть" приложение и походить по вкладкам, то пропадают иконки у TabControl, показывает как чёрные квадраты. Иконки установлены через ImageList. Такой же эффект и у ListView/Image на соседних вкладках. Можете что-то подсказать?
       
      project1 (2).rar
    • От Tumaso
      Подскажите, каким образом можно прочитать входящее СМС под iOS? Для Android на форуме есть работающий пример, а вот под iOS найти не удалось.
    • От Tumaso
      Столкнулся с неожиданной проблемой в iOS при работе с файлами: любые попытки чтения существующих файлов из System.IOUtils.TPath.GetDocumentsPath и любые попытки чтения/записи файлов в System.IOUtils.TPath.GetHomePath вызывают ошибку access denied. Где что нужно прописать, чтобы решить проблему работы с файлами?
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу