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

Ответить
KaiTheKat
Сообщения: 2
Зарегистрирован: 17 дек 2014, 02:58

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

Сообщение KaiTheKat » 17 дек 2014, 03:01

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

Как пробовал:
В новом потоке создаю MediaCodec.

Часть настроек для MediaCodec:
int colorFormat = MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface;
MediaFormat format = MediaFormat.createVideoFormat("video/avc", 1280, 720);

Далее указываю эти настройки кодеру и запускаю его.
mEncoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
mSurface = mEncoder.createInputSurface();
mEncoder.start();


Тут самое интересное, метод createInputSurface() создает нам surface, в которую нужно что-то рисовать. Но нужно рисовать в новом потоке, в этом и сложность. Нужно рисовать в новом потоке, а объект (в которую рисуешь) находится в другом потоке.
Пробовал по разному, всегда вылетает исключение. Вот например после mSurface = mEncoder.createInputSurface(); вызывл новый поток

new Thread(new DrawThread(mSurface)).start();

Код нового потока (в котором рисуешь):
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()?

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

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

Сообщение doter.ua » 17 дек 2014, 11:06

Код не читабельный. Используйте теги code
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Ответить