Я пытаюсь захватить представления Android в виде растровых изображений и сохранить их как файлы . mp4 файл.
Я использую MediaCodec для кодирования растровых изображений и MediaMuxer, чтобы мультиплексировать их в .mp4.
Используя цветовой формат YUV420p, я ожидаю, что входные буферы от MediaCodec будут иметь размер resWidth * resHeight * 1.5
, но Qualcomm OMX.qcom.video.encoder.avc
дает мне больше (независимо от того, какое разрешение я выберу). Я считаю, что он хочет, чтобы я сделал некоторое выравнивание в своем потоке входных байтов, но я понятия не имею, как узнать, что именно он ожидает от меня.
Вот что я получаю, когда плотно упаковываю свои данные во входные буферы на Nexus 7 (2013 г.) с использованием кодека Qualcomm: https://www.youtube.com/watch?v=JqJD5R8DiC8
А это видео сделано тем же приложением, которое работало на Nexus 10 (кодек OMX.Exynos.AVC.Encoder
): https://www.youtube.com/watch?v=90RDXAibAZI
Итак, похоже, что плоскость яркости в неисправном видео в порядке, но то, что случилось с плоскостью цветности, для меня загадка.
Я подготовил минимальный (2 класса) пример рабочего кода, раскрывающий эту проблему: https://github.com/eeprojects/MediaCodecExample а>
Вы можете получить видео, показанные выше, просто запустив это приложение (те же артефакты будут, если ваше устройство использует кодек Qualcomm).