我怎样才能得到我的视频与NReco中间的缩略图.视频转换器(或其他库)



我想用NReco.VideoConverter获得视频中间的缩略图。这是我的代码:

var ffMpeg = new NReco.VideoConverter.FFMpegConverter();
ffMpeg.GetVideoThumbnail(videoPath, thumbnailPath);

但是我只能得到第一帧的缩略图。

任何想法?

可以使用重载的GetVideoThumbnail方法从视频中的任何位置提取帧:

GetVideoThumbnail(String inputFilePath, String outputFilePath, Nullable<Single> frameTime)

其中frameTime是视频位置(以秒为单位),如API文档中所述:FFMpegConverter。GetVideoThumbnail方法(String, String, Nullable)

因此,要将第1帧提取到名为TestVideo.mp4的视频中,您可以使用:

FFMpegConverter ffmpeg = new NReco.VideoConverter.FFMpegConverter();
ffmpeg.GetVideoThumbnail(@"C:TestVideo.mp4", @"C:ExtractedFrame.jpeg", 1.0f);

要从字面上提取中间帧有点复杂,因为您需要首先找到总视频长度。这可以通过使用ffprobe来完成(可以在FFmpeg下载中找到,请参阅ffmpeg.org)。如何从ffmpeg输出中提取持续时间?以及如何在。net中生成进程并捕获其STDOUT ?我们可以设置一个进程来运行ffprobe并将持续时间字符串解析为浮点数,如下所示:

public void ExtractMiddleFrame()
{
    float duration = GetVideoDuration();
    FFMpegConverter ffmpeg = new NReco.VideoConverter.FFMpegConverter();
    ffmpeg.GetVideoThumbnail(@"C:TestVideo.mp4", @"C:ExtractedFrame.jpeg", duration/2.0f);
}
private float GetVideoDuration()
{
    float duration = 0.0f;
    Process ffprobe = new Process();
    ffprobe.StartInfo.FileName = @"C:ffmpeg-20150606-git-f073764-win32-staticbinffprobe.exe";
    ffprobe.StartInfo.Arguments = string.Format("-i {0} -show_entries format=duration -v quiet -of csv="p=0"", @"C:TestVideo.mp4");
    ffprobe.StartInfo.UseShellExecute = false;
    ffprobe.StartInfo.RedirectStandardOutput = true;
    ffprobe.OutputDataReceived += (sender, args) =>
    {
        if (args.Data != null)
            duration = ParseDurationString(args.Data);
    };
    ffprobe.Start();
    ffprobe.BeginOutputReadLine();
    ffprobe.WaitForExit();
    return duration;
}
private float ParseDurationString(string durationString)
{
    float duration = 0.0f;
    if (float.TryParse(durationString, out duration) == false)
        throw new Exception("Could not parse duration string.");
    return duration;
}

最新更新