Отображение YUV420p с использованием наложения Pygame приводит к зеленой полосе в верхней части изображения - PullRequest
0 голосов
/ 08 декабря 2018

Код выглядит следующим образом.Изображение декодируется библиотекой PyAV.Вверху картинки есть горизонтальная зеленая полоса.Вероятно, высота в 1 пиксель.У вас есть идеи, как этого избежать?Я видел много рекомендаций для плеера VLC, чтобы отключить аппаратное ускорение.Это уже отключено в Pygame.Я работаю в Windows10 64bit.

import av
import pygame
import time

container = av.open('video.mp4') # libx264 en-/decoded, pixel format yuv420p
container.streams.video[0].thread_type = 'AUTO'
frameSequence = container.decode(video=0)
for _ in range(100):
    image = next(frameSequence) #skip some frames
pygame.init()
trueResolution = pygame.display.list_modes()[0]  # corresponds to video, as it FULL HD
                                                 #also tested with HD
pygame.display.set_mode(trueResolution)
ovl = pygame.Overlay(pygame.YV12_OVERLAY,trueResolution)
ovl.display((image.planes[0], image.planes[1], image.planes[2]))
time.sleep(10)

Я также пытался заменить первые строки в каждой плоскости другими линиями, чтобы проверить, не повреждено ли изображение.Результаты совпадают, поэтому изображение кажется правильным.

UPD1.Ссылка на видео https://drive.google.com/file/d/1t6d5weBVeW4EWzGI1gytmUBwXF91dNC9/view?usp=sharing

Скриншот с зеленой линией вверху изображения The screenshot with a green line on top of the image

1 Ответ

0 голосов
/ 12 декабря 2018

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

Документация для Overlay предупреждает:

Объекты Overlay представляют доступ более низкого уровня каппаратное обеспечение дисплеяЧтобы использовать объект, вы должны понимать технические подробности наложения видео.

Таким образом, кто-то с большим опытом работы в области может предложить лучшее решение.

pygame.display.set_mode((1280,  718), pygame.RESIZABLE)
ovl = pygame.Overlay(pygame.YV12_OVERLAY,trueResolution)
ovl.set_location(pygame.Rect(0,-2,1280, 720))

Примечание также trueResolution следует определять по исходному потоку, а не полноэкранным режимам , поддерживаемым графической картой.

Также image в данном случае представляет собой VideoFrame Вы можете использовать его метод .to_image() для преобразования в изображение типа PIL или .to_rgb(), который может быть легче отобразить, если вы не хотите / не хотите использовать наложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...