2011-06-02 16 views
10

Tengo problemas para encontrar un ejemplo simple de cómo obtener la longitud del video de un archivo mediante programación. Mucha gente dice, oh, usa esta biblioteca/envoltorio o lo que sea, pero no digas cómo. He descargado ffmpeg, pero no tengo ni idea de cómo usarlo realmente y no parece haber ningún ejemplo de cómo usarlo para obtener la duración del video. Veo cómo puedes usarlo para convertir videos, pero simplemente quiero saber la duración de un video. Toda la otra información no importa.Obteniendo la longitud del video

¿Hay alguna manera de hacer esto simplemente, ya sea en C#, python, java, lo que sea, que simplemente devolverá una cadena que indica la longitud de un archivo de video.

Proporcione ejemplos si es posible. ¡Gracias por adelantado!

Asume los formatos de archivo estándar, como wmv, avi, mp4, mpeg. Cosas que tienen metadatos.

+1

La respuesta dependerá del formato del archivo. No hay una herramienta que devuelva información sobre cualquier archivo de video arbitrario que le entregue. –

Respuesta

12

Aquí se muestra un ejemplo:

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; 
+1

esto funcionó muy bien para mí y fue muy fácil de usar. Sin embargo, sí noté algunos problemas menores. Parece que no todos los archivos .avi funcionan con esto. Tal vez tenía algo que ver con el tamaño del archivo de video (> 1 GB) pero lo que sea. Funciono bien para mi. ¡Gracias por tu ayuda! – MZimmerman6

+0

put_Filename arroja COMException en caso de archivo .mp4 en mi máquina. Dice: "Se produjo una excepción no controlada del tipo 'System.Runtime.InteropServices.COMException' en DirectShowLib.dll Información adicional: se especificó un tipo de medio no válido." – EngineerSpock

2

se puede obtener todo tipo de información sobre muchos tipos de formatos de vídeo, incluyendo su duración con ffmpeg mediante el uso de la bandera -i:

ffmpeg -i videofile.whatever 

Si quieres una buena biblioteca que puede envolver ffmpef para usted en C# entonces usted puede utilizar MediaHandlerPro

4

La herramienta de código abierto ofrece MediaInfo mí integral ta-datos para archivos multimedia y se pueden utilizar easily desde su propia aplicación en forma de DLL:

void* Hande=MediaInfo::OpenQuick("**FILENAME**", "**VERSION**;**APP_NAME**;**APP_VERSION**") 
MediaInfo::Inform() 
0

Recientemente he encontrado una solución a un problema similar que tenía, con ColdFusion y primo de FFMpeg, FFProbe ...

Is there a way to obtain the duration of a video file using ColdFusion?

FFProbe tiene un argumento show_streams que empuja hacia fuera una cantidad considerable de información en la corriente inicial dentro de la salida devuelta; incluyendo el ancho, alto y duración de un video ...

No estoy seguro acerca de la sintaxis de C# para ejecutar el equivalente de "ffprobe.exe -show_streams testFile" pero estoy seguro de que una vez que te hayas dado cuenta, puedes analizar la información que necesita del resultado que recibe.

0

ffprobe es una herramienta complementaria del proyecto ffmpeg. Además de proporcionar información de una amplia gama de formatos de archivo, también puede publicar en formato JSON para facilitar el análisis.

Compruebe esto answer para ver un ejemplo de una salida JSON.

1

He intentado obtener la duración del video de una manera un poco diferente:
En realidad, al usar Windows Media Player Component también, podemos obtener la duración del video.
siguiente fragmento de código puede ayudar a chicos:

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

y no se olvide de agregar la referencia de wmp.dll que estará presente en System32 carpeta.

0

La solución perfecta y perfecta que encontré es usar el paquete nuget MediaToolkit.

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