如何在不使用ffmpeg和DirectshowLib的情况下获取mov与mp4视频宽高
替代DirectshowLib和FFmpeg获取MP4/MOV视频宽高的方法
方法1:Windows原生Media Foundation API(仅Windows平台)
Media Foundation是Windows系统内置的多媒体框架,无需额外安装任何工具或库,适合Windows环境下的开发。
示例C#代码:
using System; using Windows.Media.Core; using Windows.Media.MediaProperties; public static (int Width, int Height) GetVideoResolution(string videoPath) { var mediaSource = MediaSource.CreateFromUri(new Uri(videoPath)); var playbackItem = new MediaPlaybackItem(mediaSource); var propsTask = playbackItem.GetDisplayPropertiesAsync().AsTask(); propsTask.Wait(); var videoProps = propsTask.Result.VideoProperties; return (videoProps.Width, videoProps.Height); }
注意:项目需针对Windows 10及以上版本,需引用Windows.Media相关命名空间。
方法2:使用TagLibSharp托管库
TagLibSharp是纯.NET的元数据处理库,跨平台支持Windows、Linux、macOS,可直接读取MP4/MOV的视频属性,无需外部依赖。
先通过NuGet安装TagLibSharp,再使用以下代码:
using TagLib; public static (int Width, int Height) GetVideoResolution(string videoPath) { var mediaFile = TagLib.File.Create(videoPath); if (mediaFile.Properties.VideoWidth > 0 && mediaFile.Properties.VideoHeight > 0) { return (mediaFile.Properties.VideoWidth, mediaFile.Properties.VideoHeight); } throw new InvalidOperationException("无法提取视频宽高信息"); }
方法3:手动解析MP4/MOV文件头
若完全不想依赖任何第三方库或系统API,可手动解析文件结构。MP4和MOV均基于QuickTime格式,核心是读取moov原子下视频轨道的tkhd(Track Header)字段,其中包含宽高数据(单位为1/65536像素,需转换为实际值)。
大致流程:
- 打开文件并读取头部,定位
moov原子的起始位置 - 遍历
moov下的trak原子,识别视频轨道(通过mdia/minf/stbl/stsd中的编码标识) - 读取对应
trak的tkhd原子,解析其中的width和height字段并转换为像素值
这种方法需要熟悉MP4/MOV的格式规范,适合对性能或独立性有极高要求的场景。
内容的提问来源于stack exchange,提问作者kailash
相关产品推荐
相关产品推荐

