Как масштабировать изображение YUV из вывода MediaCodec с любым цветовым форматом?

Я использую MediaCodec для декодирования видео и использую sws_scale (из ffmpeg) для его масштабирования. Я могу работать с одним специальным цветовым форматом, например. YUV420P и масштабируйте его до целевого размера. Но мне нужно выполнить некоторые подготовительные работы, такие как получение размера строки и memcpy выходного буфера в три простых фрагмента (данные [0], данные [1], данные [2]). И формат выходного цвета декодера различается на разных устройствах. .Если я получу цветовой формат, есть ли в ffmpeg способ автоматического масштабирования без специальных действий (конечно, цветовой формат должен поддерживаться ffmpeg)?


person Frank Bush    schedule 17.10.2014    source источник


Ответы (2)


В swscale/libavutil нет функции для прямого использования цветового формата OMX (MediaCodec), вам нужно сопоставить форматы вручную. Но вам не нужно запоминать выходной буфер в три отдельных буфера, вы можете просто установить три указателя данных data[0], data[1] и data[2] так, чтобы они указывали на выходной буфер из MediaCodec (та же точка в буфере, из которого в противном случае вы бы записали память).

Обычные цветовые форматы (такие как YUV420P и NV12) должны работать нормально, вам просто нужно настроить сопоставление между константами формата. Но некоторые декодеры MediaCodec (в частности, qualcomm) часто используют проприетарный мозаичный формат, для расшифровки которого требуется гораздо больше усилий, а swscale не поддерживает его напрямую, вам нужно расшифровывать его самостоятельно.

person mstorsjo    schedule 17.10.2014
comment
Спасибо, mstorsjo. Да, я знаю, что мне нужно сопоставить цветовой формат MediaCodec с pix_fmt в ffmpeg. Кроме того, я должен установить указатели данных и работать с указателями данных назначения. Если это можно сделать автоматически, передав pix_fmt, это будет очень замечательно. Потому что существует слишком много форматов, с которыми нужно иметь дело. Я считаю, что размер строки, который возвращает av_image_alloc, может иметь некоторую помощь, но размер другой ориентации (отношение к высоте) также отличается от разных pix_fmt. У вас есть какие-либо предложения? - person Frank Bush; 17.10.2014

Это просто интуитивное предложение, основанное на моем опыте работы с 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, поэтому я предполагаю, что цель декодирования - какая-то другая.

person Rudolfs Bundulis    schedule 17.10.2014
comment
Спасибо, Рудольф. Раньше я думал об использовании Stagefright, но просто не знаю, как начать свою работу. Во-первых, нужно собрать код Stagefright под платформу Android. Во-вторых, нужно изучить API. И что мы хотим сделать, это работа для команды разработчиков Android. Вы согласны с этим? Поэтому я отказываюсь от этой мысли. - person Frank Bush; 17.10.2014
comment
Можете ли вы объяснить немного больше, почему вам нужно масштабирование? Что вы планируете делать с декодированным видео? - person Rudolfs Bundulis; 17.10.2014
comment
Потому что я хочу перекодировать видеофайл с меньшим битрейтом и размером для загрузки. Поэтому я использую MediaCodec, но он не может напрямую изменить размер. - person Frank Bush; 17.10.2014
comment
Спасибо за объяснение. Я видел несколько примеров транскодирования на основе Java (stackoverflow.com/questions/15950610/, stackoverflow.com/questions/15215636/), но это помогает только для битрейта . Другой вариант - предоставить предварительно скомпилированный двоичный файл FFmpeg (но опять же, проблемы с лицензией с x264) и вызвать его для перекодирования на уровне файла. Вы ориентируетесь на H.264? - person Rudolfs Bundulis; 17.10.2014