2014-10-07 8 views
0

여러 오디오 및 비디오 장치에서 읽고 적절한 컨테이너 (예 : mpeg)에 데이터를 쓰는 프로그램을 작성 중입니다. 나는 리눅스에서 코드를 작성했지만 지금은 윈도우 용으로 또 다른 버전을 작성해야한다. 이것이 내가 리눅스에서 작성한 방법입니다 :Windows 오디오 및 비디오 캡처 소프트웨어 패러다임

initialize the devices (audio: ALSA, video: V4L2) 
get the file descriptors 
mainloop 
    select on file descriptors 
    respond to the proper device 

불행히도 내 전문 지식은 Linux만을위한 것이며 Windows SDK를 사용한 적이 없습니다. 나는 올바른 패러다임이 무엇인지 모른다. 사람들은 fds를 사용하여 동일한 방식으로 선택합니까? 이 경우 DirectShow에서 fd를 얻을 수있는 방법이 있습니까? 아, 마지막으로,이 모든 것을 위해 하나의 스레드 만 사용해야합니다. 따라서 여러 스레드가 동시에 실행되고 각각 하나의 장치를 처리하는 솔루션은 허용되지 않습니다. Linux의 코드는 현재 하나의 스레드에서만 실행됩니다. 또한 코드는 C++로 작성되어야합니다. 고맙습니다.

두 번째 생각 여기서 질문하는 질문은 하나뿐입니다. 어떻게 DirectShow 라이브러리에서 비디오/오디오 장치의 파일 설명자를 얻을 수 있습니까? V4L2와 ALSA로 작업 한 사람들은 DirectShow에서 똑같은 것을 찾고 있습니다.

+0

Windows에는 많은 A/V 기술이 있으며 사용하려는 최상의 OS는 대상 OS 버전에 따라 다릅니다. 가장 최근에 (저는 믿습니다) [Media Foundation] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms696274(v=vs.85) .aspx)입니다. –

+0

나는 그 표적이 일반적이어야한다고 말할 것이다. 코드가 모든 윈도우 배포판 (ver> XP)에서 실행되면 더 좋을 것입니다. 그러나 저는 도서관 자체보다는 패러다임에 더 관심이 있습니다. 여러 비디오 및 오디오 소스가 있기 때문에 효율적이어야하며 한 스레드의 제약 조건 만 해결해야합니다. –

+0

DirectShow가 가장 좋은 방법 일 것입니다. http://msdn.microsoft.com/ko-us/library/windows/desktop/dd407331 (v = vs.85) .aspx. –

답변

2

로마인은이 주제의 전문가이며 더 나은 답변을 찾을 수 없을 것입니다. 로마의 대답에 추가하려면 , 당신은 DirectShow의 이런 짓을 할 것이다 :

Enumerate video/audio capture devices/select capture device 
Construct DirectShow graph 
    Add video and audio capture source filters to graph 
    Add 2 sample grabbers to graph 
    Configure sample grabber callbacks 
    Connect capture source filters to samples grabbers 
    Add renderers to graph (This could be a null renderer or a video/audio renderer) 
    Connect sample grabbers to renderers 
Play graph 
Run the event loop 
DirectShow will invoke the callbacks per media sample traversing the graph. 

그래프는 일반적으로 다음과 같이 보일 것이다 : 로마 말했듯이

   callback 
        | 
Video capture -- sample grabber -- renderer 

Audio capture -- sample grabber -- renderer 
        | 
       callback 

의 SDK를 보여주는 많은 샘플이 있습니다 방법

  • 열거 캡처 소스
  • 사용/구성하는 샘플 그래버
  • 당신이 스레딩의 주제에 대한 그래프

을 구성하고 재생하는 응용 프로그램을 작성, 당신은 기본 응용 프로그램 스레드에 대한 코드를 작성할 수 있습니다, 그리고 DirectShow는 내부 스레드 관리를 처리합니다. 그러나 콜백 함수가 집중적으로 처리되는 경우 (MSDN부터) :

데이터 처리 스레드는 콜백 메소드가 반환 될 때까지 차단됩니다. 콜백이 빨리 반환되지 않으면 재생을 방해 할 수 있습니다.

응용 프로그램 요구 사항에 따라 중요하거나 중요하지 않을 수 있습니다. 그것이 중요 할 수 있다면. 처리를 위해 데이터를 다른 스레드로 전달하십시오. 데이터 처리 스레드를 차단하면 비디오의 경우 프레임 속도가 낮아집니다.

+0

대단한 답변! 정확히 내가 무엇을 찾고 있었는지. 2 일 전에이 사실을 발견했지만 실제로 일어날 일을 요약하는 가장 좋은 방법입니다. 그의 대답이 나에게 보여준 이후에 나는 현상금을 로마에 주었지만, 나는 미래에 같은 질문을 가진 사람들에게 당신의 대답을 선택했다. –

+1

로마에가는 현상금에 도움이되었고 기꺼이 동의했습니다. :-). – Ralf

2

Windows는 이전 API가 [자손]으로 대체 되었기 때문에 발생하는 비디오 및 오디오 용 API를 제공하지만 이전 API는 기존 응용 프로그램과의 호환성을 유지하기 위해 계속 작동합니다.

오디오 된 API 기능의 waveInXxx 가족, DirectSound를, DirectShow를, WASAPI

