Как использовать MediaCodec.createInputSurface()?
Добавлено: 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()?
Нигде не нашел инфу, как использовать 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()?