MediaCodec — может ли входная поверхность кодировщика получать поверхностные текстуры с выходных поверхностей двух декодеров?

#android #android-mediacodec

#Android #android-mediacodec

Вопрос:

Я работаю над алгоритмом объединения двух видео вместе в MediaCodec на основе обычного теста ExtractDecodeEditEncodeTest CTS, и меня особенно интересует эта часть кода:

 outputSurface.awaitNewImage();
outputSurface.drawImage();
inputSurface.setPresentationTime(videoDecoderOutputBufferInfo.presentationTimeUs * 1000);
inputSurface.swapBuffers();
  

Где outputSurface находится выходная поверхность декодера и inputSurface входная поверхность кодировщика.

Предположим, у меня есть два медиаэкстрактора и два МедиаКодека, действующих как декодеры, и один кодировщик с предустановленным форматом, могу ли я просто сделать то же самое в цикле этого второго декодера?

 secondOutputSurface.awaitNewImage();
secondOutputSurface.drawImage();
inputSurface.setPresentationTime(prevSegmentEndNanos   videoDecoderOutputBufferInfo.presentationTimeUs * 1000);
inputSurface.swapBuffers();
  

Где prevSegmentEndNanos находится временная метка последнего буфера предыдущего декодера непосредственно перед завершением декодирования. inputSurface это та же самая поверхность кодировщика.

Возможно ли это?

Ответ №1:

Да, это должно работать просто отлично.

Комментарии:

1. Спасибо за ответ. Кстати, могут ли два декодера действительно передавать данные одному кодировщику с помощью этого метода, если это делается последовательно?

2. ДА. Вы могли бы (с помощью более сложного кода) даже получать выходные данные сразу с двух декодеров, смешивать / смешивать их и передавать в кодировщик (используя более продвинутый рисунок, чем текущий drawImage() ). Вам просто нужно убедиться, что оба декодера декодируют в выходные данные в одном и том же контексте EGL. Однако awaitNewImage() в этих случаях часть становится более сложной.

3. Если я правильно понимаю, мне нужно определить еще несколько вершин для прямых линий для drawImage() детали, верно? Нужен ли мне также отдельный цикл для второго декодера, который запускается сразу после завершения первого?