2012-04-17 2 views
16

Хорошо. На самом деле мне нужен в основном формат mp4. Но если можно получить и другие типы, это было бы неплохо. Мне просто нужно прочитать продолжительность файла. Как я могу это сделать с C# 4.0?Как получить продолжительность видео с mp4, wmv, flv, mov видео

Так, что мне нужно, как это видео, как: 13 minutes 12 seconds

я могу использовать 3 EXEs сторонних тоже. Как они сохраняют информацию о файле в текстовый файл. Я могу разобрать этот текстовый файл.

спасибо.

ответ

11

Вы можете использовать DirectShow API MediaDet объект, через DirectShow.NET обертку библиотеки. См. Getting length of video для образца кода, get_StreamLength получает продолжительность в секундах. Это предполагает, что Windows имеет демультиплексор MPEG-4 (требуется сторонние компоненты с Windows до 7, я считаю, что то же самое относится к другому answer by cezor, есть возможность перераспределять компоненты, хотя).

+0

Где этот API DirectShot? Можете ли вы также указать мне URL этой третьей части? Или вы имеете в виду, например, k lite mega кодек кодекса? – MonsterMMORPG

+0

Хорошо пробовал файл, и он показывает продолжительность NAN: D – MonsterMMORPG

+0

Спасибо, что эта строка дает правильную продолжительность в секундах: mediaDet.get_StreamLength (out mediaLength); – MonsterMMORPG

5

IMHO вы можете использовать MediaInfo, который дает вам много информации о медиафайлах.
Для этого есть CLI, поэтому вы можете использовать его из своего кода и получить необходимую информацию.
Вы можете посмотреть this link.

+0

Hello. Я не могу добавить mediainfodll в качестве ссылки. Ты знаешь почему ? Здесь сообщение об ошибке: http://img707.imageshack.us/img707/8130/hataow.png – MonsterMMORPG

+0

@MonsterMMORPG: вы должны вызвать приложение с параметрами и получить вывод, не можете использовать его как ссылку внутри своего решения. – Marco

2

Я думаю, что вы ищете FFMPEG - http://www.ffmpeg-csharp.com/

Есть также некоторые бесплатные альтернативы, которые вы можете прочитать о них в этом вопросе - Using FFmpeg in .net?

FFMpeg.NET 
    FFMpeg-Sharp 
    FFLib.NET 

вы можете увидеть по этой ссылке для примеров использования FFMPEG и нахождения продолжительности - 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

Это заплатить за заявку. Они предоставляют только пробную версию. Это не сработало бы для меня :( – MonsterMMORPG

+0

@MonsterMMORPG посмотреть на мое редактирование .. –

+0

спасибо, но поскольку я сказал, что они предоставляют только пробную версию. – MonsterMMORPG

9

Вы также можете использовать Windows Media Player, хотя не поддерживают Alle типов файлов вы запросили

using WMPLib; 

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

Спасибо, но приложение будет работать на Windows Server 2008. Я полагаю, у них нет Windows Media Player – MonsterMMORPG

+0

@MonsterMMORPG Похоже, вы правы http://stackoverflow.com/a/13929540/188926 – Dunc

2

В проекте FFMPEG есть инструмент, называемый ffprobe, который может предоставить вам необходимую информацию о ваших мультимедийных файлах и вывести информацию в хорошо сформированном JSON.

Посмотрите на пример this answer.

7

This answer о P/Invoke для Shell32 напомнил мне об Windows API Code Pack для доступа к общим API-интерфейсам Windows Vista/7/2008/2008R2.

Было очень просто, используя демонстрацию PropertyEdit во включенных образцах, чтобы выяснить API Shell32, чтобы получить различные свойства медиафайлов, такие как продолжительность.

Я предполагаю, что то же самое условие применяется для Установив соответствующие демультиплексоры, но это было довольно просто, как это требуется только добавление ссылки на Microsoft.WindowsAPICodePack.dll и Microsoft.WindowsAPICodePack.Shell.dll и следующий код:

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); 
} 

Некоторые общие свойства MPEG-4/AAC аудио файлов СМИ:

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

Довольно аккуратный, но разрешение длительности - секунды - мне нужны и фракции. Обратите внимание, что для тех, кто это пробовал, вам нужно добавить ссылки NuGet к Windows7APICodePack-Core/Shell. –

+0

большое спасибо за этот ответ !!! –

+0

люблю это :) Я все о CodePack на данный момент. Обратите внимание, что необработанное значение для свойства выглядит как раз 10^-7 секунд ... Я не знаю, действительно ли такая подробная информация предоставляется для всех типов файлов, но вы можете ее искать. Необработанное значение находится в свойстве «.ValueAsObject», и это улунг, который вам нужно выкинуть из общего объекта. Я отредактирую ответ, чтобы попытаться добавить это. –

1

Я нашел NReco.VideoInfo library быть лучшим вариантом, и гораздо проще, чем некоторые из тех, кто выше. Это просто, как давая библиотеке путь к файлу и он выплевывает метаданные:

var ffProbe = new FFProbe(); 
var videoInfo = ffProbe.GetMediaInfo(blob.Uri.AbsoluteUri); 
return videoInfo.Duration.TotalMilliseconds; 
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
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); 
Смежные вопросы