Record any audio android

How to Record Internal Game Audio on any Android 10 device

If you play games on your Android phone or tablet, then chances are you may have wanted to record some gameplay at some point in time. If you own a modern device made by Huawei, Samsung, OnePlus, Xiaomi, ASUS, and some others, then you shouldn’t have any trouble recording your screen using the built-in screen recorder app. If your phone doesn’t have a pre-installed screen recorder app, then your options are limited when it comes to properly capturing gameplay. Most people download third-party screen recorders which don’t support recording the internal audio output due to Android limitations. Unless you root your phone or buy an accessory, you’ll have to settle with recording audio from your device’s microphones. Thankfully, those restrictions are being lifted in Android 10, meaning you can finally record internal game audio.

Record Internal Game Audio on Android 10

Follow these steps to download and set up the right screen recorder app that’s able to record the internal audio from other apps.

  1. Download “Screen Recorder – No Ads” from the Google Play Store. You need to be using version 1.2.1.4 or above for it to work if you’re using a first or second-generation Pixel smartphone. I confirmed this version works on my Google Pixel 2 XL running the stable Android 10 release.
  2. Open the app, and tap on “OK” when it asks you to choose a folder to save files to.
  3. Your pre-installed file manager app should show up, opened to the “Movies” folder by default. Tap “Allow access to ‘Movies’” at the bottom.
  4. A dialog box should appear asking you to confirm whether you want to give the app the ability to save its screen recordings to the “Movies” folder. Tap “Allow.”
  5. You should automatically jump back to the Screen Recorder – No Ads app. Open the sidebar menu and tap on “Settings.”
  6. Scroll down to Video Settings and make sure that “Record audio” is checked and that “Audio source” is set to “Internal sound.” Change the other options, such as video recording quality, as you see fit.
  7. Open the sidebar menu again and tap on “Videos.” The app should ask you to grant it some necessary permissions here, so go ahead and grant them. Tap on the floating video camera icon in the bottom right.
  8. You’ll be asked to grant the app the permission to “display over other apps.” This is needed so the app’s floating screen recorder toggle can be used outside of the app.
  9. Finally, tap on the floating video camera icon one more time. The app should exit to the home screen, and a floating toolbar should appear. From left to right: Start recording, take a screenshot, open settings, or close overlay.
  10. Tap on the left-most icon to start a screen recording. You’ll be shown a warning that the app can capture sensitive information…so obviously don’t try and record anything sensitive!
  11. When the app is recording your screen, you’ll see its icon in the status bar as well as another icon that informs you that an app is currently capturing your screen. To stop recording, simply pull down your status bar and tap on “STOP.”
Читайте также:  Как андроид подключить модемом для компьютера

Why isn’t the app recording audio from all games?

To explain why you can’t capture the audio in all apps and games, I need to explain how this feature works. Google added a new API in Android 10 that developers can use to capture audio playback from other apps. The API is called AudioPlaybackCapture, and it allows apps like screen recorders record audio from other apps so long as a few conditions are met:

  1. The user has to give their consent to allow the screen recorder app to record audio and video on their device. The screen recorder app must also be granted permission to record audio.
  2. The audio that is being captured must be specified as media, game, or unknown.
  3. The app/game from which you want to capture audio must have a certain flag set in their Manifest file. On Android Q, this flag defaults to true. On Android Pie, it must be manually set to true. The app/game must also allow its audio to be captured by non-system apps.

The first condition is almost always met because screen recorder apps wouldn’t be able to function otherwise. The second condition is usually met unless the developer didn’t bother setting an audio usage type. The third condition, however, is where the problem usually lies. The vast majority of apps and games aren’t targeting Android 10 yet, so they’ll have to explicitly opt-in to have their audio recorded. A lot of developers might not know about this new API and hence don’t know they can opt-in if their apps target Android 9. Games like PUBG Mobile, Fortnite Mobile, and most other games sadly haven’t opted in or updated to target Android 10, so there’s no way to record the audio from those games unless your OEM added a built-in screen recorder with this option.

I covered this feature and its limitations in greater detail in this earlier article, in case you’re interested in reaching out to the developer of your favorite game. Reaching out to the developer or waiting for them to update their app, which they’ll be required to do in late 2020, is all you can do for now.

Источник

Полный список

— пишем звук с помощью AudioRecorder

Рассмотренный на прошлом уроке MediaRecorder записывал звук сразу в файл. AudioRecorder не пишет данные, а позволяет нам их получать в приложении. т.е. является посредником между приложением и микрофоном. Когда мы стартуем запись, AudioRecorder начинает получать данные с микрофона и хранит их у себя во внутреннем буфере. Мы можем при создании AudioRecorder указать желаемый размер этого буфера и далее запрашивать из него данные методом read.

