Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
rugga
0 / 0 / 0
Регистрация: 10.02.2014
Сообщений: 71
#1

Как использовать MediaCodec.createInputSurface()? - Программирование Android

17.12.2014, 02:40. Просмотров 371. Ответов 0
Метки нет (Все метки)

Цель: нужно нарисовать на surface (без отображения на экране) элементы с помощью convas. То, что находится на surface, нужно кодировать в avc формат. Полученные байты записать в файл, или просто получить байты (обрабатываем как хотим).
Нигде не нашел инфу, как использовать surface, для него же не создашь surfaceholder, как например для surfaceview.

Как пробовал:
В новом потоке создаю MediaCodec.
Часть настроек для MediaCodec:
Java
1
2
int colorFormat = MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface;
MediaFormat format = MediaFormat.createVideoFormat("video/avc", 1280, 720);
Далее указываю эти настройки кодеру и запускаю его.
Java
1
2
3
mEncoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
mSurface = mEncoder.createInputSurface();
mEncoder.start();
Тут самое интересное, метод createInputSurface() создает нам surface, в которую нужно что-то рисовать. Но нужно рисовать в новом потоке, в этом и сложность. Нужно рисовать в новом потоке, а объект (в которую рисуешь) находится в другом потоке.
Пробовал по разному, всегда вылетает исключение. Вот например после mSurface = mEncoder.createInputSurface(); вызывл новый поток
Java
1
new Thread(new DrawThread(mSurface)).start();
Код нового потока (в котором рисуешь)
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class DrawThread implements Runnable {
        volatile boolean mRunning1 = true;
        Surface mSurface;
        public DrawThread(Surface mSurface) {
            this.mSurface = mSurface;
        }
 
        public void run() {
            Canvas canvas;
            while (mRunning1) {
                canvas = null;
                try {
                    canvas = mSurface.lockCanvas(null);
                    if (canvas == null)
                        continue;
                    canvas.drawColor(Color.GREEN);
              } finally {
                  if (canvas != null) {
                      mSurface.unlockCanvasAndPost(canvas);
                }
              }
            }
        }
Объясните пожалуйста, что я ни так делаю? Как использовать этот MediaCodec.createInputSurface()?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.12.2014, 02:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как использовать MediaCodec.createInputSurface()? (Программирование Android):

MediaCodec - декодирование сжатого звука - Программирование Android
Здравствуйте, уважаемые форумчане. Пытаюсь при помощи MediaCodec из сжатых звуковых файлов формата MPEG Layer-3 получить исходные...

Как использовать TextView? - Программирование Android
Здрасте. Прошу прощение за нубский вопрос, как использовать TextViev? То есть, к примеру в main.xml есть TextViev ...

Как использовать Fingerprint - Программирование Android
Вопрос такой, хочу сделать вход в приложение по отпечатку пальца, как это сделать? Среда разработки Android studio.

JMonkeyEngine, как использовать на Андроид? - Программирование Android
Как использовать jME на андроид? (желательно в android studio)

Как использовать класс Dictionary? - Программирование Android
доброго времени суток форумчане! Пожалуйста помогите!!! Как использовать класс Dictionary(),,,обяснит пример показать((((

Как правильно использовать LeakCanary? - Программирование Android
как правильно использовать LeakCanary, чтобы можно было определять утечки во всем приложении, а не только утечки активити?

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.12.2014, 02:40
Привет! Вот еще темы с ответами:

Как использовать ListView.setHeaderView() - Программирование Android
Есть вот такой layout, описывающий нижнюю половину активити: <?xml version="1.0" encoding="utf-8"?> <LinearLayout...

Как использовать чужую библиотеку - Программирование Android
есть вот эта библиотека https://github.com/felipecsl/AsymmetricGridView в описании написано что делать, но не написано куда поместить...

Как использовать класс Cashemanager? - Программирование Android
для чего применяется\ класс Cashemanager как при помощи его методов сохранить значение в память или получить значение из памяти??

Spinner и OnClickListener как использовать? - Программирование Android
Появилась ошибка - error: local variable spinner is accessed from within inner class; needs to be declared final Если String select;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru