2013-01-20 2 views

답변

4

내가 Mediainfo를 라이브러리를 사용하고 내 프로젝트의 몇에서 수행 한 방법 : Link Here

시스템을 사용하여; using System.Runtime.InteropServices;

namespace MediaInfoLib 
{ 
    public enum StreamKind 
    { 
     General, 
     Video, 
     Audio, 
     Text, 
     Chapters, 
     Image 
    } 

    public enum InfoKind 
    { 
     Name, 
     Text, 
     Measure, 
     Options, 
     NameText, 
     MeasureText, 
     Info, 
     HowTo 
    } 

    public enum InfoOptions 
    { 
     ShowInInform, 
     Support, 
     ShowInSupported, 
     TypeOfValue 
    } 

    public enum InfoFileOptions 
    { 
     FileOption_Nothing  = 0x00, 
     FileOption_NoRecursive = 0x01, 
     FileOption_CloseAll  = 0x02, 
     FileOption_Max   = 0x04 
    }; 


    public class MediaInfo 
    { 
     //Import of DLL functions. DO NOT USE until you know what you do (MediaInfo DLL do NOT use CoTaskMemAlloc to allocate memory) 
     [DllImport("MediaInfo.dll")] 
     private static extern IntPtr MediaInfo_New(); 
     [DllImport("MediaInfo.dll")] 
     private static extern void MediaInfo_Delete(IntPtr Handle); 
     [DllImport("MediaInfo.dll")] 
     private static extern IntPtr MediaInfo_Open(IntPtr Handle, [MarshalAs(UnmanagedType.LPWStr)] string FileName); 
     [DllImport("MediaInfo.dll")] 
     private static extern IntPtr MediaInfoA_Open(IntPtr Handle, IntPtr FileName); 
     [DllImport("MediaInfo.dll")] 
     private static extern IntPtr MediaInfo_Open_Buffer_Init(IntPtr Handle, Int64 File_Size, Int64 File_Offset); 
     [DllImport("MediaInfo.dll")] 
     private static extern IntPtr MediaInfoA_Open(IntPtr Handle, Int64 File_Size, Int64 File_Offset); 
     [DllImport("MediaInfo.dll")] 
     private static extern IntPtr MediaInfo_Open_Buffer_Continue(IntPtr Handle, IntPtr Buffer, IntPtr Buffer_Size); 
     [DllImport("MediaInfo.dll")] 
     private static extern IntPtr MediaInfoA_Open_Buffer_Continue(IntPtr Handle, Int64 File_Size, byte[] Buffer, IntPtr Buffer_Size); 
     [DllImport("MediaInfo.dll")] 
     private static extern Int64 MediaInfo_Open_Buffer_Continue_GoTo_Get(IntPtr Handle); 
     [DllImport("MediaInfo.dll")] 
     private static extern Int64 MediaInfoA_Open_Buffer_Continue_GoTo_Get(IntPtr Handle); 
     [DllImport("MediaInfo.dll")] 
     private static extern IntPtr MediaInfo_Open_Buffer_Finalize(IntPtr Handle); 
     [DllImport("MediaInfo.dll")] 
     private static extern IntPtr MediaInfoA_Open_Buffer_Finalize(IntPtr Handle); 
     [DllImport("MediaInfo.dll")] 
     private static extern void MediaInfo_Close(IntPtr Handle); 
     [DllImport("MediaInfo.dll")] 
     private static extern IntPtr MediaInfo_Inform(IntPtr Handle, IntPtr Reserved); 
     [DllImport("MediaInfo.dll")] 
     private static extern IntPtr MediaInfoA_Inform(IntPtr Handle, IntPtr Reserved); 
     [DllImport("MediaInfo.dll")] 
     private static extern IntPtr MediaInfo_GetI(IntPtr Handle, IntPtr StreamKind, IntPtr StreamNumber, IntPtr Parameter, IntPtr KindOfInfo); 
     [DllImport("MediaInfo.dll")] 
     private static extern IntPtr MediaInfoA_GetI(IntPtr Handle, IntPtr StreamKind, IntPtr StreamNumber, IntPtr Parameter, IntPtr KindOfInfo); 
     [DllImport("MediaInfo.dll")] 
     private static extern IntPtr MediaInfo_Get(IntPtr Handle, IntPtr StreamKind, IntPtr StreamNumber, [MarshalAs(UnmanagedType.LPWStr)] string Parameter, IntPtr KindOfInfo, IntPtr KindOfSearch); 
     [DllImport("MediaInfo.dll")] 
     private static extern IntPtr MediaInfoA_Get(IntPtr Handle, IntPtr StreamKind, IntPtr StreamNumber, IntPtr Parameter, IntPtr KindOfInfo, IntPtr KindOfSearch); 
     [DllImport("MediaInfo.dll")] 
     private static extern IntPtr MediaInfo_Option(IntPtr Handle, [MarshalAs(UnmanagedType.LPWStr)] string Option, [MarshalAs(UnmanagedType.LPWStr)] string Value); 
     [DllImport("MediaInfo.dll")] 
     private static extern IntPtr MediaInfoA_Option(IntPtr Handle, IntPtr Option, IntPtr Value); 
     [DllImport("MediaInfo.dll")] 
     private static extern IntPtr MediaInfo_State_Get(IntPtr Handle); 
     [DllImport("MediaInfo.dll")] 
     private static extern IntPtr MediaInfo_Count_Get(IntPtr Handle, IntPtr StreamKind, IntPtr StreamNumber); 

