Код: Выделить всё
class MP4:
def __init__(self, fname, width, height, fps):
self.output = av.open(fname, 'w', format='mp4')
self.stream = self.output.add_stream('h264', str(fps))
self.stream.width = width
self.stream.height = height
# these 2 lines can be removed and the problem still reproduces:
self.stream.pix_fmt = 'yuv420p'
self.stream.options = {'crf': '17'}
def write_frame(self, pixels):
frame = av.VideoFrame.from_ndarray(pixels, format='rgb24')
packet = self.stream.encode(frame)
self.output.mux(packet)
def close(self):
packet = self.stream.encode(None)
self.output.mux(packet)
self.output.close()
Снимок экрана средства просмотра изображений показ входного кадра:

Снимок экрана VLC, воспроизводящего выходное видео MP4:

Как решить эту проблему? Я по-разному возился с атрибутомframe.colorspace, параметрами потока и VideoFrame.reformat, но это ничего не изменило; конечно, я мог ошибаться.
Как вы можете видеть, входные данные имеют простые плоские цветовые области, поэтому я сомневаюсь, что это какой-либо артефакт сжатия, например, YUV420 теряет часть цветности. информация или что-то подобное.
Подробнее здесь: https://stackoverflow.com/questions/790 ... en-by-pyav
Мобильная версия