Alex7wrt

Пользователи
  • Публикаций

    447
  • Зарегистрирован

  • Посещение

  • Победитель дней

    16

Весь контент Alex7wrt

  1. Добрый день. Столкнулся со следующей задачей: не получается использовать микрофон под iOS. В документации Apple нашел следующее: ссылка. Судя по этой информации, начиная с iOS 10 нужно выполнять запросы на разрешение использования тех или иных функций. Кто-нибудь знает как добавить запрос на разрешение использования микрофона в iOS? На тестируемом устройстве установлена iOS 11.4. Среда 10.1.2.
  2. Проверьте в Project->Options->User Permissions проставлены ли разрешения на Modify Audio Settings и Record Audio (предполагаю, что после Bass_Init вы пишите Bass_RecordInit, как в моем примере).
  3. Измените в Deployment RemotePath этого файла на assets\internal\
  4. Alex7wrt

    Audio Streaming

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

    Audio Streaming

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

    Audio Streaming

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

    Audio Streaming

    Под Android я тоже делал аудио чат родными средствами, но через Bass получилось лучше и проще. В частности, там буферизация из коробки, можно эффекты накладывать, например усиление голоса при записи через микрофон. Поэтому и предложил, ведь под Bass код, что под Android, что под iOS, один и тот же. Поделиться не сложно. Ниже надергал основную схему из того приложения, о котором говорил выше. 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
  8. Alex7wrt

    Audio Streaming

    Советую обратить внимание на библиотеку Bass. Буквально на днях решал похожую задачу под Android (аудио чат в пределах локальной сети) с использованием данной библиотеки. Она же доступна и под iOS.
  9. uses VCD: TVideoCaptureDevice; ABitmap: TBitmap; bd: TBitmapData; ----------------------- В событии OnVideoBufferReady добавляете: VCD.SampleBufferToBitmap(ABitmap,true); with ABitmap do begin if Map(TMapAccess.ReadWrite, bd) then try // Здесь делаете преобразования пикселей битмапа с помощью функций bd.GetPixel и bd.SetPixel finally Unmap(bd); end; SaveToFile('Сохраняем ABitmap'); Free; end; end;
  10. Добрый день. Только сегодня узнал о такой штуке как GDPR о защите персональных данных пользователей из ЕС, в соответствии с которой Google вводит что-то вроде инструмента разрешения для обработки данных пользователей, которые используются для подбора рекламы в AdMob. Кто-нибудь знает об этом более подробно? Прежде всего интересует, какие изменения нужно вносить в приложение, чтобы реклама продолжала отображаться в баннере.
  11. А в тех приложениях, где вы видели подобное окно, была информация о том, что личные данные собирает Google для рекламы или же о том, что сам разработчик приложения собирает данные для своих целей?
  12. Alex7wrt

    Не выбирается цвет кнопки

    Кидаете на форму панель, нажимаете на нее правой кнопкой - > Edit Custom Style - > И там в стиле меняете свойство Fill
  13. Спасибо за подробный ответ. Но дело в том, что лично я никаких данных пользователя не собираю. Насколько я понял, данные собирает Google для отображения рекламы в баннере, который есть в приложении. Какие именно данные собирает Google, я тоже не знаю. Поэтому я не понимаю, как реализовать те пункты, которые вы указали. На странице Admob есть ссылка на инструкцию (https://developers.google.com/admob/android/eu-consent) как отобразить диалоговое окно в Android Studio. Но как это сделать в FMX не понятно. И, кстати, также интересует вопрос, что будет, если не выводить диалоговое окно, если ничего не предпринять? Приложение перестанет быть доступным для стран ЕС или последуют какие-нибудь иные ограничения?
  14. Alex7wrt

    Не выбирается цвет кнопки

    Если нужно менять цвет, то выбирайте TRectangle, как выше писали. Он полностью заменяет TPanel + имеет много возможностей по оформлению заливки и рамки, даже углы можно закруглить и т.п.
  15. Спасибо за совет, но ваш второй ответ противоречит первому. Хотелось бы точно знать что к чему с этой штукой.
  16. Хорошо, если так и есть. Но инфа на странице Admob дает повод задуматься:
  17. Alex7wrt

    Вопросы по TChart

    У Canvas есть много методов для отрисовки различных объектов. Сетку и отрезки рисую с помощью DrawLine, подписи - FillText, сам график - FillPolygon либо FillPath. Если обычная диаграмма - FillRect, круговая - FillArc.
  18. Alex7wrt

    Вопросы по TChart

    Предлагаю рисовать на канве. По-моему это более универсальный вариант. Я, например, так и рисую графики.
  19. Alex7wrt

    OnMouseLeave для заполненного ListBox, Windows

    Добрый день Столкнулся со следующей задачей, и пока не могу ее решить: Есть заполненный ListBox, в общем случае он с вертикальной полосой прокрутки. Нужно отработать для него событие OnMouseLeave. Точнее говоря, нужно сделать так, чтобы, когда курсор мыши покидает его пределы, то делаем ListBox.Visible:=False. Но дело в том, что, во-первых, событие OnMouseLeave в общем случае не сработает, так как в заполненном ListBox-е это событие перехватывается его дочерними элементами, а во вторых вертикальная полоса прокрутки не учитывается в событиях мыши ListBox-а. К тому же, даже если я сделаю какую-нибудь внешнюю рамку, и буду обрабатывать OnMouseLeave для нее, то все равно при быстром движении мыши событие не происходит. Потому прошу подсказать оптимальный и надежный способ, как сделать ListBox невидимым, когда курсор мыши находится за его пределами. Наверно этот вопрос относится к любому компоненту, который полностью заполнен по площади дочерними компонентами, и в комплекте со скролбоксом.
  20. Alex7wrt

    OnMouseLeave для заполненного ListBox, Windows

    Да нет, таймер не походит. Нужен прямой подход.
  21. Alex7wrt

    OnMouseLeave для заполненного ListBox, Windows

    Спасибо за совет, но это смахивает на костыль )) И в каком событии проверять координаты? Кстати, есть ли способ узнать координаты курсора мыши в пределах всей формы с учетом дочерних компонентов?
  22. ИМХО, можно разместить версию с Target SDK 14, чтобы собрать как можно большую аудиторию, а в ноябре обновить приложение до 26.
  23. Alex7wrt

    AndroidManifest, мин. версия SDK

    Не уверен, что в этом дело, но попробуйте в Deployment снять галку с одной строки, где встречается libnative-activity.so и library\lib\armeabi\
  24. Alex7wrt

    Какой жест выбрать?

    TInteractiveGesture.Zoom
  25. Alex7wrt

    OnClick срабатывает не всегда!

    Если вы имеете ввиду, что событие OnClick (точнее говоря OnMouseUp) не наступает, когда палец находится за пределами контрола, то попробуте установить для контрола свойтсво AutoCapture:=True, чтобы он мог реагировать на события за его пределами.