2012-04-17 34 views
16

Được rồi. Trên thực tế tôi cần chủ yếu là định dạng mp4. Nhưng nếu có thể nhận được cho các loại khác cũng sẽ được tốt đẹp. Tôi chỉ cần đọc thời lượng của tập tin. Làm thế nào tôi có thể làm điều đó với C# 4.0?Cách nhận thời lượng video từ mp4, wmv, flv, mov video

Vì vậy, điều tôi cần là như video này như: 13 minutes 12 seconds

tôi có thể sử dụng 3 người yêu cũ của bên thứ ba quá. Giống như họ lưu thông tin về tệp vào tệp văn bản. Tôi có thể phân tích cú pháp tệp văn bản đó.

Cảm ơn bạn.

Trả lời

11

Bạn có thể sử dụng DirectShow đối tượng API MediaDet, thông qua DirectShow.NET wrapper thư viện. Xem Getting length of video cho mẫu mã, get_StreamLength giúp bạn có thời lượng tính bằng giây. Điều này giả định Windows có MPEG-4 demultiplexer cài đặt (yêu cầu các thành phần bên thứ ba với Windows trước 7, tôi tin rằng cùng áp dụng cho một answer by cezor, có miễn phí để phân phối lại các thành phần mặc dù).

+0

API DirectShot này ở đâu? Bạn cũng có thể cung cấp cho tôi url của phần thứ ba này không? Hay bạn có ý nghĩa như kite lite Mã hóa gói – MonsterMMORPG

+0

Alright đã thử một tệp và nó hiển thị thời lượng NAN: D – MonsterMMORPG

+0

Cảm ơn dòng này cho thời lượng chính xác như giây: mediaDet.get_StreamLength (ngoài phương tiện truyền thông), – MonsterMMORPG

5

IMHO bạn có thể sử dụng MediaInfo cung cấp cho bạn rất nhiều thông tin về tệp phương tiện.
Có một CLI cho nó để bạn có thể sử dụng nó từ mã của bạn và nhận được thông tin bạn cần.
Bạn có thể xem this link.

+0

Xin chào. Tôi không thể thêm mediainfodll làm tham chiếu. Bạn có biết tại sao ? Ở đây thông báo lỗi: http://img707.imageshack.us/img707/8130/hataow.png – MonsterMMORPG

+0

@MonsterMMORPG: bạn phải gọi ứng dụng với thông số và nhận đầu ra, không thể sử dụng nó làm tham chiếu bên trong giải pháp của bạn – Marco

2

Tôi nghĩ rằng bạn đang tìm kiếm FFMPEG - http://www.ffmpeg-csharp.com/

cũng có một số lựa chọn thay thế miễn phí mà bạn có thể đọc về họ trong câu hỏi này - Using FFmpeg in .net?

FFMpeg.NET 
    FFMpeg-Sharp 
    FFLib.NET 

bạn có thể thấy liên kết này ví dụ về cách sử dụng FFMPEG và tìm thời lượng - http://jasonjano.wordpress.com/2010/02/09/a-simple-c-wrapper-for-ffmpeg/

 public VideoFile GetVideoInfo(string inputPath) 
     { 
      VideoFile vf = null; 
      try 
      { 
       vf = new VideoFile(inputPath); 
      } 
      catch (Exception ex) 
      { 
       throw ex; 
      } 
      GetVideoInfo(vf); 
      return vf; 
     } 
     public void GetVideoInfo(VideoFile input) 
     { 
      //set up the parameters for video info 
      string Params = string.Format("-i {0}", input.Path); 
      string output = RunProcess(Params); 
      input.RawInfo = output; 

      //get duration 
      Regex re = new Regex("[D|d]uration:.((\\d|:|\\.)*)"); 
      Match m = re.Match(input.RawInfo); 

      if (m.Success) 
      { 
       string duration = m.Groups[1].Value; 
       string[] timepieces = duration.Split(new char[] { ':', '.' }); 
       if (timepieces.Length == 4) 
       { 
        input.Duration = new TimeSpan(0, Convert.ToInt16(timepieces[0]), Convert.ToInt16(timepieces[1]), Convert.ToInt16(timepieces[2]), Convert.ToInt16(timepieces[3])); 
       } 
      } 
     } 
+0

Đây là một trả tiền để có ứng dụng. Họ chỉ cung cấp thử nghiệm. Điều này sẽ không làm việc cho tôi: ( – MonsterMMORPG

+0

@MonsterMMORPG nhìn vào chỉnh sửa của tôi .. –

+0

cảm ơn nhưng như tôi đã nói họ chỉ cung cấp dùng thử. – MonsterMMORPG

9

Bạn cũng có thể sử dụng windows media player, mặc dù nó không hỗ trợ các loại tập tin mà bạn yêu cầu alle

using WMPLib; 

public Double Duration(String file) 
    { 
     WindowsMediaPlayer wmp = new WindowsMediaPlayerClass(); 
     IWMPMedia mediainfo = wmp.newMedia(file); 
     return mediainfo.duration; 
    } 
} 
+0

Cảm ơn nhưng ứng dụng sẽ hoạt động trên máy chủ Windows 2008. Tôi cho rằng họ không có trình phát phương tiện windows – MonsterMMORPG

