Как извлечь последовательность кадров с помощью ffmpeg и получить ее с помощью подпроцесса. Открыть - PullRequest
0 голосов
/ 03 ноября 2019

Поскольку чтение отдельных кадров происходит довольно медленно, я попытался извлечь несколько кадров одновременно. Теперь у меня проблема в том, что ffmpeg возвращает не список, а кучу байтов. os: win10 python версии 3.7.4 ffmpeg извлекает фреймы из mp4

        command = [self.FFMPEG_BINARY,
                   '-loglevel', 'fatal',
                   '-ss', str(datetime.timedelta(seconds=frame_index / self._fps)),
                   '-i', os.path.join(self._path, self._filename),
                   '-threads', str(self.THREAD_NUM),
                   '-vf', 'scale=%d:%d' % (self._resolution[0], self._resolution[1]),
                   '-vframes', str(num_frames),
                   '-f', 'image2pipe',
                   '-pix_fmt', 'rgb24',
                   '-vcodec', 'rawvideo', '-']

        pipe = subprocess.Popen(command, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
        tmplist = []
        for _ in range(num_frames):
            output, err = pipe.communicate()
            tmplist.append(output)
            if err: print('error', err); return None;
            pygame.image.frombuffer(output, self._resolution, "RGB")

        return tmplist


Ожидается: список pygame Поверхности Получено: ValueError: Длина буфера не равна формату и разрешению

1 Ответ

0 голосов
/ 04 ноября 2019

Канал не может вернуть список, только поток. Вам нужно использовать такой формат, как yuv4mpegpupe, а затем проанализировать кадры. Или используйте предварительный расчет размера каждого кадра и считайте это количество байтов.

Например, rgb24 будет ширина, умноженная на высоту, время 3 байта.

...