비디오 API를 : 윈도우, DirectShow에서, 미디어 재단

비디오 비디오 + 오디오 스트림 및 파일에 대한 지원/오디오 API에 대한 비디오 : Windows 용 비디오, DirectShow, Media Foundation

위에서 언급 한 모든 기능은 특정 기능, 인터페이스, 방법, 확장 성, 호환성 옵션을 제공합니다. 나는 fd, fds 및 select가 언급 된 것에는 적용되지 않는다고 생각합니다. 특정 이유로 인해 API 조합을 사용하는 것을 선호 할 수 있습니다. 예를 들어 오디오 캡처 API를 오디오 API로만 제어하는 ​​것은 WASAPI뿐입니다. 오디오 압축 및 미디어 파일 제작, 특히 비디오 사용 가능은 일반적으로 DirectShow 및 Media Foundation에서 처리합니다.

비디오 및 오디오 장치에는 파일 설명자가 없습니다. DirectShow 및 Media Foundation에서 각 캡처 장치의 인터페이스/개체를 가져온 다음 API 형식으로 지원되는 형식과 같은 장치 기능을 검색 할 수 있습니다. 그런 다음 캡처 된 데이터를 가져 오거나 캡처 구성 요소를 인코딩하거나 데이터를 표시하는 것과 같은 다른 개체에 연결할 수 있습니다. Windows에서 파일 설명자가 스토리의 일부가 아니기 때문에 질문은 기본적으로 명확하지 않습니다. 외관상으로는 당신은 이미 리눅스에서하고있는 것을 Windows에서 어떻게 구현할 것인가에 대한 리눅스와 윈도우 개발에 익숙한 사람들로부터 몇 가지 지침을 요청하고 있습니다. 그렇지만 여러분은 일반 Windows 방식으로 끝내야 할 것입니다. Windows API 문서와 샘플로 제안하고 시연하십시오.

-

다이렉트 미디어 재단 API는 전체 미디어 프로세싱 파이프 라인의 단계를 덮고있다 : 캡처, 처리, 프리젠 테이션. DirectShow에서는 서로 연결된 "필터"구성 요소 (MF는 비슷한 개념을 가짐)를 사용하여 파이프 라인을 구축 한 다음 상위 수준의 응용 프로그램이 실제 데이터를 건드리지 않고 작업을 제어합니다. 필터는 스트리밍되는 모든 데이터 청크에 대해 응용 프로그램에보고하지 않고 데이터와 교환합니다.

"원시 프레임 가져 오기"가능성을 찾기 힘들 수 있습니다.DirectShow 디자인은 미가공 프레임이 필터간에 전달되고 호출 응용 프로그램으로 보내지지 않는다고 가정합니다. 연결된 프레임에 대해 원시 프레임을 얻는 것은 쉬운 일이 아니므로 DirectShow 필터, 재고 또는 사용자 정의 측면에서 모든 미디어 데이터 처리 요구 사항을 표현해야합니다.

어떤 이유로 든 DirectShow 파이프 라인에서이 미디어 데이터 스트림을 추출하려는 사람들은 종종 샘플 그래버 필터 (OS 및 MSDN 포럼에서 수십 가지 질문)를 사용합니다. 콜백 함수를 받아들이고 스트리밍 된 모든 데이터를보고합니다. 이 필터는 원시 데이터에 액세스하여 캡처 장치에서 프레임을 추출하는 가장 쉬운 방법입니다.

DirectShow 및 Media Foundation 표준 비디오 캡처 기능은 WDM 드라이버를 통해 Windows에있는 아날로그 비디오 캡처 장치를 지원합니다. 그들에게 API는 파이프 라인 내에서 연결될 수있는 사용 가능한 구성 요소/필터를 가지고 있습니다. DirectShow는 상대적으로 쉽게 확장 할 수 있기 때문에 다른 장치를 비디오 캡처 필터의 동일한 폼 팩터에 넣을 수 있으며 SDK, 가상 카메라 등을 통해 사용할 수있는 타사 캡처 장치를 처리 할 수 ​​있습니다. DirectShow 필터에 넣으면 다른 DirectShow 호환 응용 프로그램에서 사용할 수 있습니다. 특히 실제 카메라인지 또는 소프트웨어인지 여부는 기본적으로 차이가 없습니다.

+0

답변 해 주셔서 감사합니다. Linux 프로그래머 인 나에게 Windows가 오디오/비디오 캡처와 압축 및 포맷과 같은 멀티미디어 변형을 혼합하는 것이 이상하게 보입니다. 원래는 스트림을 제공하는 캡처 라이브러리가 필요하고 MPEG 컨버터 나 ffmpeg와 같은 것을 사용할 것입니다! 아마도 Windows의 라이브러리에는 캡처 기능이 거의 없기 때문에 멀티미디어 측면에 중점을 둡니다. 다른 사람이 더 나은 해결책을 찾지 못하면 현상금이 끝나기 전에 내가 당신의 대답을 받아 들일 것입니다. –

+0

DirectShow의 작동 방식을 알아 내려고 할 때 또 하나의 질문입니다. 카메라에서 프레임을 얻는 방법은 무엇입니까? 프레임이 원시 형식이든 형식이든 상관 없습니다. 꽤 어려운 것 같습니다! –

+0

답변 본문에 조금 추가했습니다. –