     //MediaInfo class 
     public MediaInfo() 
     { 
      Handle = MediaInfo_New(); 
      if (Environment.OSVersion.ToString().IndexOf("Windows")==-1) 
       MustUseAnsi=true; 
      else 
       MustUseAnsi=false; 
     } 
     ~MediaInfo() { MediaInfo_Delete(Handle); } 
     public int Open(String FileName) 
     { 
      if (MustUseAnsi) 
      { 
       IntPtr FileName_Ptr = Marshal.StringToHGlobalAnsi(FileName); 
       int ToReturn = (int)MediaInfoA_Open(Handle, FileName_Ptr); 
       Marshal.FreeHGlobal(FileName_Ptr); 
       return ToReturn; 
      } 
      else 
       return (int)MediaInfo_Open(Handle, FileName); 
     } 
     public int Open_Buffer_Init(Int64 File_Size, Int64 File_Offset) 
     { 
      return (int)MediaInfo_Open_Buffer_Init(Handle, File_Size, File_Offset); 
     } 
     public int Open_Buffer_Continue(IntPtr Buffer, IntPtr Buffer_Size) 
     { 
      return (int)MediaInfo_Open_Buffer_Continue(Handle, Buffer, Buffer_Size); 
     } 
     public Int64 Open_Buffer_Continue_GoTo_Get() 
     { 
      return (int)MediaInfo_Open_Buffer_Continue_GoTo_Get(Handle); 
     } 
     public int Open_Buffer_Finalize() 
     { 
      return (int)MediaInfo_Open_Buffer_Finalize(Handle); 
     } 
     public void Close() { MediaInfo_Close(Handle); } 
     public String Inform() 
     { 
      if (MustUseAnsi) 
       return Marshal.PtrToStringAnsi(MediaInfoA_Inform(Handle, (IntPtr)0)); 
      else 
       return Marshal.PtrToStringUni(MediaInfo_Inform(Handle, (IntPtr)0)); 
     } 
     public String Get(StreamKind StreamKind, int StreamNumber, String Parameter, InfoKind KindOfInfo, InfoKind KindOfSearch) 
     { 
      if (MustUseAnsi) 
      { 
       IntPtr Parameter_Ptr=Marshal.StringToHGlobalAnsi(Parameter); 
       String ToReturn=Marshal.PtrToStringAnsi(MediaInfoA_Get(Handle, (IntPtr)StreamKind, (IntPtr)StreamNumber, Parameter_Ptr, (IntPtr)KindOfInfo, (IntPtr)KindOfSearch)); 
       Marshal.FreeHGlobal(Parameter_Ptr); 
       return ToReturn; 
      } 
      else 
       return Marshal.PtrToStringUni(MediaInfo_Get(Handle, (IntPtr)StreamKind, (IntPtr)StreamNumber, Parameter, (IntPtr)KindOfInfo, (IntPtr)KindOfSearch)); 
     } 
     public String Get(StreamKind StreamKind, int StreamNumber, int Parameter, InfoKind KindOfInfo) 
     { 
      if (MustUseAnsi) 
       return Marshal.PtrToStringAnsi(MediaInfoA_GetI(Handle, (IntPtr)StreamKind, (IntPtr)StreamNumber, (IntPtr)Parameter, (IntPtr)KindOfInfo)); 
      else 
       return Marshal.PtrToStringUni(MediaInfo_GetI(Handle, (IntPtr)StreamKind, (IntPtr)StreamNumber, (IntPtr)Parameter, (IntPtr)KindOfInfo)); 
     } 
     public String Option(String Option, String Value) 
     { 
      if (MustUseAnsi) 
      { 
       IntPtr Option_Ptr=Marshal.StringToHGlobalAnsi(Option); 
       IntPtr Value_Ptr=Marshal.StringToHGlobalAnsi(Value); 
       String ToReturn=Marshal.PtrToStringAnsi(MediaInfoA_Option(Handle, Option_Ptr, Value_Ptr)); 
       Marshal.FreeHGlobal(Option_Ptr); 
       Marshal.FreeHGlobal(Value_Ptr); 
       return ToReturn; 
      } 
      else 
       return Marshal.PtrToStringUni(MediaInfo_Option(Handle, Option, Value)); 
     } 
     public int State_Get() { return (int)MediaInfo_State_Get(Handle); } 
     public int Count_Get(StreamKind StreamKind, int StreamNumber) { return (int)MediaInfo_Count_Get(Handle, (IntPtr)StreamKind, (IntPtr)StreamNumber); } 
     private IntPtr Handle; 
     private bool MustUseAnsi; 

