Exemplo n.º 1
0
        private static void UpdateAudioPart(IMediaDet mediaDet, MediaProperty mediaProperty)
        {
            int         hr        = 0;
            AMMediaType mediaType = new AMMediaType();

            hr = mediaDet.get_StreamMediaType(mediaType);
            DsError.ThrowExceptionForHR(hr);

            mediaProperty.audioSubType = mediaType.subType;

            double streamLength;

            hr = mediaDet.get_StreamLength(out streamLength);
            DsError.ThrowExceptionForHR(hr);

            mediaProperty.audioLength = TimeSpan.FromSeconds(streamLength);

            if (mediaType.formatType == FormatType.WaveEx)
            {
                WaveFormatEx waveFormatEx = (WaveFormatEx)Marshal.PtrToStructure(mediaType.formatPtr, typeof(WaveFormatEx));
                mediaProperty.channels      = waveFormatEx.nChannels;
                mediaProperty.samplesPerSec = ((float)waveFormatEx.nSamplesPerSec) / 1000;
                mediaProperty.bitsPerSample = waveFormatEx.wBitsPerSample;
            }
        }
Exemplo n.º 2
0
        private static void UpdateVideoPart(IMediaDet mediaDet, MediaProperty mediaProperty)
        {
            int         hr        = 0;
            AMMediaType mediaType = new AMMediaType();

            hr = mediaDet.get_StreamMediaType(mediaType);
            DsError.ThrowExceptionForHR(hr);

            mediaProperty.videoSubType = mediaType.subType;

            double streamLength;

            hr = mediaDet.get_StreamLength(out streamLength);
            DsError.ThrowExceptionForHR(hr);

            mediaProperty.videoLength = TimeSpan.FromSeconds(streamLength);

            if (mediaType.formatType == FormatType.VideoInfo)
            {
                VideoInfoHeader videoHeader = (VideoInfoHeader)Marshal.PtrToStructure(mediaType.formatPtr, typeof(VideoInfoHeader));

                mediaProperty.resolution   = new Size(videoHeader.BmiHeader.Width, videoHeader.BmiHeader.Height);
                mediaProperty.bitsPerPixel = videoHeader.BmiHeader.BitCount;
                mediaProperty.fourCC       = FourCCToString(videoHeader.BmiHeader.Compression);
            }
        }
Exemplo n.º 3
0
        /// <summary>
        /// 获取媒体的各种属性
        /// </summary>
        /// <param name="fileName">视频文件名(包含文件路径)</param>
        /// <returns>媒体的各种属性</returns>
        public static MediaProperty GetMediaProperty(string fileName)
        {
            int           hr            = 0; //接收函数返回值,以此判断调用函数成功与否
            MediaProperty mediaProperty = new MediaProperty();
            IMediaDet     mediaDet      = null;

            try
            {
                mediaDet = (IMediaDet) new MediaDet();      //创建DirectShow的媒体探测对象
                hr       = mediaDet.put_Filename(fileName); //设置媒体探测对象的文件名(包含文件路径)
                if (hr < 0)
                {
                    DsError.ThrowExceptionForHR(hr);
                }
                mediaProperty.fileName = fileName;

                int streamCount;
                hr = mediaDet.get_OutputStreams(out streamCount);
                DsError.ThrowExceptionForHR(hr);

                for (int i = 0; i < streamCount; i++)
                {
                    hr = mediaDet.put_CurrentStream(i);
                    DsError.ThrowExceptionForHR(hr);

                    Guid streamType;
                    hr = mediaDet.get_StreamType(out streamType);
                    DsError.ThrowExceptionForHR(hr);

                    if (streamType == MediaType.Audio)
                    {
                        UpdateAudioPart(mediaDet, mediaProperty);
                    }
                    else if (streamType == MediaType.Video)
                    {
                        UpdateVideoPart(mediaDet, mediaProperty);
                    }
                    else
                    {
                        continue;
                    }
                }

                if (mediaProperty.videoSubType != Guid.Empty)
                {
                    mediaProperty.snapshot = GetSnapshot(mediaDet, mediaProperty.resolution.Width, mediaProperty.resolution.Height, mediaProperty.videoLength.TotalSeconds / 2);
                }
            }
            finally
            {
                if (mediaDet != null)
                {
                    Marshal.ReleaseComObject(mediaDet);
                }
            }

            return(mediaProperty);
        }