我在 Windows 上有 C# .NET 客户端,需要从 .mov 文件中提取开始时间码和持续时间/长度元数据。有谁知道该怎么做吗?我在网上查了一下,但还没有找到任何东西。
如果您可以调用非托管代码,您也许可以仅使用 Windows 版 QuickTime 来获取此信息。
如果做不到这一点,您想要的所有信息都在电影头原子中。所有 QuickTime 影片都从时间 0 开始(这样问题就解决了一半)并在指定的持续时间结束,该持续时间等于其最长轨道的持续时间。时间以电影时间尺度来指定,它定义了每秒的时间单位数;默认为每秒 600 个单位。
您可以通过扫描文件中的电影头原子(其类型为
'mvhd'
)来找到电影时间尺度和持续时间,然后向前跳到该原子的时间尺度和持续时间字段,它们比电影开头的 16 个字节长。原子类型字段(您找到的“mvhd”)。每个都是大端 4 字节无符号整数。
QuickTime 是一种容器格式,但并非所有电影文件都包含电影标头。有些只是参考或流媒体电影,指向实际电影数据所在的其他位置。即使电影标头存在,也不要求它实际上是文件数据的标头。
您可以在 QuickTime 文件格式规范 中阅读太多有关 QuickTime 文件格式的内容。 (MPEG-4 文件格式实际上基于 QuickTime 文件格式,因此如果您对此有所了解,那么这些知识应该可以转移。)
LibVLCSharp 可能就是您正在寻找的。
记得安装平台对应的包(例如LibVLC.Windows),然后就可以这样使用了:
using LibVLCSharp.Shared;
internal class Program
{
private static void Main(string[] args)
{
var vlc = new LibVLC();
Media m = new(vlc,new Uri(@"d:\sample.mov"));
// async method, using awaiter here for simplicity
m.Parse().GetAwaiter().GetResult();
// video duration in ms
Console.WriteLine(m.Duration);
}
}