Pull to refresh

Comments 25

поэтому, если неразумно тыкать в экранные кнопки в рандомном порядке, то можно всё сломать

При блокировке экрана как себя поведет?
Да особо и не тестировал. Собственно, это для демонстрации работы — tutorial. Тут, чем проще тем лучше.
До этого момента не задумывался о существования софта, который мог бы как регистратор записывать, экономя энергию на выключенном экране. Т.е. насколько проблема для программы работать при заблокированном экране в последних версиях Android
А, понил. Если начать запись и только выключить экран, то на удивление, но продолжает писать видео в файл.
Если начать запись и свернуть приложение, то нет (как и полагается)
У меня Android 9 Pie
А как можно остановить медиарекордер без пересоздания всей сессии превью? Просто в этот момент видимый лаг случается… Если же делать просто остановку медиарекордера, то стопается и само превью…
по идее не должно, так как оно теоретически по разным потокам разбросано, то есть медиарекордер работает независимо (можно делать например так скрытую съемку, без превью). Почему лаг, шиш его знает.
В данной демонстрашке нет корректного закрытия камеры, может поэтому крашится.

Лаг не на UI, а у самой камеры(на превью). Если просто стопнуть медиарекордер, то surface, которую он отдал в CaptureSession будет не валидна, если менять сессию — то видна задержка переключения.
В стандартной камере как-то сделано, что при остановке записи превью не замирает на секунду.
Может они на чем-то более низкоуровневом стандартную камеру пишут? Вообще без surface концепций.
Конечно, думаю через тот же MediaCodec и муксер.
Но перспектива переделки на это сомнительна ради одной мелкой задержки)
Вроде как делается через persistant input surface, которая типа не отваливается. Но на сайте андроида сказано, что ее надо делать перед prepare() рекордера и не использовать тогда getSurface.
Но как это привязать к коду и в каком месте вообще тогда непонятно.
В целом там всё понятно, она создаётся и добавляет как в рекордер так и в таргеты при создании CameraSession.
Но у меня не получилось её заиспользовать всё равно)) Почему уже не помню)
Так а как конкретно привязать рекордер к persistant input surface? Я не нашел примеров.
Посмотрите джавадоки для MediaRecorder.setInputSurface
Там описано примерно. Создать Mediacodec.createPersistentInputSurface()
Установить его в MediaRecorder.setInputSurface() и в таргеты в КамераСессион.
Surface recorderSurface=MediaCodec.createPersistentInputSurface();
mMediaRecorder.setInputSurface(recorderSurface);

матерится на вторую строчку. пишет

setInputSurface is called in an invalid state: 8
@throws IllegalStateException if it is called after {@link #prepare} and before {@link #stop}.

Может из-за этого?
Если получится такой способ, то отпишитесь)
Так вроде теперь работает. Единственно что каждый новый экземпляр рекордера (после стопа предыдущего) теряет связь с этой PersistantSurface (поскольку она уже была определена в сессии), поэтому я сделал PersistantSurface статической, чтобы новый рекордер мог к ней заново прицепится через mMediaRecorder.setInputSurface(recorderSurface);.

Но смех в том, что лаг хоть и уменьшился, но остался. А я еще удивлялся, неужели камера открывается полторы секунды?
Короче главный тормоз это вот:
Slow Looper main: doFrame is 915ms late because of 2 msg, msg 1 took 912ms (h=android.view.ViewRootImpl$ViewRootHandler c=android.view.View$PerformClick

Может это связано с тем, что все творится в главном потоке? Но там вроде
коллбэки везде. Короче хз.
Причем это же и было в исходной версии, где стопалось превью, просто
я не обратил на это внимания, думая что дело в задержке из-за нового превью.

А стоп рекордера делаете на главном потоке?
Если да, то можно вынести его в фон.
А тогда целиком приложение падает. Я и asynTask делал и просто поток запускал джавовский.
Забыл, оказывается, в фон вынести инициализацию нового рекордера. Поэтому падало. Его надо после стопанья делать. А получалось до.
Так что теперь работает без лагов:)
Где-то исходники есть?)
Ага, закинул в конец статьи.
Sign up to leave a comment.

Articles