Как конвертировать загруженное видео и получить скриншот из этого файла? - PullRequest
4 голосов
/ 21 апреля 2010

Я создаю cms и хочу, чтобы пользователи могли загружать видео, но я не знаком с загрузкой и преобразованием видео. Есть ли пример или кто-нибудь закодировал такое решение? Я слышал о ffmpeg, но не знаю, как интегрировать его с asp.net.

Как простое решение, я могу заставить своих клиентов загружать FLV-файлы, но тогда мне все равно нужно будет получить скриншот с этого fvl.

Спасибо

Ответы [ 3 ]

4 голосов
/ 21 апреля 2010

Отвечая на вопрос автора:

Требуется ли установка ffmpeg на стороне сервера или просто exe достаточно?

ffmpeg.exe будет достаточно, установка не требуется.

Приведенный ниже код получает снимок экрана captureTime для видео, указанного в переменной videoFilename, и сохраняет его в пути imageFilename.

Process ffmpeg = new Process();
ffmpeg.EnableRaisingEvents = true;
ffmpeg.StartInfo = new ProcessStartInfo
{
    FileName = this.ffmpegPath,
    Arguments = string.Format(
        "-i \"{0}\" -an -y -s 320x240 -ss {1} -vframes 1 -f image2 \"{2}\"",
        this.videoFilename,
        DateTime.MinValue.Add(this.captureTime).ToString("HH:mm:ss:ff", CultureInfo.InvariantCulture),
        this.imageFilename
    ),
    WorkingDirectory = this.workingDirectory,
    UseShellExecute = false,
    RedirectStandardError = true,
    RedirectStandardOutput = true,
    WindowStyle = ProcessWindowStyle.Hidden
};

ffmpeg.Start();
ffmpeg.WaitForExit(this.timeout);
2 голосов
/ 21 апреля 2010

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

0 голосов
/ 16 августа 2011

Давным-давно, в дни моего PHP4, я использовал следующий метод, вызвав ffmpeg для оболочки и создав скриншот.

/**
 * Create a snapshot of a videofile and save it in jpeg format
 */
function snapshot($sourcefile,$destfile,$width=184,$height=138,$time=1){
    $width=floor(($width)/2)*2;
    $height=floor(($height)/2)*2;
    exec("ffmpeg -i {$sourcefile} -s {$width}x{$height} -t 0.0001 -ss {$time} -f mjpeg {$destfile}");
}

Он принимает поддерживаемый видеофайл как $ sourcefile. Желаемое местоположение файла для скриншота может быть задано параметром $ destfile. Конечно, убедитесь, что данное местоположение доступно для записи исполняющему пользователю.

Надеюсь, это также пригодится всем, кто ищет правильный синтаксис.

...