2013-03-02 9 views
0

미디어 파일의 길이를 결정할 수 있습니까?미디어 파일의 길이를 어떻게 확인할 수 있습니까?

미디어 (비디오) 파일을 말하면 다음 형식의 파일을 의미합니다. .wmv, .avi. .mp4, .flv, .mkv. 그리고 내가 말하는 지속 시간이란 비디오 파일이 얼마나 오래 분과 초가 걸릴지를 결정하는 것을 의미합니다.

각 파일이 다른 방식으로 인코딩/압축되어 있음을 이해하지만 각 파일의 길이가 헤더에 저장 될 수 있습니까? 이러한 파일을 메모리로 읽거나 헤더를 검사 할 수있는 기본 WinAPI 함수가 있습니까? 네이티브 WinAPI는 .png에 대한 API 함수를 제공하지 않으므로 동영상 파일에도 장시간 쏟아 부었지만 결코 알지 못합니다.

네이티브 WinAPI에이 기능을 사용할 수없는 경우 C++ 비디오 API/라이브러리를 사용 하시겠습니까? 아니면 파일을 열고 수동으로 기간 검색 (예 : fopen())할까요?

+3

는 사회자가 손 – BrokenGlass

+0

을 FFmpeg를 살펴 보도록는 * "지금까지 윈도우의 API로 그들이 와서 갈 것"- 나는 않을 것 ** 단일 ** Windows API에 대해 알고 있습니다. 어느 것을 염두에 두시겠습니까? –

답변

1

순수 Windows API를 사용하여 Windows API를 사용하려면 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; 
} 
1

동영상에는 다양한 API가 있습니다. 내가 그것을 들여다 보니 꽤 오랜 시간이 걸렸다. 그러나 나는 이것을 "오픈 소스 C++ 비디오 라이브러리"의 google 검색에서 찾았다.

윈도우 API만큼 그들은 나간 것처럼 보이기 때문에 나는 개인적으로 ' 그들에게 의존하지 마라. 그것들은 또한 휴대하기가 쉽지 않습니다. 당신이해야한다면 Direct 3D 11과 같은 것을 볼 수 있습니다. 게임에 대한 인기있는 옵션은 Bink입니다.

이러한 라이브러리 중 일부는 많은 정보가이 정보를 어떤 종류의 헤더에 포함하므로 필요한 정보를 제공해야합니다.

+0

*에 대담 = 너무 많은 시간을 제거, 롤 – IInspectable

관련 문제