- MediaProjection: How to record your Android device
- Requirements
- Accepting
- Recording
- Mirroring
- Как создать приложение для записи экрана андроид-смартфона
- Capture and Record Android Screen using MediaProjection APIs
- Android Media Projection Example : Record Screen Video by Code
- About Mohit Gupt
- Русские Блоги
- Запись видео на Android-MediaProjection
MediaProjection: How to record your Android device
For a recent project I tasked myself with finding a way to let the user record what they were seeing on the device. The nuts and bolts of the solution can be identified with two classes:
- MediaProjection was introduced in Lollipop and gives us the ability to capture what’s on the screen.
- MediaRecorder is pretty self explanatory, this class simplifies recording audio and video.
Requirements
- Android SDK v21
- WRITE_EXTERNAL_STORAGE and RECORD_AUDIO permissions
Accepting
The first step is to request permission to capture the screen.
Launching this intent will show a confirmation dialog to the user which allows them to authorise the screen capturing.
Once they accept, you can use the result code and data intent returned in onActivityResult, we are able to create a MediaProjection.
Recording
Next we need to define our MediaRecorder. I’m not too fussed about the specific details so I used the predefined high quality CamcorderProfile but you can create your own and specify everything from output format to bits per second. One slightly different thing is that I defined the height and width using the Window’s DisplayMetrics so it exactly matched the screen size.
One gotcha about the MediaRecorder is that the methods have to be defined in the correct order. For example, once setting the Camcorder Profile, you can’t change the AudioSource without crashing. The javadoc has more details to the state machine behind this.
Mirroring
Once we have the MediaRecorder and MediaProjection, we can create a virtual display that mirrors the projection and then bind it to the MediaRecorder’s SurfaceView. If you weren’t interested in the recording aspect of this demo, you could bind to your own SurfaceView.
Now everything is set up, tell the MediaRecorder to start() recording and you’ll notice the cast icon appear in your phone’s status bar.
When you’re ready, call stop(). It’s also important to release the MediaProjection and VirtualDisplay too. The recording will then be saved to the location you define in setOutputFile.
Источник
Как создать приложение для записи экрана андроид-смартфона
В этом уроке разберем код приложения, которое записывает видео с экрана устройства со звуком. До Андроид 5.0 приложение для записи видео с экрана мобильных устройств требовало рут-доступ и не гарантировало нормальную работу на устройствах разных производителей. Все изменилось в API 21 версии. Здесь появился класс MediaProjection, который предоставляет доступ для записи видео с экрана или звука с аудио системы.
Давайте рассмотрим код приложения для записи видео с экрана устройства.
Макет экрана содержит одну кнопку для старта и остановки записи.
Перейдем к коду. В главном пакете видим три класса- класс RecordApplication, класс MainActivity и класс RecordService.
Рассмотрим класс RecordApplication. Его вызов происходит в манифесте в секции application в строке android:name=.
Класс RecordApplication унаследован от класса Application. Согласно документации, класс Application или его наследник инициализируется перед любым другим классом, когда создается процесс приложения.
Здесь вызывается метод startService, который запускает сервис RecordService при старте приложения.
Класс RecordService унаследован от класса Service. О том, что такое сервисы, подробно можно узнать из видеоуроков на нашем канале, начиная с урока 92.
Если в двух словах, сервис – это некая задача, которая работает в фоне и не использует UI. Поскольку нам нужно записывать все, что происходит на экране, независимо от того, какое приложение запущено, поэтому мы и будем использовать сервис.
Здесь объявлены переменные классов:
MediaProjection — это токен, предоставляющий приложению возможность захватить содержимое экрана и/или записывать аудио системы.
MediaRecorder — класс, который используется для записи аудио и видео.
VirtualDisplay Представляет собой виртуальный экран, содержимое которого рендерится в Surface, который мы передаем методу createVirtualDisplay.
О том, что такое Surface, мы говорим в уроке 132.
В двух словах — это компонент, на который выводится изображение.
Объявляем еще несколько переменных: логическую running, которой будем присваивать true в процессе записи.
Далее параметры виртуального экрана, разрешение установим, а плотность пока не указываем.
Далее идет метод IBinder onBind, который позволяет приложению подключиться к сервису и взаимодействовать с ним через возвращаемый объект RecordBinder. Подробнее в уроке 97
Теперь методы жизненного цикла сервиса.
Метод onStartCommand срабатывает при старте сервиса методом startService, который вызывается в классе RecordApplication. Он возвращает флаг START_STICKY – это значит, сервис будет перезапущен, если будет убит системой.
В методе onCreate? который вызывается в начале работы сервиса, создаем отдельный поток serviceThread с использованием класса HandlerThread. Это вспомогательный класс для запуска нового потока, который имеет лупер, который может использоваться для создания обработчиков классов. На вход передаем произвольное имя потока и флаг THREAD_PRIORITY_BACKGROUND — Стандартный приоритет фоновых потоков.
Далее стартуем поток, сбрасываем значение переменной running и создаем mediaRecorder.
В методе onDestroy, который вызывается при остановке сервиса, просто вызываем метод суперкласса.
Метод setMediaProject будет вызываться в MainActivity и передавать объект mediaProjection.
Далее геттер для переменной running.
Метод setConfig устанавливает параметры виртуального экрана.
В методе startRecord проверяем, если объект mediaProjection не существует и переменная running имеет значение true, возвращаем false.
Вызываем здесь методы initRecorder и createVirtualDisplay, которые рассмотрим позже, стартуем запись вызовом mediaRecorder.start(); присваиваем переменной running = true; и возвращаем true.
Метод stopRecord выполняет обратные операции, останавливает запись и перезапускает mediaRecorder в состояние ожидания. Освобождаем virtualDisplay и останавливаем mediaProjection.
Теперь метод createVirtualDisplay, который вызывается выше в методе startRecord. Здесь выполняется создание виртуального экрана через метод mediaProjection.createVirtualDisplay, которому передается произвольное имя дисплея, его параметры, флаг VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, который позволяет отразить содержимое приватного дисплея, если его содержимое не отображается, и Surface.
Теперь в методе initRecorder, который вызывается выше в методе startRecord работаем с объектом mediaRecorder.
Метод setAudioSource устанавливает источник звука, используемый для записи.
setVideoSource задает источник видео, который будет использоваться для записи.
setOutputFormat устанавливает формат получаемого файла записи.
setOutputFile устанавливает целевое местоположение и имя файла записи.
setVideoSize устанавливает размер видео.
setVideoEncoder определяет кодировщик видео.
setAudioEncoder определяет кодировщик аудио.
setVideoEncodingBitRate устанавливает битрейт файла записи, здесь жестко прописано постоянное значение, равное 5 Мбит.
setVideoFrameRate задает частоту кадров, здесь 30 кадров в секунду.
Метод prepare() подготавливает mediaRecorder для записи и кодирования данных. Выполняем его в блоке try…catch с перехватом ошибки IOException.
Далее в методе getsaveDirectory задаем путь для сохранения файла записи и показываем тост об этом пользователю.
Ниже здесь создаем внутренний класс RecordBinder, это биндер для связи и взаимодействия с сервисом в приложении.
Источник
Capture and Record Android Screen using MediaProjection APIs
One of the new APIs introduced in Android 5.0 is the MediaProjection API. According to official documentation this API gives us the ability to capture screen contents with audio recording. As you may know screen cast is one of the new features introduced in Android. This Android MediaProjection API is the core API through which the screen cast takes place. By using this Android MediaProjection API we can also share screen over the network. This API also solves a very basic function which was needed in Android i.e. recording of screen programmatically. But sadly there are no samples available on how to do this. Therefore in this Capture and Record Android Screen using MediaProjection APIs tutorial, I would make an example where a video of device screen would be recorded, with audio.
Although Android media projection API solves the problem of recording and capturing device’s screen, but since it was introduced in lollipop version of android therefore as of now it cannot be used on API version lower than 21.
Android Media Projection Example : Record Screen Video by Code
To record our screen activity using Android media projection class we will be using MediaRecorder class, which would actually record the screen activity. Android media recorder class is a simple class used for recording any type of audio and video. In this example we will be using the MediaRecorder class to capture the output of MediaProjection class once the capture intent is fired. But before doing so please add these permissions in your manifest.
Please Note: If you don’t wish to record audio, then you don’t need to add the record audio permission. Only write external storage would be required.
Next, to use Android MediaProjection API lets make a layout:
Please note: truiton_short is just a drawable image, in your code, you may choose exclude it.
The above file would give a layout like this:
Next lets have a look at the main activity where screen recording would take place using the Android media projection APIs.
As you may see above, to start a media projection first an intent is created using createScreenCaptureIntent() method of MediaProjectionManager class. When user approves the screen cast request, media projection is started from the onActivityResult method, along with the media recording. By doing this, we are allowing the app to start a screen cast which is recorded on the device itself. This would generate an audio/video file in mp4 format on your SD card. Although if you don’t wish to record audio, you can can remove the setAudioSource and setAudioEncoder lines from the initRecorder() method. To view the full source code please visit the repo below:
The place where both Android MediaProjection class and MediaRecording class interact is when creating a virtual display using the createVirtualDisplay method. This method basically creates a virtual display where the screen contents are buffered on to a Surface. To capture the screen contents in a MediaRecorder , I initialized a media recorder above with video source as a surface using the MediaRecorder.VideoSource.SURFACE parameter. Then in the createVirtualDisplay method I specified the surface of media recorder by using mMediaRecorder.getSurface() method. By doing this I gave the input to media recorder from the media projection class in real time, through which a screen capture video recording file is generated. Hope this helps. Connect with us on Facebook, Twitter, and Google+.
About Mohit Gupt
An android enthusiast, and an iPhone user with a keen interest in development of innovative applications.
Источник
Русские Блоги
Запись видео на Android-MediaProjection
MediaProjection
До системы Android 5.0 не было открытого интерфейса записи видео.Если вы хотите записывать видео, вы должны сначала получить root-права.
В версии 5.0 Google, наконец, открыл интерфейс видеозаписи (фактически, строго говоря, это интерфейс для захвата экрана), который MediaProjection с участием MediaProjectionManager 。
Прежде всего, MediaProjectionManager, это сервис системного уровня, похожий на WindowManager, AlarmManager и т.д., вы можете получить его экземпляр через метод getSystemService:
После получения экземпляра процесс записи выглядит следующим образом
Сначала:
Аннотация метода createScreenCaptureIntent выглядит следующим образом:
Грубо говоря, этот метод вернет намерение. Вы можете передать это намерение через метод startActivityForResult. Чтобы запустить захват экрана, действие будет подсказывать пользователю, разрешить ли захват экрана (чтобы не дать разработчикам создать троянского коня для захват личной информации пользователя), вы можете получить результат захвата экрана через getMediaProjection.
Мы можем посмотреть код createScreenCaptureIntent:
Итак, здесь мы хотим создать неявное намерение вызвать программу записи экрана системы.
Затем, как сказано в комментарии выше, мы передаем это намерение через startActivityForResult, чтобы мы могли получить результат через onActivityResult и получить данные в намерении через getMediaProjection:
Мы получаем mediaProjection через getMediaProjection и регистрируем обратный вызов.
Посмотрите, что делает createVirtualDisplay:
Как видите, мы вызвали метод createVirtualDisplay класса MediaProjection, чтобы создать экземпляр VirtualDisplay, и сообщили значение нескольких параметров createVirtualDisplay:
Таким образом, контент, захваченный экраном, отображается на этом SurfaceView.
Реализация решений для записи с экрана и потоковой передачи для Android
1. Шаги по реализации записи экрана и потоковой передачи
Сбор информации
в основном Экран захвата для получения видеоданных и микрофон для получения аудиоданных Если это может быть достигнуто, мы также можем собрать некоторые аудиоданные, встроенные в приложение.
Преобразование формата данных
в основном предназначен для преобразования полученных видео и аудио в общие Стандартный формат для потоковой передачи push-уведомлений , Что может обеспечить нормальный просмотр на терминале просмотра.
Процесс кодирования
Если кодирование не выполняется, объем данных будет очень большим, что приведет не только к потере полосы пропускания, но и к снижению производительности терминала просмотра, поэтому необходимо исправить Аудио и видео данные для кодирования 。
Пакет и push
Эта логика может выполняться так же, как обычная прямая трансляция. Пакет и толчок 。
Резюме: На самом деле, разница между прямой трансляцией push-streaming с записью экрана и обычной прямой трансляцией состоит в том, что изменился источник сбора. На техническом уровне нам действительно нужно обработать данные, полученные с экрана. запись в стабильный формат кодирования.
Во-вторых, идея Android о записи экрана
Основные идеи реализации: MediaProjection + VirtualDisplay метод
После выпуска Android 5.0 Google открыл интерфейс захвата экрана. Мы можем использовать VirtualDisplay для получения данных источника видео для записи экрана.
Источник