3

Microsoft.WindowsAPICodePack.Shell.ShellFileファイルパスからビデオサイズ(幅と高さ)を取得するために使用しています。

public Size GetVideoSize(string videoFullPath)
{
    if (File.Exists(videoFullPath))
    {
        ShellFile shellFile = ShellFile.FromFilePath(videoFullPath);

        int videoWidth = (int)shellFile.Properties.System.Video.FrameWidth.Value;
        int videoHeight = (int)shellFile.Properties.System.Video.FrameHeight.Value;

        return new Size(videoWidth, videoHeight);
    }
    return Size.Empty;
}

問題は、このメソッドがm4vファイルの正しいサイズを取得しないことです。何か提案はありますか?実際の幅/高さを取得するために何を使用できますか?

例:実際のサイズが856x480のm4vビデオがあります

  • Windowsエクスプローラーでファイルのプロパティを見ると、サイズは720x480(間違っています)です。
  • ビデオプレーヤーでビデオを開くと、ビデオの詳細に720x480のサイズが表示されていても、ビデオは正しいサイズでレンダリングされます。
  • WPFのMediaElementコントロールにビデオを読み込むと、を介して正しいサイズを取得できますmediaElement.NaturalVideoWidth, mediaElement.NaturalVideoHeightが、問題は、WPF参照がないクラスライブラリでサイズを取得する必要があることです。
4

1 に答える 1

1

ここで重要なヒントは、856/480 = 1.78 で、これはワイドスクリーン ビデオの一般的なアスペクト比である 16/9 = 1.77 にほぼ等しいことです。比率が 1:1.33 または 1:1.5 (たとえば、640x480 または 720x480) のピクセル解像度のビデオがあることは珍しくありませんが、1:1.77 でより広い縦横比に引き伸ばされて表示されることを意図しています (たとえば、 856x480)。これはアナモフィック ワイドスクリーンと呼ばれます。したがって、720x480 はおそらくビデオの正しい解像度ですが、正しい表示サイズではありません。

ウィンドウにアナモルフィック ワイドスクリーンを表示する場合、ビデオ プレーヤーは通常、同じ高さを維持し、幅を拡大して正しい表示アスペクト比を取得します。フルスクリーンの場合、幅と高さの両方が引き伸ばされますが、同じ倍率ではないため、ディスプレイの縦横比が正しくなり、ビデオが画面解像度内に正確に収まります。

表示サイズを取得するには (これが目的のようです)、アスペクト比が必要です。さいわい、フレームの幅と高さを取得するために使用しているのと同じメタデータ プロパティ APIにも、縦横比のプロパティ、つまりSystem.Video.Horizo​​ntalAspectRatioSystem.Video.VerticalAspectRatioがあります。これは文書化されていませんが、これらは画像表示のアスペクト比ではなく、ピクセルのアスペクト比を参照しているようです。アナモフィック ビデオに必要なものは次のとおりです。

int videoWidth = (int)shellFile.Properties.System.Video.FrameWidth.Value;
int videoHeight = (int)shellFile.Properties.System.Video.FrameHeight.Value;
int horizontalAspect = (int)shellFile.Properties.System.Video.HorizontalAspectRatio.Value;
int verticalAspect = (int)shellFile.Properties.System.Video.VerticalAspectRatio.Value;
int displayWidth = videoWidth * horizontalAspect / verticalAspect;
int displayHeight = videoHeight;

あなたのケースで私が期待するのは、 horizo​​ntalAspect = 53 および verticalAspect = 45 (または同様の比率を生成する他の値) です。

ディスプレイの解像度は 16 ピクセルまたは 8 ピクセルの正確な倍数に切り上げられる場合があるため、次のような操作も必要になる場合があります。

int roundingMultiple = 8;
int displayWidth = videoWidth * horizontalAspect / verticalAspect;
displayWidth = ((displayWidth - 1) / roundingMultiple + 1) * roundingMultiple;

これは mkv ファイルに固有のものではありません。どのコンテナ形式のアナモフィック ビデオ ファイルも同じように処理する必要があります。

編集: 上記のコードを変更して、 horizo​​ntalAspect / verticalAspect が明らかにピクセルの縦横比であるという事実を反映させました。

于 2012-11-25T12:39:08.800 に答える