MediaInfo学习笔记

    怎样获得一个影音文件的相关参数:如歌手、专辑、发布时间、播放时间、声道、编码类型等等信息。我找了很久,终于找到了MediaInfo这个好东西。它提供一个MediaInfo.dll的库给我们程序员使用。利用它,我们再也不需要去考虑。这个mp3是idv1还是idv2,只需要统一调用它提供的函数就成了。MediaInfo官方还提供C#版的工具代码以使我们避免接触到它COM接口。
  下面代码建立在:MediaInfoDLL.cs这个文件之上。C#用户最好加上它。使用它里面封装的函数就很方便了。
  一、API使用范例
  MediaInfo media = new MediaInfo();   //创建一个MediaInfo实例。

  media.Open(@"H:\film\单片\赤壁\赤壁.rmvb");   //取一个文件的信息必须先open,用完后再Close。切记。

  //返回一个概要性的信息
       rtb.Text = media.Inform();   

  //获得媒体的播放时间,单位为ms(毫秒转化成秒、分、时需要自己手换算了)
  string d= media.Get(StreamKind.General, 0, "Duration");

  //显示所有媒体信息(第二参数的1相当于true)
  media.Option("Complete", "1");
  rtb.Text = media.Inform();

  //获得文件长度(单位B)
  float fs = Convert.ToSingle(media.Get(0, 0, "FileSize"));
  rtb.Text = (fs/1024/1024).ToString();

       //第一参数是流类型,第二参数是流号,第三参数为标签在头部中的序号
       rtb.Text = media.Get(0, 0, 46);

  //获得某种流类型的段数
  rtb.Text = media.Count_Get(StreamKind.Video).ToString();

  //获得媒体格式信息
  rtb.Text = media.Get(StreamKind.General, 0, "Format"); 
  
  //枚举某种类型的流的所有支持的标签名
        string s = "";
        int i=0;
        while (true)
        {
            s = media.Get(StreamKind.General, 0, i++,InfoKind.Name);
            if (s == "") break;
            rtb.Text = rtb.Text + "\n" + s;
        }
        media.Close();
  
  通过上面这个实验,我还发现InfoKind中其他几个参数的作用:
    public enum InfoKind
     {
         Name,          //标签名
         Text,     //标签的值
         Measure,  //无用
         Options,   //不晓得什么用
         NameText,  //标签名的别名吧,相当于名称注解一样的
         MeasureText,  //也不晓得有什么用
         Info,      //比NameText更详细的解释性字符串,可惜全是英文。
         HowTo     //取不到任何值。
     }
  由上可知,关键就是用Name、Text了。我们可以把Text不为空的全部枚举到一个List中。
  二、开发中真正要用到的代码
  上面说的其实还有些不清楚,我们平常使用并不会用什么Inform。我们一般是取某个标签的值。通常用到的代码如下:
  MediaInfo m=new MediaInfo();
  m.Open(xxxxx);
  m.Get(StreamInfo.General/Audio/Video,0,keyName);      //取标签值
  bool bVideo=m.Count_Get(StreamInfo.Video)>0;    //判断某个文件是单频还是视频,true为视频,false为音频
  m.Close();

        ///
        /// 把毫秒化为xx:xx:xx的格式
        ///

        ///
        ///
        public static string TimeCodeString(int msecs)
        {
            //frames
            int timebase = msecs % 1000;
            string frames = ((int)((float)timebase / 33.3333333333f)).ToString();
            if (frames.Length == 1) frames = "0" + frames;
            msecs -= timebase;

            //seconds
            timebase = msecs % 60000;
            string secs = (timebase / 1000).ToString();
            if (secs.Length == 1) secs = "0" + secs;
            msecs -= timebase;

            //minutes
            timebase = msecs % 3600000;
            string mins = (timebase / 60000).ToString();
            if (mins.Length == 1) mins = "0" + mins;
            msecs -= timebase;

            return (msecs / 3600000).ToString() + ":" + mins + ":" + secs;
            //return (msecs / 3600000).ToString() + ":" + mins + ":" + secs + ";" + frames;
        }
  三、标签的说明
  每种格式的文件,它头文件的格式不一样,包含的标签数也不一样,所以存在这样的麻烦事,某个标签在mp3中有,但是在mid中没有。在音频中有,在视频文件中没有。这儿介绍几个常用的标签
  Format   编码格式,mp3,rmvb等大伙都有的。
  FileSize    文件大小,这个也是通用
  Duration   播放时间,大伙都有
  Performer   艺术家,音频有,视频文件没有
  Recorded_Date 录制日期,音频有,视频文件没有
  Album    专辑,音频有,视频文件没有
  Comment    备注,音频有,视频文件没有

你可能感兴趣的:(编解码学习笔记)