Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
rugga
0 / 0 / 0
Регистрация: 10.02.2014
Сообщений: 75
#1

Как использовать MediaCodec.createInputSurface()?

17.12.2014, 02:40. Просмотров 505. Ответов 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 - декодирование сжатого звука
Здравствуйте, уважаемые форумчане. Пытаюсь при помощи MediaCodec из сжатых...

Как использовать Fingerprint
Вопрос такой, хочу сделать вход в приложение по отпечатку пальца, как это...

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

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

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

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.12.2014, 02:40

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

Как использовать RadioButton в ListView?
Хочу использовать свой ListView с расположены на нем тремя TextView и...

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


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

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

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