Comments 26
поэтому, если неразумно тыкать в экранные кнопки в рандомном порядке, то можно всё сломать
При блокировке экрана как себя поведет?
del
Да особо и не тестировал. Собственно, это для демонстрации работы — tutorial. Тут, чем проще тем лучше.
До этого момента не задумывался о существования софта, который мог бы как регистратор записывать, экономя энергию на выключенном экране. Т.е. насколько проблема для программы работать при заблокированном экране в последних версиях Android
А как можно остановить медиарекордер без пересоздания всей сессии превью? Просто в этот момент видимый лаг случается… Если же делать просто остановку медиарекордера, то стопается и само превью…
по идее не должно, так как оно теоретически по разным потокам разбросано, то есть медиарекордер работает независимо (можно делать например так скрытую съемку, без превью). Почему лаг, шиш его знает.
В данной демонстрашке нет корректного закрытия камеры, может поэтому крашится.
В данной демонстрашке нет корректного закрытия камеры, может поэтому крашится.
Лаг не на UI, а у самой камеры(на превью). Если просто стопнуть медиарекордер, то surface, которую он отдал в CaptureSession будет не валидна, если менять сессию — то видна задержка переключения.
В стандартной камере как-то сделано, что при остановке записи превью не замирает на секунду.
В стандартной камере как-то сделано, что при остановке записи превью не замирает на секунду.
Может они на чем-то более низкоуровневом стандартную камеру пишут? Вообще без surface концепций.
Конечно, думаю через тот же MediaCodec и муксер.
Но перспектива переделки на это сомнительна ради одной мелкой задержки)
Но перспектива переделки на это сомнительна ради одной мелкой задержки)
Вроде как делается через persistant input surface, которая типа не отваливается. Но на сайте андроида сказано, что ее надо делать перед prepare() рекордера и не использовать тогда getSurface.
Но как это привязать к коду и в каком месте вообще тогда непонятно.
Но как это привязать к коду и в каком месте вообще тогда непонятно.
В целом там всё понятно, она создаётся и добавляет как в рекордер так и в таргеты при создании CameraSession.
Но у меня не получилось её заиспользовать всё равно)) Почему уже не помню)
Но у меня не получилось её заиспользовать всё равно)) Почему уже не помню)
Surface recorderSurface=MediaCodec.createPersistentInputSurface();
mMediaRecorder.setInputSurface(recorderSurface);
матерится на вторую строчку. пишет
setInputSurface is called in an invalid state: 8
mMediaRecorder.setInputSurface(recorderSurface);
матерится на вторую строчку. пишет
setInputSurface is called in an invalid state: 8
Точно.
Если получится такой способ, то отпишитесь)
Так вроде теперь работает. Единственно что каждый новый экземпляр рекордера (после стопа предыдущего) теряет связь с этой 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
Может это связано с тем, что все творится в главном потоке? Но там вроде
коллбэки везде. Короче хз.
Причем это же и было в исходной версии, где стопалось превью, просто
я не обратил на это внимания, думая что дело в задержке из-за нового превью.
Но смех в том, что лаг хоть и уменьшился, но остался. А я еще удивлялся, неужели камера открывается полторы секунды?
Короче главный тормоз это вот:
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
Может это связано с тем, что все творится в главном потоке? Но там вроде
коллбэки везде. Короче хз.
Причем это же и было в исходной версии, где стопалось превью, просто
я не обратил на это внимания, думая что дело в задержке из-за нового превью.
Можно ли как-нибудь прилепить к MediaRecorder surface от GLSurfaceView? Или как-то применить к каждому фрейму видео GLSL/AGSL?
Sign up to leave a comment.
Android Camera2 API от чайника, часть 2, пишем видео