Я использую MediaCodec для декодирования видео и использую sws_scale (из ffmpeg) для его масштабирования. Я могу работать с одним специальным цветовым форматом, например. YUV420P и масштабируйте его до целевого размера. Но мне нужно выполнить некоторые подготовительные работы, такие как получение размера строки и memcpy выходного буфера в три простых фрагмента (данные [0], данные [1], данные [2]). И формат выходного цвета декодера различается на разных устройствах. .Если я получу цветовой формат, есть ли в ffmpeg способ автоматического масштабирования без специальных действий (конечно, цветовой формат должен поддерживаться ffmpeg)?
Как масштабировать изображение YUV из вывода MediaCodec с любым цветовым форматом?
Ответы (2)
В swscale/libavutil нет функции для прямого использования цветового формата OMX (MediaCodec), вам нужно сопоставить форматы вручную. Но вам не нужно запоминать выходной буфер в три отдельных буфера, вы можете просто установить три указателя данных data[0], data[1] и data[2] так, чтобы они указывали на выходной буфер из MediaCodec (та же точка в буфере, из которого в противном случае вы бы записали память).
Обычные цветовые форматы (такие как YUV420P и NV12) должны работать нормально, вам просто нужно настроить сопоставление между константами формата. Но некоторые декодеры MediaCodec (в частности, qualcomm) часто используют проприетарный мозаичный формат, для расшифровки которого требуется гораздо больше усилий, а swscale не поддерживает его напрямую, вам нужно расшифровывать его самостоятельно.
Это просто интуитивное предложение, основанное на моем опыте работы с OMX на Raspberry Pi, но вы можете проверить, предоставляет ли библиотека Stagefright какие-либо интерфейсы OMX, подобные C/C++, для NDK — в этом случае, если есть не только компонент декодера но также и компонент изменения размера (у Raspberry Pi есть такой компонент ), тогда вы можете создать конвейер OMX, и тогда компоненты смогут автоматически согласовывать форматы, но это всего лишь предположение, я никогда не заглядывал так глубоко в Stagefright и знаю, что он предназначен для использования из Уровень Java через MediaCodec и другие классы, но все же посмотреть можно. Если у Stagefright есть такой API, я могу предоставить некоторый код-оболочку OMX, который упрощает использование компонентов, которые я сделал для Raspberry Pi, поскольку создание кода OMX с нуля требует довольно много работы.
ИЗМЕНИТЬ
Я еще немного погуглил об этом, так как это показалось интересным, и нашел медиафайл NDK sample - кажется, что реализация OMX от Broadcom сильно отличается, так что все равно большую часть материала придется собирать с нуля . Можете ли вы объяснить немного больше, почему вам нужно это сделать? Если бы целью было только отображение декодированного потока, вы могли бы установить поверхность предварительного просмотра на уровне Java, поэтому я предполагаю, что цель декодирования - какая-то другая.