     //Default values, if you know how to set default values in C#, say me 
     public String Get(StreamKind StreamKind, int StreamNumber, String Parameter, InfoKind KindOfInfo) { return Get(StreamKind, StreamNumber, Parameter, KindOfInfo, InfoKind.Name); } 
     public String Get(StreamKind StreamKind, int StreamNumber, String Parameter) { return Get(StreamKind, StreamNumber, Parameter, InfoKind.Text, InfoKind.Name); } 
     public String Get(StreamKind StreamKind, int StreamNumber, int Parameter) { return Get(StreamKind, StreamNumber, Parameter, InfoKind.Text); } 
     public String Option(String Option_) { return Option(Option_, ""); } 
     public int Count_Get(StreamKind StreamKind) { return Count_Get(StreamKind, -1); } 
    } 

} //NameSpace 

사용법 :

using System; 
using MediaInfoLib; 


namespace ConsoleApplication1 
{ 

    class Program 
    { 

     private static void Main(string[] args) 
     { 

      MediaInfo info = new MediaInfo(); 
      info.Open(@"E:\Songs Collection\Video's\Hindi Song's\Ajab.Si.By.HFZ.avi"); 
      var movie_lenstr = info.Get(StreamKind.General, 0, "Duration"); 
      Int32 movie_len; 
      if (Int32.TryParse(movie_lenstr, out movie_len)) 
      { 
       Console.WriteLine("Length of movie in milli-second : {0}", movie_len); 
      } 
      info.Close(); 

     } 

    } 

} 

이 가능한 많은 매개 변수, 그래서 86 OS의 문서를 한 번

  • 를 통해 이동 : Here
: 64의 OS에 대한 Here
  • 012 3,516,

    : 당신이 64/86 OS에 대한 DLL의 적절한 빌드 형식을 사용하십시오

  • 디렉토리 응용 프로그램 디렉토리/시스템

    1. 놓습니다 mediainfo.dll는, 그렇지는
    될 수 있습니다

    시도가 잘못된 형식

  • +0

    의 프로그램을로드하려고했습니다 여기에 잘못된 것이 있다고 생각합니다.이 동영상을 실행하면 내 영화 (1:21:05)의 초가 4865616 초라고 말합니다. 내가 여기서 뭔가를 놓치고 있니? 올바르지 않은 지속 시간을 갖는 이유는 무엇입니까? –

    +0

    밀리 초 단위 –

    +0

    "재생 시간"\t \t 스트림 재생 시간 (밀리 초) –

    관련 문제