使用FFmpeg获取海报框架(缩略图)

3
我正在尝试使用ffmpeg从视频文件中获取海报帧。
我一直在遵循这个tutorial,并得出了以下代码(该代码取自/改编自我给出的链接):
public bool GetVideoThumbnail(string path, string saveThumbnailTo, int seconds)
        {
            string parameters = string.Format("-i {0} {1} -vcodec mjpeg -ss {2} -vframes 1 -an -f rawvideo", path, saveThumbnailTo, seconds);

            if (File.Exists(saveThumbnailTo))
            {
                return true;
            }
            else
            {
                using (Process process = Process.Start(pathToConvertor, parameters))
                {
                    process.WaitForExit();
                }
                return File.Exists(saveThumbnailTo);
            }
        }

目前这段代码成功地在正确的目标位置(saveThumbnailTo)创建了一个文件,但图片完全是黑色的。我尝试更改代码中的秒数值,以确保我不仅仅是从视频开头得到了一张空白图片。顺便说一下,路径指的是我的视频存储位置。

我当前是这样调用上面的代码的:

GetVideoThumbnail(videoPath, folderPath + "/poster.jpg", 100)

然后将其传递给我的视图以显示图片。我只是想知道是否应该将“.jpg”作为文件扩展名,因为我不是完全确定?

编辑:当我从命令行运行相同的命令时,我会收到以下错误:

编解码器“mjpeg”的不兼容像素格式“yuv420p”,自动选择格式“yuvj420p”

它以黄色出现,而

[image2 @ 02S96AE0]无法从模式“poster.jpg”获取帧文件名号2 an_interleaved_write_frame():无效参数

以红色出现。

有人能帮我正确地使其工作吗?因为我完全不熟悉ffmpeg命令行,也不确定我做错了什么。我尝试删除vcodec参数并收到相同的错误消息。


你尝试过移除 -vcodec 参数吗? - Pablo Romeo
是的,但仍然收到相同的错误消息,我会更新我的问题。 - DevDave
你可以尝试添加:-r 1 - Pablo Romeo
你需要使用-r 1的原因是,如果不这样做,它会尝试创建一系列图像,我认为这就是你收到有关模式名称错误的原因。 - Pablo Romeo
1个回答

8

试试这个:

public bool GetVideoThumbnail(string path, string saveThumbnailTo, int seconds)
{
    string parameters = string.Format("-ss {0} -i {1} -f image2 -vframes 1 -y {2}", seconds, path, saveThumbnailTo);

    var processInfo = new ProcessStartInfo();
    processInfo.FileName = pathToConvertor;
    processInfo.Arguments = parameters;
    processInfo.CreateNoWindow = true;
    processInfo.UseShellExecute = false;

    File.Delete(saveThumbnailTo);

    using(var process = new Process())
    {
        process.StartInfo = processInfo;
        process.Start();
        process.WaitForExit();
    }

    return File.Exists(saveThumbnailTo);
}

简短说明:

  • f image2:输出为图像
  • vframes 1:从输入中取出一个帧
  • y:覆盖输出文件
  • "processInfo.CreateNoWindow = true" :不显示ffmpeg窗口

尝试使用不同的"seconds"参数值进行多次测试。此外,请确保"pathToConvertor"路径正确。

在Windows机器上运行最新版本的ffmpeg.exe,我已将此做法验证过。

请告诉我它的表现如何。


@Fengari,请问路径转换器应该是什么?我真的很困惑,它是ffmpeg.exe的位置吗? :O - Guruprasad J Rao
1
@GuruprasadRao 变量pathToConverter是指您的FFMPEG所在的字符串路径。该字符串通常存储在Web.config中。例如...........processInfo.FileName = Convert.ToString(ConfigurationManager.AppSettings["FFMPEGExePath"]); - Jimmy Shaw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接