+0

@MonsterMMORPG Dường như bạn đang đúng http://stackoverflow.com/a/13929540/188926 – Dunc

2

Dự án FFMPEG có một công cụ, được gọi là ffprobe, có thể cung cấp cho bạn thông tin bạn cần về các tệp đa phương tiện của bạn và cung cấp thông tin trong JSON được định dạng độc đáo.

Hãy xem this answer để biết ví dụ.

7

This answer về P/Gọi cho Shell32 nhắc tôi về số Windows API Code Pack để truy cập các API Windows Vista/7/2008/2008R2 phổ biến. Nó là rất dễ dàng, bằng cách sử dụng bản demo PropertyEdit trong các mẫu được bao gồm, để tìm ra Shell32 API để nhận các thuộc tính tệp phương tiện khác nhau, như thời lượng.

Tôi giả sử các điều kiện tiên quyết này cũng áp dụng cho có Demultiplexers thích hợp cài đặt, nhưng nó là khá đơn giản, vì nó chỉ cần thêm tài liệu tham khảo để Microsoft.WindowsAPICodePack.dllMicrosoft.WindowsAPICodePack.Shell.dll và đoạn mã sau:

using Microsoft.WindowsAPICodePack.Shell; 
using Microsoft.WindowsAPICodePack.Shell.PropertySystem; 

using (ShellPropertyCollection properties = new ShellPropertyCollection(filePath)) 
{ 
    foreach (IShellProperty prop in properties) 
    { 
     string value = (prop.ValueAsObject == null) ? "" : prop.FormatForDisplay(PropertyDescriptionFormatOptions.None); 
     Console.WriteLine("{0} = {1}", prop.CanonicalName, value); 
    } 
} 

using (ShellObject shell = ShellObject.FromParsingName(filePath)) 
{ 
    // alternatively: shell.Properties.GetProperty("System.Media.Duration"); 
    IShellProperty prop = shell.Properties.System.Media.Duration; 
    // Duration will be formatted as 00:44:08 
    string duration = prop.FormatForDisplay(PropertyDescriptionFormatOptions.None); 
} 

Một số tài sản chung cho một MPEG-4/AAC audio file media:

System.Audio.Format = {00001610-0000-0010-8000-00AA00389B71} 
System.Media.Duration = 00:44:08 
System.Audio.EncodingBitrate = ?56kbps 
System.Audio.SampleRate = ?32 kHz 
System.Audio.SampleSize = ?16 bit 
System.Audio.ChannelCount = 2 (stereo) 
System.Audio.StreamNumber = 1 
System.DRM.IsProtected = No 
System.KindText = Music 
System.Kind = Music 
+0

Khá gọn gàng, nhưng độ phân giải thời gian là giây - tôi cũng cần phân số. Lưu ý đối với bất kỳ ai đang thử điều này, bạn sẽ cần thêm các tham chiếu NuGet vào Windows7APICodePack-Core/Shell. –

+0

cảm ơn lớn vì câu trả lời này !!! –

+0

thích nó :) Tôi là tất cả về CodePack tại thời điểm này. Lưu ý rằng giá trị thô cho thuộc tính xuất hiện cụ thể là 10^-7 giây ... Tôi không biết liệu chi tiết đó có thực sự được cung cấp cho tất cả các loại tệp hay không, nhưng bạn có thể tìm kiếm nó. Giá trị thô nằm trong thuộc tính ".ValueAsObject" và đó là một ulong mà bạn cần phải bỏ ra khỏi một đối tượng chung. Tôi sẽ chỉnh sửa câu trả lời để cố gắng thêm câu trả lời này. –

1

tôi tìm thấy NReco.VideoInfo library là lựa chọn tốt nhất và đơn giản hơn nhiều so với một số người ở trên. Thật đơn giản khi cung cấp cho thư viện một đường dẫn tệp và nó tạo ra siêu dữ liệu:

var ffProbe = new FFProbe(); 
var videoInfo = ffProbe.GetMediaInfo(blob.Uri.AbsoluteUri); 
return videoInfo.Duration.TotalMilliseconds; 
1

Sử dụng thành phần Windows Media Player, chúng tôi có thể nhận được thời lượng của video.
Sau đoạn mã có thể giúp bạn guys:

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

và đừng quên để thêm tài liệu tham khảo của wmp.dll mà sẽ hiện diện trong System32 thư mục.

0
StreamReader errorreader; 
string InterviewID = txtToolsInterviewID.Text; 

Process ffmpeg = new Process(); 

ffmpeg.StartInfo.UseShellExecute = false; 
ffmpeg.StartInfo.ErrorDialog = false; 
ffmpeg.StartInfo.RedirectStandardError = true; 

ffmpeg.StartInfo.FileName = Server.MapPath("ffmpeg.exe"); 
ffmpeg.StartInfo.Arguments = "-i " + Server.MapPath("videos") + "\\226.flv"; 


ffmpeg.Start(); 

errorreader = ffmpeg.StandardError; 

ffmpeg.WaitForExit(); 

string result = errorreader.ReadToEnd(); 

string duration = result.Substring(result.IndexOf("Duration: ") + ("Duration: ").Length, ("00:00:00.00").Length); 
Các vấn đề liên quan