2012-07-05 7 views
0

mp4 파일의 재생 시간을 초 단위로 늘려야합니다. DirectShow (아래 코드 참조)를 사용하고 있었지만, 특히 도움이되지 않는 오류가 발생했습니다. 나는 누군가가 이것에 쉬운 해결책이 있는지 궁금 하네. "HRESULT에서 예외 : 0x80040265은" DirectShow로 MP4 파일 길이 얻기

내가이를 사용하여 시도 : Getting length of video를이 코드를 실행할 때마다

public static void getDuration(string moviePath) 
    { 
     FilgraphManager m_objFilterGraph = null; 
     m_objFilterGraph = new FilgraphManager(); 
     m_objFilterGraph.RenderFile(moviePath); 

     IMediaPosition m_objMediaPosition = null; 
     m_objMediaPosition = m_objFilterGraph as IMediaPosition; 

     Console.WriteLine(m_objMediaPosition.Duration); 
    } 

, 내가 오류 (진심으로, 해당 정보를 얻는 것은 매우 어려울 것이라는 점을 알고 자) 하지만 MP4 파일에서 작동한다고 생각하지 않기 때문에 작동하지 않습니다.

심각하게도이 작업을 훨씬 쉽게 수행 할 수있는 방법이 필요합니다.

참고 : ffmpeg와 같은 exe를 사용하지 말고 출력을 분석하여 정보를 얻는 것을 선호합니다.

+0

약간의 탐험을 거친 후 DirectShow에서 정보를 얻을 수없는 것처럼 보입니다. MP4를 지원하지 않기 때문에 마음에 들썩입니다. 어쨌든 어떤 도움을 주시면 감사하겠습니다. – RedHack

답변

2

문제가 올바르게 해결되고 있습니다. 소스 파일 .MP4부터 최대 비디오 및 오디오 렌더러까지 좋은 파이프 라인을 구축해야합니다. 그렇다면 IMediaPosition.Duration 당신이 원하는 것을 얻을 것입니다. 현재 파이프 라인을 빌드 할 수 없기 때문에 VFW_E_UNSUPPORTED_STREAM이 표시됩니다.

깨끗한 Windows에서 DirectShow의 MPEG-4에 대한 지원이 제대로되어 있지 않으므로 누락 된 블록을 추가하려면 타사 파서가 설치되어 있어야합니다. 이것이 문제의 가능한 원인입니다. 이 격차를 메우기 위해 좋은 Free DirectShow Mpeg-4 Filters이 있습니다.

링크 Getting length of video의 코드 샘플은 기본적으로 유효하지만 더 이상 사용되지 않는 구성 요소를 사용합니다.이 구성 요소는 추가로 미디어 파일에 추가 가정을합니다. 시스템에 .MP4에 대한 지원이 제공된 경우 IMediaPosition.Duration은 사용자가 원하는 것을 제공합니다.

+0

감사합니다. 그러나 DirectShow에서 GDCL Mpeg-4 필터를 사용하는 방법에 대한 샘플 코드를 연결해 주시겠습니까?이 작업을 수행하는 방법에 대한 정보는 사이트에서 찾을 수 없습니다. – RedHack

+0

기본적으로 DLL을 다운로드하고 'regvsr32'를 다운로드해야합니다. 그런 다음 코드 스 니펫이 현재 모양과 잘 일치해야합니다. 또 다른 가능한 이유는 MP4 파일에 디코딩 할 수없는 스트림이 포함되어 있다는 것입니다. H.264와 같이 희귀/비표준 또는 일치하는 취소 중 하나가 현재 설치되어 있습니다. 원래 게시물에서이 간단한 방법을 사용하여 재생 시간을 가져올 수 없으므로 약간 "미세 조정"방식으로 재생해야합니다. –

0

IMediaPosition 인터페이스에서 get_Duration()을 사용할 수 있습니다.

이 값은 비디오 길이가 초 단위 인 double 값을 반환합니다.

Double Lenght; 

    m_FilterGraph = new FilterGraph() 

//Configure the FilterGraph() 

    m_mediaPosition = m_FilterGraph as IMediaPosition; 
    m_mediaPosition.get_Duration(out Length);