怎样获得一个影音文件的相关参数:如歌手、专辑、发布时间、播放时间、声道、编码类型等等信息。我找了很久,终于找到了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<string>中。
二、开发中真正要用到的代码
上面说的其实还有些不清楚,我们平常使用并不会用什么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();
/// <summary>
/// 把毫秒化为xx:xx:xx的格式
/// </summary>
/// <param name=”msecs”></param>
/// <returns></returns>
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 备注,音频有,视频文件没有