我正在尝试在 WPF MediaElement 中显示视频。我用手机拍下了它们。横向模式下拍摄的视频显示效果良好,纵向模式下拍摄的视频会旋转 90 度。在 Windows 中查看它们时,它们会以正确的方向显示。
我尝试使用 TagLib# 来检测方向,它报告横向和纵向相同尺寸的 VideoHeight:2160 和 VideoWidth:3840,无论方向如何。
然后我使用ffprobe进一步调查,发现无论方向如何,宽度和高度确实是相同的,但视频方向信息位于“side data:displaymatrix:旋转-90.00度”中。
问题: 如何使用 TagLib-Sharp 从 mp4 文件读取侧面数据:displaymatrix ?
如果 TagLib-Sharp 无法做到这一点,我还能如何获取此信息?
看来 TagLib-Sharp 根本做不到。至少我不知道如何做到这一点。
但是我发现了另一个可以读取视频或照片方向的元数据读取库:MetadataExtractor,可以使用 Nuget 安装。
这里是如何读取方向的代码,MetadataExtractor实际上调用了Rotation:
using MetadataExtractor;
var isLandscape = true;
var directories = ImageMetadataReader.ReadMetadata("PathAndFilename);
var isRotationFound = false;
foreach (var directory in directories) {
if (directory.Name=="QuickTime Track Header") {
foreach (var imageMetadataTag in directory.Tags) {
if (imageMetadataTag.Name=="Rotation") {
isRotationFound = true;
if (imageMetadataTag.Description=="-90") {
isLandscape = false;
}
break;
}
}
}
if (isRotationFound) break;
}
VideoPlayer.Source = new Uri(startFile.FullName);
VideoPlayer.LayoutTransform =
isLandscape ? new RotateTransform { Angle = 0 } : new RotateTransform { Angle = 90 };
VideoPlayer.Play();
重要区别
TagLib-Sharp:为元数据提供属性,例如宽度或 ISO 或...这非常方便,但如果没有提供属性,例如方向,则会出现问题。
MetadataExtractor:可以访问所有元数据,但开发人员需要知道该数据使用的名称,这是我在互联网上无法轻松找到的信息。
请参阅 CodeProject.com 上我的文章 WPF:以纵向和横向方式正确显示照片和视频,了解更详细的说明。