Как получить продолжительность видео из mp4, wmv, flv, mov видео
хорошо. На самом деле мне нужен в основном формат mp4. Но если можно получить и для других типов, это было бы неплохо. Мне просто нужно прочитать продолжительность файла. Как я могу сделать это в C# 4.0 ?
Так что мне нужно, как это видео, как:13 minutes 12 seconds
Я могу использовать 3 сторонних бывших тоже. Как будто они сохраняют информацию о файле в текстовый файл. Я могу разобрать этот текстовый файл.
спасибо.
9 ответов
вы можете использовать DirectShow API MediaDet
объект, через DirectShow.NET библиотека обертки. См.получение длины видео для кода образца, get_StreamLength
получает продолжительность в секундах. Это предполагает, что Windows имеет MPEG-4 demultiplexer установлен (требует сторонних компонентов с Windows до 7, я считаю, что то же самое относится к другому ответ cezor, есть свободно распространять компоненты, хотя).
вы также можете использовать проигрыватель windows media, хотя он не поддерживает типы файлов alle, которые вы запросили
using WMPLib;
public Double Duration(String file)
{
WindowsMediaPlayer wmp = new WindowsMediaPlayerClass();
IWMPMedia mediainfo = wmp.newMedia(file);
return mediainfo.duration;
}
}
ответ о P / Invoke для Shell32 напомнил мне о пакет кода API Windows для доступа к общей Windows Vista/7/2008/2008R2 APIs.
было очень легко, используя демонстрацию PropertyEdit в включенных образцах, выяснить API Shell32, чтобы получить различные свойства медиа-файла, такие как продолжительность.
Я предполагаю, что то же самое условие применяется для установки надлежащих демультиплексоров, но это было довольно просто, так как это требовалось только добавление ссылок на Microsoft.WindowsAPICodePack.dll
и Microsoft.WindowsAPICodePack.Shell.dll
и следующий код:
using Microsoft.WindowsAPICodePack.Shell;
using Microsoft.WindowsAPICodePack.Shell.PropertySystem;
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 audio 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
легко перебирать все свойства, если вы ищете доступные метаданные:
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);
}
}
IMHO вы можете использовать MediaInfo, который дает вам много информации о медиа файлах.
Для этого есть CLI, поэтому вы можете использовать его из своего кода и получить необходимую информацию.
Вы можете взглянуть на этой ссылке.
Я думаю, что вы ищете FFMPEG -http://www.ffmpeg-csharp.com/
есть также некоторые бесплатные альтернативы, которые вы можете прочитать о них в этом вопросе - использование FFmpeg в .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]));
}
}
}
проект FFMPEG имеет инструмент, называемый ffprobe, который может предоставить вам необходимую информацию о ваших мультимедийных файлах и вывести информацию в красиво оформленном JSON.
посмотри ответ для примера.
нашел NReco.VideoInfo библиотека лучший вариант и намного проще, чем некоторые из тех, кто выше. Это просто, как дать библиотеке путь к файлу, и он выплевывает метаданные:
var ffProbe = new FFProbe();
var videoInfo = ffProbe.GetMediaInfo(blob.Uri.AbsoluteUri);
return videoInfo.Duration.TotalMilliseconds;
используя компонент проигрывателя Windows Media, мы также можем получить продолжительность видео.
Следующий фрагмент кода может помочь вам :
using WMPLib;
// ...
var player = new WindowsMediaPlayer();
var clip = player.newMedia(filePath);
Console.WriteLine(TimeSpan.FromSeconds(clip.duration));
и не забудьте добавить ссылку
wmp.dll
что будет присутствует вSystem32
.
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);