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; } }
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); } }
/// <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); }