Как получить продолжительность видео с mp4, wmv, flv, mov videos - программирование
Подтвердить что ты не робот

Как получить продолжительность видео с mp4, wmv, flv, mov videos

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

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

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

Спасибо.

4b9b3361

Ответ 1

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

Ответ 2

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

using WMPLib;

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

Ответ 3

Этот ответ о 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 (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

Легко перебрать все свойства, если вы ищете доступные метаданные:

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

Ответ 4

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

Ответ 5

Я думаю, что вы ищете FFMPEG - https://ffmpeg.org/

Есть также несколько бесплатных альтернатив, которые вы можете прочитать о них в этом вопросе - Использование 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]));
                }
            }
       }

Ответ 6

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

Посмотрите этот ответ на пример.

Ответ 7

Используя компонент проигрывателя Windows Media, мы также можем получить продолжительность видео. Следующий фрагмент кода может помочь вам:

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

и не забудьте добавить ссылку wmp.dll, которая будет присутствует в папке System32.

Ответ 8

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

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

Ответ 9

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

Ответ 10

У меня была такая же проблема, и мы создали оболочку для ffprobe Alturos.VideoInfo. Вы можете использовать его, просто установив пакет nuget. Также требуется двоичный файл ffprobe.

PM> install-package Alturos.VideoInfo

пример

var videoFilePath = "myVideo.mp4";

var videoAnalyer = new VideoAnalyzer("ffprobe.exe");
var analyzeResult = videoAnalyer.GetVideoInfo(videoFilePath);

var duration = analyzeResult.VideoInfo.Format.Duration;