Т.е. AudioRecorder будет полезен, если вы хотите как-то обработать данные перед записью в файл или, если вы хотите отправлять данные не в файл, а куда-либо еще.

Напишем приложение, в котором рассмотрим основные методы работы с AudioRecorder.

Project name: P1301_AudioRecorder
Build Target: Android 2.3.3
Application name: AudioRecorder
Package name: ru.startandroid.develop.p1301audiorecorder
Create Activity: MainActivity

Добавим строки в strings.xml:

Нарисуем экран main.xml:

Верхние кнопки стартуют/останавливают запись звука с микрофона в AudioRecorder, нижние – чтение данных из AudioRecorder в наш буфер.

В манифесте добавьте разрешение на запись звука: android.permission.RECORD_AUDIO.

В onCreate мы вызываем свой метод создания AudioRecorder и выводим в лог состояние созданного объекта. Состояние можно получить методом getState. Может быть всего два состояния: STATE_INITIALIZED и STATE_UNINITIALIZED. Означают они соответственно то, что AudioRecorder к работе готов или не готов.

Читайте также:  Детская оболочка для андроида

В createAudioRecorder создаем AudioRecorder. Для этого нам понадобится несколько входных параметров:
— источник звука
— сэмплрейт
— режим каналов моно/стерео
— формат аудио
— размер буфера

Сэмплрейт мы ставим 8000. Режим — моно. Формат аудио – 16 бит. Чтобы узнать размер буфера, есть метод getMinBufferSize. Он, исходя из переданных ему на вход данных о формате аудио, возвращает минимально-возможный размер буфера, с которым сможет работать AudioRecorder. Мы получаем минимальный размер и в переменную internalBufferSize помещаем этот размер, умноженный на 4. Такой размер буфера будет в созданном AudioRecord.

Далее создаем AudioRecord. В качестве источника звука указываем микрофон. Также указываем сэмплрейт, режим каналов, формат и размер буфера.

В методе recordStart стартуем запись методом startRecording. С помощью метода getRecordingState получаем статус — идет запись или нет. Вариантов тут два: RECORDSTATE_RECORDING (запись идет) и RECORDSTATE_STOPPED (запись остановлена).

В recordStop останавливаем запись методом stop.

В readStart ставим метку isReading в true. Она будет означать, что мы сейчас находимся в режиме чтения данных из AudioRecorder. Далее создаем новый поток и чтение выполняем в нем, чтобы не занимать основной поток. Мы создаем свой буфер размером myBufferSize и читаем в него данные методом read. Это происходит в цикле, который проверяет, что мы в режиме чтения. Метод read на вход принимает массив (в который будут помещены данные), отступ (если вам надо прочесть данные не сначала, а с какой-то позиции), и размер порции получаемых данных. В readCount метод read возвращает число байт, которые он нам отдал. В totalCount мы суммируем общее количество полученных байтов.

У метода read кстати есть еще несколько реализаций, если эта вам не подходит. Подробнее смотрите в хелпе.

В методе readStop мы выключаем режим чтения, присваивая переменной isReading значение false. Поток из readStart прочтет это значение, выйдет из цикла и завершит свою работу.

В onDestroy выключаем режим чтения и методом release освобождаем ресурсы, занятые AudioRecord.

Все сохраняем, запускаем приложение.

В логах мы видим

minInternalBufferSize = 1024, internalBufferSize = 4096, myBufferSize = 8192
init state = 1

Мы видим, что минимальный размер буфера AudioRecorder насчитал равным 1024. Внутренний буфер будет 4096. Размер нашего буфера будет 8192. Состояние рекордера = 1, это значение переменной STATE_INITIALIZED, значит все ок, к работе готов.

Жмем Start record.

record start
recordingState = 3

Состояние записи рекордера = 3, это значение переменной RECORDSTATE_RECORDING, значит все ок, запись идет.

AudioRecorder сейчас получает данные с микрофона и держит их в своем буфере. Попробуем прочесть эти данные. Жмем Start read, и через несколько секунд Stop read

14:03:48.519: D/myLogs(14361): read start
14:03:48.519: D/myLogs(14361): readCount = 4096, totalCount = 4096
14:03:48.779: D/myLogs(14361): readCount = 4096, totalCount = 8192
14:03:49.039: D/myLogs(14361): readCount = 4096, totalCount = 12288
14:03:49.289: D/myLogs(14361): readCount = 4096, totalCount = 16384
14:03:49.549: D/myLogs(14361): readCount = 4096, totalCount = 20480
14:03:49.809: D/myLogs(14361): readCount = 4096, totalCount = 24576
14:03:50.069: D/myLogs(14361): readCount = 4096, totalCount = 28672
14:03:50.319: D/myLogs(14361): readCount = 4096, totalCount = 32768
14:03:50.569: D/myLogs(14361): readCount = 4096, totalCount = 36864
14:03:50.829: D/myLogs(14361): readCount = 4096, totalCount = 40960
14:03:51.079: D/myLogs(14361): readCount = 4096, totalCount = 45056
14:03:51.179: D/myLogs(14361): read stop
14:03:51.339: D/myLogs(14361): readCount = 4096, totalCount = 49152

