Артефакты зеленой полосы при кодировании видео с FFMPEG и Python

Я пытаюсь кодировать (кодек VP8) и писать видео, используя FFMPEG (версия 2.3.3) и Python. Тем не менее, я получаю эти диагональные артефакты с зеленой полосой после того, как я закончил кодировать свое видео, и я не могу найти почему.

У меня есть последовательность кадров в памяти в виде numy ndarrays, которые я генерирую синтетически для целей тестирования, используя метод:

def _generate_test_images(self, samples=50):
    '''
    Creates an image array gradually changing from black to white
    '''
    pixelValues = np.linspace(0, 255, samples)

    imageList = [np.full((100, 100, 3), pixelValue, dtype=np.uint8)
                 for pixelValue in pixelValues]

    return np.array(imageList)

Затем я использую модуль подпроцесса Python, чтобы открыть канал для FFMPEG и записать данные изображения. Я пытался использовать stdin.write и общаться, но оба вызывают проблему с зеленой полосой. Вот как я взаимодействую с FFMPEG:

    import subprocess as sp
    params = get_params() #provides info like threads, frame size, etc.

    command = list()
    command.extend(['/opt/ffmpeg/bin/ffmpeg'])
    command.extend(['-y'])
    command.extend(['-f', 'rawvideo'])
    command.extend(['-vcodec', 'rawvideo'])
    command.extend(['-s', params['frameSize']])
    command.extend(['-pix_fmt', 'bgr24'])
    command.extend(['-r', '1'])
    command.extend(['-an'])
    command.extend(['-i', '-'])
    command.extend(['-an'])
    command.extend(['-codec:v', 'libvpx'])
    command.extend(['-quality', 'good'])
    command.extend(['-cpu-used', '0'])
    command.extend(['-b:v', params['bitrate']])
    command.extend(['-qmin', '4'])
    command.extend(['-qmax', '42'])
    command.extend(['-maxrate', '1M'])
    command.extend(['-bufsize', '2M'])
    command.extend(['-threads', params['threads']])
    command.extend(['-f', 'webm'])
    command.extend([params['target']])

    pipe = sp.Popen(command, stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE, bufsize=-1)
    pipe.communicate(input=frameArray.tostring())

Однако, когда мое видео закончено в кодировке, вот что я вижу:

Изображение с зеленой полосой артефактов

Чем это вызвано?

1 ответ

Решение

Это обычно связано с шириной, не делимой на 4 или 8 или каким-либо другим подобным числом.

Другие вопросы по тегам