Получение продолжительности видео - PullRequest
12 голосов
/ 02 июня 2011

У меня проблемы с поиском простого примера того, как программно получить длину видео в файле. Многие люди говорят: «О, используйте эту библиотеку / оболочку или что-то еще, но не говорите, как». Я скачал ffmpeg, но понятия не имею, как на самом деле его использовать, и, похоже, нет никакого примера того, как использовать его для получения продолжительности видео. Я вижу, как вы можете использовать его для конвертации видео, но я просто хочу узнать продолжительность видео. Вся остальная информация не имеет значения.

Есть ли способ сделать это просто, будь то в C #, Python, Java, что угодно, что просто вернет строку, указывающую длину видеофайла.

Пожалуйста, приведите примеры, если это возможно. Заранее спасибо!

Предположим, стандартные форматы файлов, такие как WMV, AVI, MP4, MPEG. Материал с метаданными.

Ответы [ 7 ]

14 голосов
/ 02 июня 2011

Вот пример:

using DirectShowLib;
using DirectShowLib.DES;
using System.Runtime.InteropServices;

...

var mediaDet = (IMediaDet)new MediaDet();
DsError.ThrowExceptionForHR(mediaDet.put_Filename(FileName));

// find the video stream in the file
int index;
var type = Guid.Empty;
for (index = 0; index < 1000 && type != MediaType.Video; index++)
{
    mediaDet.put_CurrentStream(index);
    mediaDet.get_StreamType(out type);
}

// retrieve some measurements from the video
double frameRate;
mediaDet.get_FrameRate(out frameRate);

var mediaType = new AMMediaType();
mediaDet.get_StreamMediaType(mediaType);
var videoInfo = (VideoInfoHeader)Marshal.PtrToStructure(mediaType.formatPtr, typeof(VideoInfoHeader));
DsUtils.FreeAMMediaType(mediaType);
var width = videoInfo.BmiHeader.Width;
var height = videoInfo.BmiHeader.Height;

double mediaLength;
mediaDet.get_StreamLength(out mediaLength);
var frameCount = (int)(frameRate * mediaLength);
var duration = frameCount / frameRate;
4 голосов
/ 03 июня 2011

Инструмент с открытым исходным кодом MediaInfo предоставляет исчерпывающие метаданные для медиа-файлов и может использоваться легко из вашего собственного приложения в виде DLL:

void* Hande=MediaInfo::OpenQuick("**FILENAME**", "**VERSION**;**APP_NAME**;**APP_VERSION**")
MediaInfo::Inform()
2 голосов
/ 23 февраля 2017

Самое простое и безупречное решение, которое я нашел, это использовать MediaToolkit пакет nuget.

using MediaToolkit;

// a method to get Width, Height, and Duration in Ticks for video.
public static Tuple<int, int, long> GetVideoInfo(string fileName)
{
    var inputFile = new MediaToolkit.Model.MediaFile { Filename = fileName };
    using (var engine = new Engine())
    {
        engine.GetMetadata(inputFile);
    }

    // FrameSize is returned as '1280x768' string.
    var size = inputFile.Metadata.VideoData.FrameSize.Split(new[] { 'x' }).Select(o => int.Parse(o)).ToArray();

    return new Tuple<int, int, long>(size[0], size[1], inputFile.Metadata.Duration.Ticks);
}
2 голосов
/ 02 июня 2011

Вы можете получить всевозможную информацию о многих типах видеоформатов, включая их продолжительность, с помощью ffmpeg, используя флаг -i:

ffmpeg -i videofile.whatever

Если вам нужна хорошая библиотека, которая может обернуть ffmpef для вас в C #, тогда вы можете использовать MediaHandlerPro

1 голос
/ 02 сентября 2016

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

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

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

0 голосов
/ 29 мая 2013

ffprobe - инструмент компании из проекта ffmpeg. Помимо предоставления информации из широкого диапазона форматов файлов, он также может выводить данные в формате JSON для упрощения анализа.

Проверьте этот ответ для примера вывода JSON.

0 голосов
/ 19 февраля 2013

Недавно я нашел решение похожей проблемы, с которой у меня были ColdFusion и кузен FFMpeg, FFProbe ...

Есть ли способ получить продолжительность видеофайла с помощью ColdFusion?

FFProbe имеет аргумент show_streams, который выталкивает значительное количество информации в исходный поток в возвращаемом выводе;включая ширину, высоту и продолжительность видео ...

Не уверен насчет синтаксиса C # для запуска эквивалента "ffprobe.exe -show_streams testFile", но я уверен, что как только вы это выясните,Вы можете анализировать необходимую информацию из полученного вами результата.

...