How to convert uploaded video and get a screenshot from this file?
-
30-09-2019 - |
Question
I'm building a cms and I want users to be able to upload videos but I'm not familiar with video upload & conversion. Is there an example or has anybody coded a solution like this? I heard about ffmpeg but I don't know how to integrate it with asp.net.
As simple solution I can make my clients upload flv files but then I would still need to get a screenshot from that fvl.
Thanks
Solution
Answering author's question:
Does ffmpeg requires to be installed server side or just exe is enough?
ffmpeg.exe will be enough, no installation is required.
The code below gets a screenshot on captureTime
on video specified by videoFilename
variable, and saves it to the imageFilename
path.
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);
OTHER TIPS
I've used ffmpeg, but I found it easier to just use the pre-compiled .exe version. So in the backend, I would just launch ffmpeg.exe with the required command-line arguments to do the conversion, let it run and when it was finished the completed file was all ready to go.
A long, long time ago in my PHP4 days I used the following method, calling ffmpeg on the shell and creating a screenshot.
/**
* 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}");
}
It takes a supported video file as $sourcefile. The desired file location for the screenshot can be given by the $destfile parameter. Off course make sure that the given location is writeable for the executing user.
Hopefully this is also usable for anyone else who's looking for the right syntax.