Видим, что прошло несколько чтений буфера. Таким образом, мы получали данные с микрофона с помощью AudioRecorder.

Сколько байт занимает секунда звука

Разберемся, как подсчитать сколько места занимает звук, когда его пишешь. Вспоминаем наши параметры, которые мы задавали при создании AudioRecorder: сэмплрейт (как часто считывается звук) = 8000 Hz, формат (сколько места занимает одна запись) = 16 бит, канал = моно. Эти параметры означают, что одна секунда звука будет занимать 8000 * 16 * 1 = 128 000 бит = 16 000 байт.

Читайте также:  Обои для андроида обычные

Теперь посмотрим на логи. Первое чтение звука было в 14:03:48.519, а последнее в 14:03:51.339. Т.е. мы писали звук примерно три секунды. Три секунды – это 16 000 * 3 = 48 000 байт.

Снова смотрим логи, последнее значение totalCount = 49 152. Как видите, расчетная и реальная цифры похожи.

Давайте поменяем параметры в методе createAudioRecorder:

и снова посчитаем:

22 050 (сэмплрейт) * 16 (формат) * 2 (стерео) = 705 600 бит = 88 200 байт занимает теперь секунда звука. Как видите, при улучшении качества увеличились размеры.

Все сохраним, запускаем приложение. Жмем Start record, затем Start read и секунды через три Stop read.

14:15:29.959: D/myLogs(14567): read start
14:15:29.969: D/myLogs(14567): readCount = 8192, totalCount = 8192
14:15:29.969: D/myLogs(14567): readCount = 8192, totalCount = 16384
14:15:30.069: D/myLogs(14567): readCount = 8192, totalCount = 24576

14:15:32.479: D/myLogs(14567): readCount = 8192, totalCount = 237568
14:15:32.579: D/myLogs(14567): readCount = 8192, totalCount = 245760
14:15:32.659: D/myLogs(14567): read stop
14:15:32.669: D/myLogs(14567): readCount = 8192, totalCount = 253952

Видим, что примерно за 3 секунды мы считали 253 952 байта. Смотрим наши подсчеты 88 200 * 3 = 264 600. Цифры снова близки.

Это было небольшое отступление от темы урока, чтобы вы имели представление о взаимосвязи таких параметров как время, сэмплрейт, формат, каналы, байты.

Слушатель отданных фреймов

Когда AudioRecorder отдает нам данные, он ведет подсчет отданных фреймов. Фрейм – это единица записи звука. Сколько байт занимает один фрейм? Это мы уже считали чуть раньше – формат * режим каналов. Т.е. если мы пишем звук в формате 16 бит/моно, то фрейм займет 16 * 1 = 16 бит = 2 байта.

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

Метод setRecordPositionUpdateListener устанавливает слушателя с методами onPeriodicNotification и onMarkerReached, которые я описал выше. Метод setPositionNotificationPeriod устанавливает кол-во фреймов для срабатывания onPeriodicNotification, а setNotificationMarkerPosition – для срабатывания onMarkerReached.

Т.е. метод onPeriodicNotification будет срабатывать каждые 1000 отданных фреймов. А onMarkerReached – по достижению 10000 отданных фреймов. В onMarkerReached мы остановим чтение.

Все сохраним, запустим приложение и жмем Start record, затем Start read. В этот раз мы можем вручную не останавливать процесс чтения, т.к. он остановится сам по достижении 10000 фреймов.

read start
readCount = 4096, totalCount = 4096
onPeriodicNotification
onPeriodicNotification
onPeriodicNotification
readCount = 4096, totalCount = 8192
onPeriodicNotification
onPeriodicNotification
onPeriodicNotification
readCount = 4096, totalCount = 12288
onPeriodicNotification
onPeriodicNotification
readCount = 4096, totalCount = 16384
onPeriodicNotification
onMarkerReached
onPeriodicNotification
readCount = 4096, totalCount = 20480

Видим, что onPeriodicNotification срабатывал примерно каждые 2000 байт, а onMarkerReached сработал около получения 20000 байт.

Вспоминаем, что один фрейм при текущих настройках занимает два байта. А значит, как мы и указали, метод onPeriodicNotification срабатывал каждые 1000 фреймов, а onMarkerReached – как только было получено 10000 фреймов

На следующем уроке:

— получаем фото и видео, используя системное приложение

Присоединяйтесь к нам в Telegram:

— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.

— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование

— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня

— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме

Источник

Оцените статью