2017-08-09 53 views
13

Jaki jest najlepszy sposób na uzyskanie?Uzyskaj czas trwania filmu po przesłaniu

Mam pole, w którym użytkownik będzie przesyłać wideo.

Po kliknięciu przycisku przesyłania film zostanie przesłany. Ta praca doskonale.

Potrzebowałem czasu trwania wideo z fizycznej ścieżki, próbowałem:

using WMPLib; 
WindowsMediaPlayer wmp = new WindowsMediaPlayerClass(); 
IWMPMedia mediaInfo = wmp.newMedia(Server.MapPath("~/Uploads/test.mp4")); 
double duration = mediaInfo.duration; 

Ale jej nie działa, pojawia się błąd:

The type 'WMPLib.WindowsMediaPlayerClass' has no constructors defined Interop type 'WMPLib.WindowsMediaPlayerClass' cannot be embedded.

Jak złapać czas?

+2

Możliwy duplikat [? Jaki jest najlepszy sposób, aby uzyskać metadane wideo z pliku MP4 w ASP.NET MVC przy użyciu C#] (https://stackoverflow.com/questions/26051273/whats -najlepszy-do-uzyskania-wideo-metadane-z-pliku-mp4-w-asp-net-mvc-using-c) – Clint

+2

Zobacz https://social.msdn.microsoft.com/Forums/vstudio/en-US/2d095670-9920-44f3-a386-3cfeceeb14c0/c-get-video-duration? forum = csharpgeneral dla rozwiązania. –

+0

Próbowałem ich, ale nie pomagają mi one :( –

Odpowiedz

3

Dzięki bibliotece otoki DirectShow.Net można użyć obiektu DirectShow API MediaDet. Metoda get_StreamLength to taka, która pobiera długość filmu w ciągu kilku sekund, którą można przekształcić w min/godz. Za pomocą deterministycznego algorytmu. Aby korzystać z tego interfejsu API, upewnij się, że w systemie operacyjnym została zainstalowana zależność MPEG-4.

lub możesz wybrać bibliotekę Media Info, aby uzyskać informacje z pliku wideo.

Zobacz implementację korzystając DirectShow.NET otoki biblioteki: Getting length of video

2

Dostajemy czasy trwania wideo w wielu aspektach są

Metoda 1: Shell 32 API

Metoda 2: WMPLib (Windows Media Player Library)

Metoda 3: FFMpeg Wrapper

sprawdzenie poniższych linków

Metoda 1 i Metoda 2 link get-the-length-of-a-video-in-c#

Metoda 3 Reference Odsyłacz video file time duration in ffmpeg

W ten sposób wykorzystywany do właściwości get wideo i duraion wszystkie te trzy i sprawdzano previously.it działa dobrze kilka niestandardowych attriburtes w pliku właściwości nie pokazują się w pierwszych 2 metodach.

Metoda 3 nie działa we wspólnym hostingu. jest wymagany na serwer dedykowany.

9

Można użyć tej Nuget pakiet:

Install-Package Xabe.FFMpeg 

próbuję uczynić łatwe w użyciu, wieloplatformowy FFmpeg wrapper.

można znaleźć więcej informacji na ten temat w https://github.com/tomaszzmuda/Xabe.FFmpeg

IVideoInfo videoInfo = new VideoInfo("videofile.mkv"); 
var videoDuration = videoInfo.VideoProperties.VideoDuration; 

Więcej informacji o uzyskanie trwania pliku wideo na: https://github.com/tomaszzmuda/Xabe.FFmpeg/wiki/Getting-an-information-about-video

+0

Próbowałem projektu FFMpeg, kod wygląda dobrze, ale nie mógł go skompilować, jeśli masz czas, możesz podać przewodnik GitHub, aby działało? –

+0

Ten projekt jest w .NET Standard 2.0. Może to jest problem. Zgodnie z dokumentacją .NET Standard jest obsługiwany w .NET Framework powyżej 4.6.1 ([link] (https://blogs.msdn.microsoft.com/dotnet/2017/08/14/announcing-net-standard-2-0 /)), ale nie zawsze działa na nim. Spróbuję rozwiązać problem. @JeremyThompson, jeśli możesz, zrób błąd na github z błędami kompilacji. –

+0

@ TomaszŻmuda 'VideoInfo' oczekuje na obsłużenie i jest zastępowane przez' MediaInfo'. – maxp

2

Twój kod wygląda w porządku, ale jeśli można sprawdzić attributes mediów Informacje takie jak:

using WMPLib; // this file is called Interop.WMPLib.dll 
WindowsMediaPlayerClass wmp = new WindowsMediaPlayerClass(); 
string FilePath = "yourFilePath"; 
IWMPMedia mediaInfo = wmp.newMedia(FilePath); 

// write duration 
Console.WriteLine("Duration = " + mediaInfo.duration); 

// write named attributes 
for (int i=0; i < mediaInfo.attributeCount; i++) 
{ 
    Console.WriteLine(mediaInfo.getAttributeName(i) + " = " + mediaInfo.getItemInfo(mediaInfo.getAttributeName(i))); 
} 
0

Poniższy fragment kodu może pomóc Chłopaki:

using WMPLib; 
// ...your code here... 

var player = new WindowsMediaPlayer(); 
var clip = player.newMedia(VideoFilePath); 
Console.WriteLine(TimeSpan.FromSeconds(clip.duration)); 

and don't forget to add the reference of wmp.dll which will be present in System32 folder.