Создание миниатюр видео в альбомном или портретном режиме

Я использую Nreco Video Converter для создания миниатюр видео. Вот код С#, который я использую.

(new NReco.VideoConverter.FFMpegConverter()).GetVideoThumbnail(fileSource, thumbNailPath, (float)0.1);

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

Кто-нибудь знает, как создать миниатюру видео в определенном режиме (пейзаж или портрет).


person iJade    schedule 26.03.2015    source источник
comment
См. Должны ли вопросы включать «теги» в свои заголовки? , где консенсуса нет, не должны!   -  person    schedule 26.03.2015


Ответы (2)


В видеофайлах есть параметр вращения, который вы можете прочитать с помощью различных других библиотек-оболочек ffmpeg. Многие игроки используют его для поворота экрана. См. здесь. Поскольку NReco не поддерживает это напрямую, вам придется считать это значение с какой-либо другой библиотекой и использовать его для поворота jpeg в потоке.

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

person frggu    schedule 26.03.2015
comment
Обратите внимание, что NReco можно использовать как для извлечения метаданных ориентации видео, так и для применения соответствующего поворота (см. мой ответ). - person Vitaliy Fedorchenko; 27.03.2015

Вы можете использовать ffmpeg для получения поворота из метаданных видео и применить соответствующий фильтр поворота во время извлечения эскиза. Поскольку NReco VideoConverter является оболочкой .NET ffmpeg, его также можно использовать для этого:

  1. Извлеките метаданные ориентации видео из консоли ffmpeg (событие LogReceived) с помощью методов Invoke или ConvertMedia, которые фактически не выполняют никакого преобразования. Данные вращения можно сопоставить с простым регулярным выражением.
  2. Составьте аргументы FFMpeg для соответствующего фильтра поворота (например: -vf "transpose=1" )
  3. Извлечь миниатюру с помощью метода ConvertMedia, который принимает дополнительные аргументы командной строки ffmpeg (см. фрагмент кода ниже)

(внутренне GetVideoThumbnail использует метод ConvertMedia):

var thumbSettings = new ConvertSettings() {
    VideoFrameCount = 1,
    VideoFrameRate = 1,
    MaxDuration = 1, // extract exactly 1 frame
    Seek = 0, // frame seek position
    CustomOutputArgs = String.Format(" -vf \"{0}\"", rotateFilter )   // rotation filter parameters
};
ffMpegConverter.ConvertMedia(inputFile1, null, thumbJpegOutputStream, "mjpeg", thumbSettings);

В результате вы получите миниатюру видео, повернутую в соответствии с метаданными ориентации видео. Полный код, реализующий все шаги, можно найти в пакете VideoConverter (пример Rotate).

person Vitaliy Fedorchenko    schedule 27.03.2015
comment
что такое rotateFilter ?? - person iJade; 27.03.2015
comment
Параметр видеофильтра FFMpeg для соответствующего поворота (подробности см. в документации ffmpeg). На самом деле есть 3 варианта поворота: 90 градусов (transpose=1), 180 градусов (vflip), 270 градусов (transpose=2). - person Vitaliy Fedorchenko; 27.03.2015