【问题标题】:Splitting a video in four files in C#在 C# 中将视频拆分为四个文件
【发布时间】:2023-04-10 12:16:01
【问题描述】:

我正在研究如何将视频分成四个片段。我见过很多解决方案和库。我在看这个库:

https://github.com/AydinAdn/MediaToolkit

这是分割视频的代码

var inputFile = new MediaFile {Filename = @"C:\Path\To_Video.flv"};
var outputFile = new MediaFile {Filename = @"C:\Path\To_Save_ExtractedVideo.flv"};

using (var engine = new Engine())
{
    engine.GetMetadata(inputFile);

    var options = new ConversionOptions();

    // This example will create a 25 second video, starting from the 
    // 30th second of the original video.
    //// First parameter requests the starting frame to cut the media from.
    //// Second parameter requests how long to cut the video.
    options.CutMedia(TimeSpan.FromSeconds(30), TimeSpan.FromSeconds(25));

    engine.Convert(inputFile, outputFile, options);
}

代码只分割了一个片段。有没有办法把它分成四个片段?

亲切的问候

PS:解决方案必须是 C# 并且已经看过 Directshow 解决方案。

【问题讨论】:

  • 也许这样做 4 次会改变起始秒数?
  • 你的意思是我必须做 4 个 var options = new ConversionOptions(); ?我正在考虑这个问题,但这是一个好的解决方案吗?
  • 我没用过这个库,但对我来说听起来不错,4 var options 和 4 engine.Convert 我猜

标签: c# .net video


【解决方案1】:

它对我来说效果很好,但我会修复算法,因为我错过了下面的最终视频,我现在的代码是这样的:

  static void Main(string[] args)
    {
        using (var engine = new Engine())
        {
            string file = @"C:\Users\wilso\Downloads\IZA - Meu Talismã.mp4";
            var inputFile = new MediaFile { Filename = file };
            engine.GetMetadata(inputFile);
            var outputName = @"C:\Users\wilso\Downloads\output";
            var outputExtension = ".mp4";
            double Duration = inputFile.Metadata.Duration.TotalSeconds;
            double currentPosition = 0;
            int contador = 0;
            while (currentPosition < Duration)
            {
                currentPosition = contador * 30;
                contador++;

                var options = new ConversionOptions();
                var outputFile = new MediaFile(outputName + contador.ToString("00") + outputExtension);

                options.CutMedia(TimeSpan.FromSeconds(currentPosition), TimeSpan.FromSeconds(30));

                engine.Convert(inputFile, outputFile, options);


            }
        }
    }

【讨论】:

  • 欢迎来到 SO!因此,如果缺少最后一个视频。它是否有效?当您发布答案时,请对其进行评论。在您的情况下,如果您提出的解决方案有一个问题,请提及在哪里提出问题。
【解决方案2】:

我以前没有使用过这个库,但我会这样做。


var inputFile = new MediaFile {Filename = @"C:\Path\To_Video.flv"};
var outputName = "C:\Path\To_Save_ExtractedVideo";
var outputExtension = ".flv";

double t = inputFile.Length/4; //length of parts -- need to use method to get file playtime length

for(int i=0;i<4;i++){

    var engine = new Engine()
    engine.GetMetadata(inputFile);

    var options = new ConversionOptions();

    // This example will create a 25 second video, starting from the 
    // 30th second of the original video.
    //// First parameter requests the starting frame to cut the media from.
    //// Second parameter requests how long to cut the video.
    options.CutMedia(TimeSpan.FromSeconds(30 + (i*int.Parse(t))), TimeSpan.FromSeconds((i+1)*int.Parse(t)));

    engine.Convert(inputFile, $"{outputName}_{i.ToString()}{outputExtension}, options);

    engine.Destroy(); // Need to destroy object or close inputstream. Whichever the library offers

    }
}

【讨论】:

  • 感谢您的宝贵时间!这行代码有问题'double t = inputFile.Length/4;' “MediaToolkit.Model.MediaFile”不包含“Length”的定义,并且找不到接受“MediaToolkit.Model.MediaFile”类型的第一个参数的扩展方法“Length”(您是否缺少 using 指令或程序集引用?)
  • engine.Destroy() 也是如此
  • @Fearhunter 你需要寻找类似的东西,我会评论我在找什么。我从来没有使用过图书馆,所以我不知道我需要说什么对不起。 inputFile.Length/4 将是文件的长度 / 4,应该有一个方法或类似的东西来得到这个 engine.Destroy() 应该有一种方法来销毁对象或关闭输入流。这就是你应该在那里做的事情
  • @Chud37 dispose 通常是对对象进行垃圾收集,而 iirc 是从基础 object 类继承的函数,我认为您在那里所做的是保持流在内存中打开但破坏和垃圾收集您对这些流的访问器。这可能会产生处理流的副作用,因为 C# 应该足够聪明,可以垃圾收集不再使用的资源
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-04
  • 2014-05-21
  • 2016-01-13
  • 2016-10-05
  • 2017-07-14
  • 1970-01-01
相关资源
最近更新 更多