用C#从视频URL创建缩略图

4
我希望能够在C#中从视频URL生成缩略图。我已经搜索了很多,但没有找到一个简洁的方法。我尝试过使用NReco和MediaToolKit库,但它们都不能提取缩略图。使用ffmpeg也出现了繁琐的问题,也不能成功提取缩略图!

使用NReco:

var ffMpeg = new NReco.VideoConverter.FFMpegConverter();
string thumbnailJPEGpath = "http://localhost:81882/content/hashem.jpeg";
ffMpeg.GetVideoThumbnail(videoUrl,thumbnailJPEGpath);

使用ffmpeg:

try
        {
            System.Diagnostics.Process ffmpeg;

            string video;
            string thumb;

            video = Server.MapPath("~/Content/Movies/bye.mp4");
            thumb = Server.MapPath("~/Content/frame.jpg");

            ffmpeg = new System.Diagnostics.Process();

            ffmpeg.StartInfo.Arguments = " -i " + video + " -ss 00:00:07 -vframes 1 -f image2 -vcodec mjpeg " + thumb;
            ffmpeg.StartInfo.FileName = Server.MapPath("~/Content/ffmpeg.exe");
            ffmpeg.Start();
            ffmpeg.WaitForExit();
            ffmpeg.Close();
        }
        catch (Exception ex)
        {
            Response.Write("Error: " + ex.Message);
        }

考虑视频文件不是本地文件,而我只有一个直接链接到该文件的链接: 例如:http://phytonord.com/Film-Series/hana/26.mp4 有没有人有任何解决方案?有什么有效的示例代码吗?

已经测试了两种方法但都不起作用。您介意使用提供的视频链接进行测试吗? - Hashem Aboonajmi
3个回答

4
使用NReco创建视频缩略图:
我发现了我的问题:
1:我没有使用Server.MapPath。我只输入了相对路径。
2:视频文件不一定是本地的,它可以托管在其他地方。 NReco只下载所需部分的视频然后提取缩略图。你的视频文件应该在本地服务器的localhost目录下。我的意思是,如果你的网站正在开发中,视频文件在你的本地计算机文件夹中,它将无法正常工作,因为NReco需要HTTP响应头文件中的字节范围支持。
不可接受的链接:" http:// localhost:81882 / content / AVSEQ01.mp4"
因此,对于我的本地测试,我将我的视频文件移动到本地IIS目录:‪C:\ inetpub \ wwwroot \ AVSEQ01.mp4
//sample remote video file
//string videoUrl = "http://phytonord.com/Film-Series/peik%20sahar/1.mp4";

 //local video file
string localVideoFile = "http://localhost/AVSEQ01.mp4"
var ffMpeg = new NReco.VideoConverter.FFMpegConverter();
string thumbnailJPEGpath = Server.MapPath("~/Content/videoThumb.jpg");
ffMpeg.GetVideoThumbnail(videoUrl, thumbnailJPEGpath);

我原本以为需要先将文件下载到本地路径,结果发现可以直接使用URL。感谢你对此进行澄清。 - Weihui Guo
您提供的命令将创建单个缩略图像,那么如何在总视频长度的每秒后创建多个图像。目前,我们正在使用以下命令创建精灵图像。步骤1--> ffmpeg -i corpfilm.mp4 -s 280x150 -vf fps=1 thumb/img%03d.jpg 步骤2--> magick montage *.jpg 160x90 -geometry +0+0 overview.jpg 通过命令提示符。我们如何通过C#实现它?请指导。 - Hi Ten

0

如果有人想使用ffmpeg或NReco库创建多个缩略图以便创建精灵图像,以下是相关信息。

使用命令行 --> ffmpeg -i corpfilm.mp4 -s 280x150 -vf fps=1 thumb/img%03d.jpg

NReco.VideoConverter在底层使用System.Diagnostics.Process API执行ffmpeg;这意味着您可以运行任何在命令行中可用的命令。

对于此具体命令,VideoConverter的API等效命令如下:

var ffmpeg = new NReco.VideoConverter.FFMpegConverter();
ffmpeg.ConvertMedia(
  "corpfilm.mp4", null,
  " thumb/img%03d.jpg", null,
  new ConvertSettings() {
    CustomOutputArgs = " -s 280x150 -vf fps=1 "
  });

0

我看到问题已经被回答了,但是没有写得很清楚,所以这是我的答案:首先下载DLL

ffMpeg.GetVideoThumbnail(inputFile,outputFile, frameTime);
// Summary:
    //     Extract video frame from local video file at specified position
    //
    // Parameters:
    //   inputFile:
    //     path to local video file
    //
    //   outputFile:
    //     path to thumbnail jpeg file
    //
    //   frameTime:
    //     video position (in seconds)

这是我在项目中的做法

            var thumbNailMovieImage = PHYSICAL_PATH_UPLOAD_FILE + "/" + folder + "/thumb_" + filenameWithoutExtn + ".jpg";
            var ffMpeg = new FFMpegConverter();
            ffMpeg.GetVideoThumbnail(path, thumbNailMovieImage, 1);

现在运行这段代码并检查缩略图文件的位置。

有没有办法从实际视频链接中获取返回图像? - kabijoy
因为我正在使用相同的视频转换器,所以我不想将图像返回到本地文件夹。我想要从返回的图像(来自视频文件/URL)进行一些更新。 - kabijoy

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