Почему вывод ffmpeg-python не соответствует форме изображения? - PullRequest
1 голос
/ 09 ноября 2019

Я использовал модуль ffmpeg-python для преобразования видео в изображения. В частности, я использовал код, предоставленный официальным репозиторием git ffmpeg-python, как показано ниже

out, _ = (
    ffmpeg
    .input(in_filename)
    .filter('select', 'gte(n,{})'.format(frame_num))
    .output('pipe:', vframes=1, format='image2', vcodec='mjpeg')
    .run(capture_stdout=True)
)
im = np.frombuffer(out, 'uint8')
print(im.shape[0]/3/1080)
# 924.907098765432

Исходное видео имеет размер (1920, 1080) и pix_fmt 'yuv420p', но выходные данныеКод выше не 1920.

Я сам понял, что вывод ffmpeg.run () - это не массив декодированных изображений, а строка байтов, закодированная в формате JPEG. Чтобы восстановить изображение в массив numpy, просто используйте функцию cv2.imdecode (). Например,

im = cv2.imdecode(im, cv2.IMREAD_COLOR)

Однако я не могу использовать opencv в моей системе Linux. Итак, мой вопрос сейчас заключается в том, могу ли я получить простой вывод из ffmpeg-python напрямую, без необходимости конвертировать его с помощью opencv?

1 Ответ

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

Чтобы напрямую создать ffmpeg-python массив исходящих необработанных изображений, используйте следующую команду:

out, _ = (
    ffmpeg
    .input(in_filename)
    .filter('select', 'gte(n,{})'.format(frame_num))
    .output('pipe:', vframes=1, format='rawvideo', pix_fmt='rgb24')
    .run(capture_stdout=True)
)
im = np.frombuffer(out, 'uint8')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...