2011-06-02 219 views
10

我無法找到如何以編程方式獲取文件的視頻長度的簡單示例。很多人說,哦,使用這個庫/包裝或任何東西,但不要說如何。我已經下載了ffmpeg,但不知道如何實際使用它,似乎沒有任何如何使用它來獲取視頻持續時間的示例。我看你如何使用它來轉換視頻,但我只是想知道視頻的持續時間。所有其他信息無關緊要。獲取視頻的長度

有沒有這樣做的簡單方法,無論是在C#,python,java,無論如何,這隻會返回一個字符串,指示視頻文件的長度。

請儘可能提供示例。提前致謝!

假定標準文件格式,如wmv,avi,mp4,mpeg。有元數據的東西。

+1

答案取決於文件格式。沒有任何工具可以返回有關您交付的任何任意視頻文件的信息。 – 2011-06-02 13:32:38

回答

12

下面是一個例子:

using DirectShowLib; 
using DirectShowLib.DES; 
using System.Runtime.InteropServices; 

... 

var mediaDet = (IMediaDet)new MediaDet(); 
DsError.ThrowExceptionForHR(mediaDet.put_Filename(FileName)); 

// find the video stream in the file 
int index; 
var type = Guid.Empty; 
for (index = 0; index < 1000 && type != MediaType.Video; index++) 
{ 
    mediaDet.put_CurrentStream(index); 
    mediaDet.get_StreamType(out type); 
} 

// retrieve some measurements from the video 
double frameRate; 
mediaDet.get_FrameRate(out frameRate); 

var mediaType = new AMMediaType(); 
mediaDet.get_StreamMediaType(mediaType); 
var videoInfo = (VideoInfoHeader)Marshal.PtrToStructure(mediaType.formatPtr, typeof(VideoInfoHeader)); 
DsUtils.FreeAMMediaType(mediaType); 
var width = videoInfo.BmiHeader.Width; 
var height = videoInfo.BmiHeader.Height; 

double mediaLength; 
mediaDet.get_StreamLength(out mediaLength); 
var frameCount = (int)(frameRate * mediaLength); 
var duration = frameCount/frameRate; 
+1

這對我很好,而且使用起來非常簡單。但我確實發現了一些小問題。似乎並不是所有的.avi文件都適用於此。也許它與視頻文件的大小(> 1 GB)有關,但無論如何。它對我很好。謝謝你的幫助! – MZimmerman6 2011-06-04 13:28:55

+0

put_Filename在我機器上的.mp4文件的情況下拋出COMException。它說:「DirectShowLib.dll 中發生類型'System.Runtime.InteropServices.COMException'的未處理的異常發生附加信息:指定了一個無效的媒體類型。」 – EngineerSpock 2017-06-03 19:01:38

2

您可以通過使用-i標誌獲取各種關於多種類型的視頻格式,包括他們與ffmpeg的時間信息:

ffmpeg -i videofile.whatever 

如果你想有一個好的庫,可以在C#包裝ffmpef你那麼你可以使用MediaHandlerPro

4

開源工具MediaInfo提供全面的我TA-數據,媒體文件,並且可以在DLL形式使用easily從自己的應用程序:

void* Hande=MediaInfo::OpenQuick("**FILENAME**", "**VERSION**;**APP_NAME**;**APP_VERSION**") 
MediaInfo::Inform() 
0

最近我找到了解決類似的問題,我曾與ColdFusion和FFmpeg的小表弟,FFProbe ...

Is there a way to obtain the duration of a video file using ColdFusion?

FFProbe具有壓出一個相當大的量的返回的輸出內的初始流中的信息的參數show_streams;包括視頻的寬度,高度和持續時間...

不確定C#的語法是否運行「ffprobe.exe -show_streams testFile」的等效語句,但是我確信一旦你明白了,你可以從您收到的輸出中解析出您需要的信息。

0

ffprobe是ffmpeg項目的公司工具。除了從廣泛的文件格式中獲取信息外,它還可以以JSON格式輸出以簡化解析。

請檢查此answer以獲取JSON輸出的示例。

1

我試圖以一種不同的方式獲得視頻長度:
實際上使用Windows Media Player組件,我們也可以獲得視頻的持續時間。
下面的代碼片段可以幫助你們:

using WMPLib; 
// ... 
var player = new WindowsMediaPlayer(); 
var clip = player.newMedia(filePath); 
Console.WriteLine(TimeSpan.FromSeconds(clip.duration)); 

,不要忘記添加的wmp.dll的參考,這將是 出現在System32文件夾。

0

我發現的簡單而完美的解決方案是使用MediaToolkit nuget包。

using MediaToolkit; 

// a method to get Width, Height, and Duration in Ticks for video. 
public static Tuple<int, int, long> GetVideoInfo(string fileName) 
{ 
    var inputFile = new MediaToolkit.Model.MediaFile { Filename = fileName }; 
    using (var engine = new Engine()) 
    { 
     engine.GetMetadata(inputFile); 
    } 

    // FrameSize is returned as '1280x768' string. 
    var size = inputFile.Metadata.VideoData.FrameSize.Split(new[] { 'x' }).Select(o => int.Parse(o)).ToArray(); 

    return new Tuple<int, int, long>(size[0], size[1], inputFile.Metadata.Duration.Ticks); 
}