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<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    备注,音频有,视频文件没有
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Intel Media SDK提供了多种图像处理接口,其中包括缩放接口。缩放接口可用于将视频帧的大小更改为所需的大小。下面是使用Intel Media SDK进行缩放的一些示例代码: 1.创建缩放器 ```c++ // 初始化 MFX 编码器 mfxStatus sts; MFXVideoSession session; sts = session.Init(MFX_IMPL_HARDWARE_ANY, NULL); assert(sts == MFX_ERR_NONE); // 初始化缩放器 mfxFrameAllocator alloc; mfxVideoParam param; MFXVideoVPP vpp(session); memset(&param, 0, sizeof(param)); param.vpp.In.FourCC = MFX_FOURCC_NV12; param.vpp.In.ChromaFormat = MFX_CHROMAFORMAT_YUV420; param.vpp.In.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; param.vpp.In.FrameRateExtN = 30; param.vpp.In.FrameRateExtD = 1; param.vpp.In.CropW = src_width; param.vpp.In.CropH = src_height; param.vpp.In.Width = MFX_ALIGN16(src_width); param.vpp.In.Height = (MFX_PICSTRUCT_PROGRESSIVE == param.vpp.In.PicStruct) ? MFX_ALIGN16(src_height) : MFX_ALIGN32(src_height); param.vpp.Out.FourCC = MFX_FOURCC_NV12; param.vpp.Out.ChromaFormat = MFX_CHROMAFORMAT_YUV420; param.vpp.Out.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; param.vpp.Out.FrameRateExtN = 30; param.vpp.Out.FrameRateExtD = 1; param.vpp.Out.CropW = dst_width; param.vpp.Out.CropH = dst_height; param.vpp.Out.Width = MFX_ALIGN16(dst_width); param.vpp.Out.Height = (MFX_PICSTRUCT_PROGRESSIVE == param.vpp.Out.PicStruct) ? MFX_ALIGN16(dst_height) : MFX_ALIGN32(dst_height); sts = vpp.Init(&param); assert(sts == MFX_ERR_NONE); // 分配内存 mfxFrameAllocRequest request[2]; memset(&request, 0, sizeof(request)); sts = vpp.QueryIOSurf(&param, request); assert(sts >= MFX_ERR_NONE); request[1].Type |= MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET; sts = alloc.Init(&request[0]); assert(sts == MFX_ERR_NONE); sts = alloc.Alloc(alloc.pthis, &request[0], MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET | MFX_MEMTYPE_FROM_VPPOUT | MFX_MEMTYPE_EXTERNAL_FRAME); assert(sts == MFX_ERR_NONE); sts = alloc.Alloc(alloc.pthis, &request[1], MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET | MFX_MEMTYPE_FROM_DECODE | MFX_MEMTYPE_EXTERNAL_FRAME); assert(sts == MFX_ERR_NONE); ``` 2.设置输入帧 ```c++ // 创建输入帧 mfxFrameSurface1 *input_frame = NULL; mfxU16 crop_w = src_width, crop_h = src_height; mfxFrameInfo input_info = param.vpp.In; input_info.CropW = crop_w; input_info.CropH = crop_h; mfxFrameAllocResponse input_response = { 0 }; sts = alloc.Alloc(alloc.pthis, &request[1], MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET | MFX_MEMTYPE_FROM_DECODE | MFX_MEMTYPE_EXTERNAL_FRAME, &input_frame); assert(sts == MFX_ERR_NONE); input_frame->Info = input_info; input_frame->Data.TimeStamp = 0; input_frame->Data.FrameOrder = 0; ``` 3.设置输出帧 ```c++ // 创建输出帧 mfxFrameSurface1 *output_frame = NULL; mfxFrameInfo output_info = param.vpp.Out; output_info.CropW = dst_width; output_info.CropH = dst_height; mfxFrameAllocResponse output_response = { 0 }; sts = alloc.Alloc(alloc.pthis, &request[0], MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET | MFX_MEMTYPE_FROM_VPPOUT | MFX_MEMTYPE_EXTERNAL_FRAME, &output_frame); assert(sts == MFX_ERR_NONE); output_frame->Info = output_info; output_frame->Data.TimeStamp = 0; output_frame->Data.FrameOrder = 0; ``` 4.进行缩放 ```c++ // 处理视频帧 mfxSyncPoint syncp; mfxFrameSurface1 *in_surf = input_frame; mfxFrameSurface1 *out_surf = output_frame; sts = vpp.RunFrameVPPAsync(in_surf, out_surf, NULL, &syncp); assert(sts == MFX_ERR_NONE); // 等待缩放完成 sts = session.SyncOperation(syncp, 60000); assert(sts == MFX_ERR_NONE); ``` 以上代码演示了如何使用Intel Media SDK进行缩放操作。请注意,这只是一个示例,具体的实现可能会因应用场景而异。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值