Видеокодер Nexus 7 2013 – искаженный вывод медиакодека

Я работаю над приложением, которое кодирует фильм с помощью кодировщика h.264 для галереи и других целей. Это приложение поддерживает различные соотношения сторон на выходе (1:1, 2:3, 3:2, 16:9, 3:4, 4:3). Я использую поверхностные входы для ввода/вывода из API 4.3.

Приложение нормально работает на многих устройствах (проверено на S3, Motorola G, Nexus 7 2012, Motorola X), однако я столкнулся с проблемой при запуске его на Nexus 7 2013.

В принципе, некоторые выходные разрешения работают, некоторые нет. 3:4 (720x960), 2:3 (720x1080) и 16:9 (1280x720) работают как положено, но остальные (1:1 (960x960), 3:2 (1080x720) и 4:3 (960x720)) выдают такой вывод:

http://imageshack.com/a/img811/7984/dtgh.png

Я предполагаю, что в кодировщике есть какое-то значение, жестко закодированное в кодировщике, которое рассматривает свою входную поверхность как имеющую другую ширину, чем она есть на самом деле - пиксельные линии кажутся «неправильными». Тем не менее, я в недоумении, что может вызвать это и как это обойти.

Ошибок в логе нет и кодек видеокодера выводит в лог правильную ширину и высоту поверхности при выводе медиаформата.

обновление: кажется, нет проблем при кодировании с шириной 360, 720 или 1280, при этом высота не влияет. Я не нашел другой ширины ниже 1280, которая бы работала.

update2: кажется, есть и другие ширины, которые работают: 180, 240, 640, 700. Не удалось найти никакой корреляции между ними.


person user3449998    schedule 22.03.2014    source источник
comment
Похоже на проблему несоответствия шага. Обычно, если ширина и высота кратны 16, вы в безопасности (с дополнительным допуском на 1080), но вы могли найти некоторые исключения.   -  person fadden    schedule 24.03.2014
comment
Спасибо за ответ. Я попытался преобразовать ширину/высоту в кратные 16 и 32, так как уже видел подобные рекомендации, но это не сработало. Все перечисленные разрешения, которые не работают, в любом случае кратны 16. Думаю, может быть это ошибка производителя.   -  person user3449998    schedule 26.03.2014
comment
У меня была такая же проблема на Nexus 7 2013 года. Он работает для многих разрешений (а именно, для любого широкоэкранного разрешения, такого как 1080p, 720p и т. д.). Это также работает для некоторых других случайных разрешений, но я пока не нашел шаблона, который ему нравится. Я отпишусь, если узнаю что-нибудь еще. Возможно, вы уже исправили это, так как этот пост довольно старый.   -  person Jim    schedule 11.08.2014
comment
Нет, я не исправлял это, но работал над этим со списком жестко заданных ширин (ширина — единственная, которая имеет значение) и округлением до ближайшего значения.   -  person user3449998    schedule 14.08.2014


Ответы (1)


Я считаю, что это как-то связано с чипсетом устройства. У меня точно такая же проблема со старым Motorola XT1058, в котором используется Qualcomm Snapdragon S4 Pro, тот же чипсет, что и в Nexus 7.

Проведя некоторое исследование, я обнаружил с помощью другого ответа, что в старых устройствах Qualcomm данные YUV должны быть выровнены по границе 2 КБ, но я не могу понять, как это исправить при использовании входной поверхности вместо буферов YUV.

Смотрите следующий принятый ответ для заявления о требованиях выравнивания Qualcomm:

Как добиться выравнивания шага и плоскости Y значения для кодировщика MediaCodec

Мой обходной путь заключается в том, что для старых устройств я буду использовать разрешения, которые, как я знаю, будут работать, это те, которые я могу получить, запросив профили видео с помощью CamcorderProfile API.

Основная проблема заключается в том, как определить, затронуто устройство или нет, поскольку API MediaCodec может предоставить только имя кодека, но не его версию.

person PerracoLabs    schedule 13.02.2020