0

メディアファイルの長さを決定することは可能ですか?

私がメディア(ビデオ)ファイルと言うとき、私は次のタイプのファイルを意味します:.wmv、.avi。.mp4、.flv、.mkv。そして、私が継続時間と言うとき、私はビデオファイルが何分と何秒でどれくらいの長さであるかを決定することを意味します。

各ファイルのエンコード/パックが異なることは理解していますが、各ファイルの期間がヘッダーに保存されている可能性がありますか?これらのファイルのいずれかをメモリに読み込んだり、少なくともヘッダーを検査したりできるネイティブのWinAPI関数はありますか?ネイティブのWinAPIは.png用のAPI関数を提供していないことを知っているので、映画ファイルにとってもロングショットですが、あなたは決して知りません。

ネイティブWinAPIにこれを実行できる関数がない場合は、C++ビデオAPI/ライブラリをお勧めしますか、それともファイルを開いてヘッダーを手動で(つまり、を使用してfopen())検索しますか?

4

2 に答える 2

1

ビデオ用の API は数多くあります。調べてからしばらく経ちましたが、「オープンソースC ++ビデオライブラリ」のGoogle検索からこのリンクを見つけました

Windows APIに関する限り、それらは行き来するように見えるので、個人的にはそれらに依存しません。また、移植可能である可能性はほとんどありません。必要に応じて、Direct 3D 11のようなものを見ることができます。ゲームで人気のあるオプションはBinkです。

これらのライブラリのいずれも、必要な情報を提供する必要があります。これは、多くの形式で何らかのヘッダーにこの情報が含まれているためです。

于 2013-03-02T02:35:30.387 に答える
1

純粋な Windows API (Windows ブラウザーが行うように) を使用して実行する場合は、propsys.dll を使用して実行する必要があります。

また、DirectShow で行うこともできます。このような:

REFERENCE_TIME GetMediaDuration(CString filePath)
{
     CComPtr<IGraphBuilder> graphBuilder;
     if (SUCCEEDED(CoCreateInstance(CLSID_FilterGraph, 0, CLSCTX_INPROC,
                                IID_IGraphBuilder, reinterpret_cast<void**>(&graphBuilder))))
     {
          CComPtr<IBaseFilter> pSource;
          HRESULT hr = graphBuilder->AddSourceFilter(filePath, L"Source", &pSource);    

          CComPtr<IPin> pPin;
          pSource->FindPin(L"Output", &pPin);   

          if (SUCCEEDED(graphBuilder->Render(pPin)))
          {
            CComPtr<IMediaSeeking> mediaSeeking;
            hr = graphBuilder->QueryInterface( IID_IMediaSeeking, reinterpret_cast<void**>(&mediaSeeking));

            REFERENCE_TIME rtDur = 100;
            if (SUCCEEDED(mediaSeeking->GetDuration(&rtDur)))
            return rtDur;
          }
      }
      return 100;
}
于 2013-08-30T15:34:44.460 に答える