Windows에서 가장 빠른 화면 캡처 방법


159

Windows 플랫폼 용 스크린 캐스팅 프로그램을 작성하고 싶지만 화면을 캡처하는 방법을 잘 모르겠습니다. 내가 아는 유일한 방법은 GDI를 사용하는 것입니다. 그러나이 문제를 해결할 다른 방법이 있는지, 그리고 있다면 거기에 가장 적은 오버 헤드가 발생하는지 궁금합니다. 속도가 우선입니다.

스크린 캐스팅 프로그램은 게임 푸티지를 녹화하기위한 것이지만 옵션이 좁아지면이 범위를 벗어나는 다른 제안이 여전히 열려 있습니다. 결국 지식은 나쁘지 않습니다.

편집 : 나는이 기사 를 보았습니다 : 화면을 캡처하는 다양한 방법 . Windows Media API 방식과 DirectX 방식을 소개했습니다. 결론에서 하드웨어 가속을 비활성화하면 캡처 응용 프로그램의 성능을 크게 향상시킬 수 있습니다. 왜 이런지 궁금합니다. 누구든지 나를 위해 누락 된 공백을 채울 수 있습니까?

편집 : Camtasia와 같은 스크린 캐스팅 프로그램은 자체 캡처 드라이버를 사용한다는 것을 읽었습니다. 누군가 어떻게 작동하는지, 왜 더 빠른지에 대해 깊이 설명해 줄 수 있습니까? 그런 식으로 구현하는 데 지침이 필요할 수도 있지만 어쨌든 기존 문서가 있다고 확신합니다.

또한 이제 FRAPS가 화면을 기록하는 방법을 알고 있습니다. 기본 그래픽 API를 후크하여 백 버퍼에서 읽습니다. 내가 이해 한 바에 따르면 비디오 RAM이 아닌 시스템 RAM에서 읽는 것이기 때문에 프론트 버퍼에서 읽는 것보다 빠릅니다. 여기서 기사를 읽을 수 있습니다 .


재생 시스템을 사용하여 화면의 내용을 그래픽으로 기록하지 않고 고려 했습니까 ?
Benjamin Lindley

2
당신은 아무것도 후크 할 필요가 없습니다. 입력 이벤트를 작성하여 게임을 직접 제어하지 않고 다른 함수를 호출하기 만하면됩니다. 예를 들어 플레이어가 왼쪽 키를 누르면 단순히 플레이어의 x 위치를 낮추지 않습니다. 대신, 당신은 같은 함수를 호출합니다 MovePlayerLeft(). 또한 키 누름 및 기타 입력 시간과 지속 시간을 기록합니다. 그런 다음 재생 모드에있을 때는 입력을 무시하고 대신 기록 된 데이터를 읽습니다. 데이터에서 왼쪽 키를 누르면을 호출 MovePlayerLeft()합니다.
Benjamin Lindley

1
@PigBen 게임 푸티지를 녹화하기위한 일반적인 응용 프로그램입니다. 특정 게임용이 아닙니다. 왼쪽 키를 누르면 누군가 오른쪽으로 움직일 수 있습니다. 또한 사용자의 영향을받지 않는 이벤트는 고려하지 않았습니다. '그리고 렌더링은 어떻습니까?
someguy

1
@someguy Ok 나는 당신이 훨씬 더 강렬한 일을하고 있다고 생각합니다. 위의 방법을 사용하여 게임에서 재생 AVI를 약 30fps로 절약하는 루틴을 추가했습니다. "인력 최적화"를 위해 Windows API를 사용하여 다중 모니터 화면 레코더를 만들었지 만 대상 4fps에서도 제대로 수행되지 않았습니다.
AJG85

1
여기 UltraVNC에의 저장소 사이트의 창을위한 오픈 소스 미러 드라이버가 ultravnc.svn.sourceforge.net/viewvc/ultravnc/...
올린

답변:


62

이것이 단일 프레임을 수집하는 데 사용하는 것이지만, 이것을 수정하고 두 대상을 항상 열어두면 파일 이름에 대한 정적 카운터를 사용하여 디스크에 "스트리밍"할 수 있습니다. -어디서 찾았는지 기억이 나지 않지만 누구에게나 수정되었습니다!

void dump_buffer()
{
   IDirect3DSurface9* pRenderTarget=NULL;
   IDirect3DSurface9* pDestTarget=NULL;
     const char file[] = "Pickture.bmp";
   // sanity checks.
   if (Device == NULL)
      return;

   // get the render target surface.
   HRESULT hr = Device->GetRenderTarget(0, &pRenderTarget);
   // get the current adapter display mode.
   //hr = pDirect3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddisplaymode);

   // create a destination surface.
   hr = Device->CreateOffscreenPlainSurface(DisplayMde.Width,
                         DisplayMde.Height,
                         DisplayMde.Format,
                         D3DPOOL_SYSTEMMEM,
                         &pDestTarget,
                         NULL);
   //copy the render target to the destination surface.
   hr = Device->GetRenderTargetData(pRenderTarget, pDestTarget);
   //save its contents to a bitmap file.
   hr = D3DXSaveSurfaceToFile(file,
                              D3DXIFF_BMP,
                              pDestTarget,
                              NULL,
                              NULL);

   // clean up.
   pRenderTarget->Release();
   pDestTarget->Release();
}

감사. 나는이 방법에 대해 얼마 전에 프론트 버퍼에서 읽는 것보다 빠르다고 들었습니다. 정직하게 그렇게하고 제대로 작동합니까?
someguy 2019

프론트 버퍼의 문제점은 액세스 중 하나입니다. 즉, 현재 렌더링중인 플레인을 복사하려고하면 복사가 중단됩니다. 그것은 나를 위해 충분히 잘 작동하고 내 하드 드라이브를 먹는다!
Brandrew

@ bobobobo 정확히 어떻게 작동하는지 모르겠지만 Huffyuv와 같은 것을 사용하려고 생각했습니다. 편집 : 또는 사용자가 사용 가능한 직접 표시 필터 중에서 선택할 수있게합니다.
someguy

1
DirectX는 GetRenderTargetData 부분에 잘못된 호출을 뱉습니다. 분명히 장치를 만드는 방식은 매우 중요합니다.
LightStriker

12
downvote, 그것은 당신의 자신의 응용 프로그램에 대해서만 작동하므로 일반 프로그램을 기록하는 데 사용할 수 없습니다
user3125280

32

편집 : 이것이 첫 번째 편집 링크 아래에 "GDI 방식"으로 표시되어 있음을 알 수 있습니다. 이것은 여전히 ​​해당 사이트의 성능 조언을 사용하는 적절한 방법이므로 30fps에 쉽게 도달 할 수 있습니다.

에서 주석 (난, 난 그냥 않는 사람을 참조하고있어 이런 일을 경험이 없음) :

HDC hdc = GetDC(NULL); // get the desktop device context
HDC hDest = CreateCompatibleDC(hdc); // create a device context to use yourself

// get the height and width of the screen
int height = GetSystemMetrics(SM_CYVIRTUALSCREEN);
int width = GetSystemMetrics(SM_CXVIRTUALSCREEN);

// create a bitmap
HBITMAP hbDesktop = CreateCompatibleBitmap( hdc, width, height);

// use the previously created device context with the bitmap
SelectObject(hDest, hbDesktop);

// copy from the desktop device context to the bitmap device context
// call this once per 'frame'
BitBlt(hDest, 0,0, width, height, hdc, 0, 0, SRCCOPY);

// after the recording is done, release the desktop context you got..
ReleaseDC(NULL, hdc);

// ..delete the bitmap you were using to capture frames..
DeleteObject(hbDesktop);

// ..and delete the context you created
DeleteDC(hDest);

나는 이것이 가장 빠르다고 말하지는 않지만 BitBlt호환되는 장치 컨텍스트간에 복사하는 경우 일반적으로 작업이 매우 빠릅니다.

참고로, 열기 브로드 소프트웨어 자신의 일환으로이 같은 구현 뭔가 "dc_capture" 오히려 대상 컨텍스트를 만들지 않고 있지만, 방법, hDest사용 CreateCompatibleDC그들이을 사용하여 IDXGISurface1다이렉트 X 10 +와 함께 작동합니다. 이에 대한 지원이없는 경우로 넘어갑니다 CreateCompatibleDC.

특정 응용 프로그램을 사용하도록 변경하려면 첫 번째 줄을 게임 창의 핸들 GetDC(game)위치 로 변경 game한 다음 오른쪽 heightwidth .

hDest / hbDesktop에 픽셀이 있으면 여전히 파일로 저장해야하지만 화면 캡처를 수행하는 경우 특정 수의 픽셀을 메모리에 버퍼링하고 비디오 파일에 저장하려고한다고 생각합니다. 정적 이미지를 디스크에 저장하기위한 코드를 가리 키지 않습니다.


3
msdn.microsoft.com/ko-kr/library/dd183370%28VS.85%29.aspx 발췌 : 원본 및 대상 장치 컨텍스트의 색 형식이 일치하지 않으면 BitBlt 함수는 원본 색 형식을 대상과 일치하도록 변환합니다 체재.

2
이를 입증 할 증거가있다. 어딘가에 성능 비교를 게시했거나 정확한 것을 비교 했습니까?

2
프로파일 링을 시도하십시오. 내가 게시물에서 말했듯이, 나는 GDI에 경험이있는 사람을 언급하고 있습니다. 메모리가 누출되고이를 해결하는 방법을 알고있는 경우 게시물을 편집하여 누출을 제거하십시오.

1
이 방법으로 약 5fps를 얻었습니다. 이것은 그래픽이 통합 된 랩톱에 있었으므로 실제 그래픽 카드가있는 데스크탑에서 더 나을 것으로 기대하지만 여전히 느립니다.
Timmmm

1
@Timmmm OBS가 이것을 구현하는 방법에 대한 참조를 추가했습니다. 잘만되면 그것은 당신에게 약간의 속도를 줄 수 있습니다.

19

DirectX 응용 프로그램 용 FRAPS와 유사한 비디오 캡처 소프트웨어를 작성했습니다. 소스 코드를 사용할 수 있으며이 기사에서는 일반적인 기술에 대해 설명합니다. 보다http://blog.nektra.com/main/2013/07/23/instrumenting-direct3d-applications-to-capture-video-and-calculate-frames-per-second/를

실적과 관련된 질문에

  • DirectX는 프론트 버퍼에서 읽을 때를 제외하고 GDI보다 빠릅니다. 내 접근 방식은 FRAPS와 비슷합니다 (backbuffer에서 읽음). Direct3D 인터페이스에서 일련의 메소드를 가로 챕니다.

  • 응용 프로그램에 미치는 영향을 최소화하면서 실시간으로 비디오를 녹화하려면 빠른 코덱이 필요합니다. FRAPS는 자체 무손실 비디오 코덱을 사용합니다. Lagarith와 HUFFYUV는 실시간 애플리케이션을 위해 설계된 일반적인 무손실 비디오 코덱입니다. 비디오 파일을 출력하려면 해당 파일을 살펴보십시오.

  • 스크린 캐스트를 기록하는 또 다른 방법은 미러 드라이버를 작성하는 것입니다. Wikipedia에 따르면 : 비디오 미러링이 활성화되면 시스템이 미러링 된 영역 내부의 위치에서 기본 비디오 장치로 끌 때마다 미러링 된 비디오 장치에서 그리기 작업의 사본이 실시간으로 실행됩니다. MSDN의 미러 드라이버 ( http://msdn.microsoft.com/en-us/library/windows/hardware/ff568315(v=vs.85).aspx)를 참조 하십시오 .


16

d3d9를 사용하여 백 버퍼를 가져 와서 d3dx 라이브러리를 사용하여 png 파일로 저장합니다.

    IDirect3DSurface9 * surface;

    // GetBackBuffer
    idirect3ddevice9-> GetBackBuffer (0, 0, D3DBACKBUFFER_TYPE_MONO, & surface);

    // 표면을 저장
    D3DXSaveSurfaceToFileA ( "filename.png", D3DXIFF_PNG, surface, NULL, NULL);

    SAFE_RELEASE (표면);

이렇게하려면 다음과 같이 swapbuffer를 만들어야합니다.

d3dpps.SwapEffect = D3DSWAPEFFECT_COPY ; // for screenshots.

(스크린 샷을 찍기 전에 백 버퍼가 엉망이되지 않도록 보장합니다).


말이 되네요 이것과의 차이점이 무엇인지 아십니까 GetRenderTarget?
someguy

그것은 현재 렌더 타겟을 얻습니다.
bobobobo

13

필자의 인상에서 GDI 접근 방식과 DX 접근 방식은 본질적으로 다릅니다. GDI를 사용하여 페인팅하면 FLUSH 방법이 적용되고 FLUSH 방식은 프레임을 그린 다음 지우고 동일한 버퍼에서 다른 프레임을 다시 그립니다. 이로 인해 게임에서 깜박임으로 높은 프레임 속도가 필요합니다.

  1. DX가 더 빠른 이유는 무엇입니까? DX (또는 그래픽 세계)에서는 이중 버퍼 렌더링이라는보다 성숙한 방법이 적용됩니다. 두 개의 버퍼가 존재하는 경우 전면 버퍼를 하드웨어에 제공 할 때 다른 버퍼로 렌더링 한 다음 프레임 1이 끝난 후 렌더링이 완료되면 시스템은 다른 버퍼로 스왑 (하드웨어에 표시하기 위해 잠금 및 이전 버퍼 릴리스)하여 렌더링 비 효율성이 크게 향상됩니다.
  2. 하드웨어 가속을 더 빨리 끄는 이유는 무엇입니까? 이중 버퍼 렌더링을 사용하면 FPS가 향상되지만 렌더링 시간은 여전히 ​​제한적입니다. 최신 그래픽 하드웨어는 일반적으로 앤티 앨리어싱과 같이 일반적으로 렌더링하는 동안 많은 최적화가 필요합니다. 고품질 그래픽이 필요하지 않은 경우이 옵션을 비활성화 할 수 있습니다. 그러면 시간이 절약됩니다.

정말로 필요한 것은 사람들이 논의한 것에 완전히 동의하는 재생 시스템이라고 생각합니다.


1
재생 시스템을 사용할 수없는 이유에 대한 설명을 참조하십시오. 스크린 캐스팅 프로그램은 특정 게임을위한 것이 아닙니다.
someguy

10

화면 캡처를위한 GDI 방법을 구현 한 클래스를 작성했습니다. GetFrontBuffer를 통해 DirectX 메서드를 찾은 후 더 빠른 속도를 기대하면서 추가 속도를 원했습니다.

GDI 성능이 약 2.5 배 더 빠르다는 사실에 놀랐습니다. 듀얼 모니터 디스플레이를 100 번 시험 한 후 GDI 구현은 화면 캡처 당 평균 0.65 초, DirectX 방법은 평균 1.72 초였습니다. 내 테스트에 따르면 GDI는 GetFrontBuffer보다 확실히 빠릅니다.

GetRenderTargetData를 통해 Brandrew의 코드가 DirectX를 테스트하도록 작동하지 못했습니다. 화면 사본이 순전히 검은 색으로 나왔습니다. 그러나 빈 화면을 매우 빠르게 복사 할 수 있습니다! 나는 그것을 계속 고민하고 실제 결과를 볼 수있는 작동 버전을 얻을 수 있기를 바랍니다.


정보 주셔서 감사합니다. Brandrew의 코드를 테스트하지는 않았지만 GetRenderTargetData접근 방식이 효과적 이라는 것을 알고 있습니다. 신청을 마치면 답을 쓸 수 있습니다. 또는 모든 것이 작동하면 업데이트 할 수 있습니다.
someguy 2016 년

화면 캡처 당 0.65 ?! 좋은 GDI 구현 (장치 주변 유지 등)은 현대 컴퓨터에서 1920x1200에서 30fps를 쉽게 수행해야합니다.
Christopher Oezbek

나는 GDI 렌더링 이미지 품질이 DX보다 확실히 가난한 가정
zinking

SlimDX를 사용하여 C # 에서이 테스트를 수행했으며 놀랍게도 동일한 결과를 찾았습니다. 아마도 이것은 SlimDX를 사용하여 한 번만 만들지 않고 되감기 고 동일한 위치를 덮어 쓰는 대신 매 프레임 업데이트마다 새로운 스트림과 새 비트 맵을 만들어야한다는 사실과 관련이있을 수 있습니다.
Cesar

간단히 말하면, 실제로 "동일한 결과"는 GDI가 더 빠르다는 것을 의미했습니다. @Christopher가 언급했듯이 30fps +는 매우 수행 가능하며 여전히 여분의 CPU를 많이 남겨 두었습니다.
Cesar

8

내가 얻을 수 있었던 몇 가지 : OSS 드라이버를 모르지만 분명히 "미러 드라이버"를 사용하는 것이 빠릅니다.

RDP가 다른 원격 제어 소프트웨어에 비해 왜 빠릅니까?

또한 StretchRect의 일부 회선을 사용하는 것이 BitBlt보다 빠릅니다.

http://betterlogic.com/roger/2010/07/fast-screen-capture/comment-page-1/#comment-5193

그리고 당신이 언급 한 것 (D3D dll에 연결된 후크)은 아마도 D3D 응용 프로그램의 유일한 방법이지만 Windows XP 데스크톱 캡처에서는 작동하지 않을 것입니다. 이제 일반 데스크톱 창에서 속도가 비슷한 플랩이 있었으면 좋겠습니다.

에어로에서는 플랩 같은 고리를 사용할 수 있지만 XP 사용자는 운이 좋지 않을 것이라고 생각합니다.

또한 화면 비트 깊이를 변경하거나 하드웨어 가속을 비활성화합니다. 도움이 될 수 있습니다 (및 / 또는 에어로 비활성화).

https://github.com/rdp/screen-capture-recorder-program 에는 합리적으로 빠른 BitBlt 기반 캡처 유틸리티와 설치의 일부로 벤치마킹 기가 포함되어있어 BitBlt 속도를 벤치마킹하여 최적화 할 수 있습니다.

또한 VirtualDub에는 "opengl"화면 캡처 모듈이있어 속도가 빠르고 변경 감지와 같은 작업을 수행합니다. http://www.virtualdub.org/blog/pivot/entry.php?id=290


"스크린 캡처 레코더"를 사용하거나 BitBlt를 사용하는 것이 더 빠를까요? 프로젝트에 최적화가 있습니까?
blez

Bitblt를 직접 사용하는 경우 여분의 memcpy를 피할 수 있습니다 (memcpy는 시간이 더 걸리더라도 일반적으로 가장 큰 병목 현상은 아닙니다) )
rogerdpack

8

C ++의 경우 다음을 사용할 수 있습니다. http://www.pinvoke.net/default.aspx/gdi32/BitBlt.html
일부 유형의 3D 응용 프로그램 / 비디오 응용 프로그램에서는 작동하지 않을 수 있습니다. 그러면 이 링크 는 사용할 수있는 3 가지 방법을 설명하므로 더 유용 할 수 있습니다.

이전 답변 (C #) : System.Drawing.Graphics.Copy
사용할 수 있지만 그리 빠르지는 않습니다.

내가 이것을 정확히 쓴 샘플 프로젝트 : http://blog.tedd.no/index.php/2010/08/16/c-image-analysis-auto-gaming-with-source/

Direct3D와 같은 더 빠른 방법을 사용하여이 샘플을 업데이트 할 계획입니다. http://spazzarama.com/2009/02/07/screencapture-with-direct3d/

다음은 비디오 캡처를위한 링크입니다. C # .Net을 사용하여 화면을 비디오로 캡처하는 방법은 무엇입니까?


2
아, 나는 C (아마도 C ++)로 프로그래밍 중이며 .NET을 사용할 계획이 없다고 언급하지 않았습니다. 정말 죄송 해요 :/.
someguy

이미 BitBlt (GDI)를 알고있었습니다. 그래도 Direct3D를 살펴 보겠습니다. 감사!
someguy

몇 주 전에이 문제를 조사했지만 아직 구현하지 못했습니다. Direct3D는 !! 길입니다! GDI +를 사용하는 C # 내장 방법보다 빠릅니다.
Tedd Hansen 2012

원본 게시물을 업데이트했습니다. 링크에 따르면, GetFrontBufferData ()를 호출 할 때 DirectX가 느려집니다. 게임 영상을 녹화 할 때 고려해야 할 사항이 있습니까? 저에게 상황을 설명해 주시겠습니까?
someguy

1
GDI는 느리기 때문에 문제 영역에 적합하지 않습니다. DirectX 또는 OpenGL이 유일한 권장 사항입니다.

6

Windows 8에서 Microsoft는 Windows 데스크톱 복제 API를 도입했습니다. 그것이 공식적으로 권장되는 방법입니다. 스크린 캐스팅에 유용한 기능 중 하나는 윈도우 이동을 감지하여 원시 픽셀 대신 윈도우가 움직일 때 블록 델타를 전송할 수 있다는 것입니다. 또한 한 프레임에서 다음 프레임으로 어떤 사각형이 변경되었는지 알려줍니다.

Microsoft 예제 코드는 매우 복잡하지만 API는 실제로 간단하고 사용하기 쉽습니다. 공식 예제보다 훨씬 간단한 예제 프로젝트를 만들었습니다.

https://github.com/bmharper/WindowsDesktopDuplicationSample

문서 : https://docs.microsoft.com/en-gb/windows/desktop/direct3ddxgi/desktop-dup-api

Microsoft 공식 예제 코드 : https://code.msdn.microsoft.com/windowsdesktop/Desktop-Duplication-Sample-da4c696a


Github 프로젝트는 웹 비디오 및 Resident Evil 7로 테스트 한 Windows 10에서 완벽하게 작동합니다. 가장 좋은 점은 그래픽 업그레이드 속도의 CPU로드 스케일입니다.
jw_

GPU-Z를 시작하자마자이 프로그램은 화면 캡처를 중지합니다.
마리노 시미치

5

강력한 화면 캡처 도구 인 C ++ 오픈 소스 프로젝트 WinRobot @git을 사용해 볼 수 있습니다.

CComPtr<IWinRobotService> pService;
hr = pService.CoCreateInstance(__uuidof(ServiceHost) );

//get active console session
CComPtr<IUnknown> pUnk;
hr = pService->GetActiveConsoleSession(&pUnk);
CComQIPtr<IWinRobotSession> pSession = pUnk;

// capture screen
pUnk = 0;
hr = pSession->CreateScreenCapture(0,0,1280,800,&pUnk);

// get screen image data(with file mapping)
CComQIPtr<IScreenBufferStream> pBuffer = pUnk;

지원하다 :

  • UAC 창
  • 윈로 건
  • DirectShowOverlay

1
저것은 ... 많은 저수준 고리입니다. 관리자 권한이 있으면 캡처 속도가 놀랍습니다.
toster-cx

winrobot이 매우 강력하고 매끄럽다는 것을 알았습니다.
ashishgupta_mca

WinRobot 코드를 연구했지만 혁신적인 wrt 화면 캡처는 없었습니다. 동일한 CreateCompatibleDC..BitBlt를 사용하고 있습니다. 이것이 서비스 컨텍스트에서 수행 될 때 어떤 마법이 없다면?
shekh

@ shekh : 당신의 연구는 너무 피상적이었습니다. 이 코드는 IDirectDrawSurface7-> BltFast ()를 사용하여 화면을 화면 그리기 화면에서 복사 DD 화면으로 복사 한 다음 Filemapping을 사용하여 이미지를 복사합니다. 데스크톱에 쉽게 액세스 할 수없는 서비스에서 코드가 실행되기 때문에 매우 복잡합니다.
Elmue

2

나 자신도 directx로 그것을하고 그것이 원하는 것만 큼 빠르다고 생각합니다. 나는 빠른 코드 샘플이없는,하지만 난 발견 유용해야하는가. directx11 버전은 많이 다르지 않을 것입니다. directx9는 조금 더 많을 것입니다.


2

다음 제안 사항이 귀하의 질문에 대한 답변이 아니라는 것을 알고 있지만 빠르게 변화하는 DirectX보기를 캡처하는 가장 간단한 방법은 비디오 카메라 를 비디오 카드의 S- 비디오 포트에 연결하고 이미지를 다음과 같이 기록하는 것입니다. 영화. 그런 다음 비디오를 카메라에서 컴퓨터의 MPG, WMV, AVI 등 파일로 다시 전송하십시오.


2

VLC API를 사용하여 C # 에서 화면 녹화를 수행 할 수 있습니다 . 이것을 보여주기 위해 샘플 프로그램을 만들었습니다. 그것은 사용 LibVLCSharpVideoLAN.LibVLC.Windows 라이브러리를. 이 크로스 플랫폼 API를 사용하여 비디오 렌더링과 관련된 더 많은 기능을 얻을 수 있습니다.

API 설명서는 LibVLCSharp API Github를 참조하십시오.

using System;
using System.IO;
using System.Reflection;
using System.Threading;
using LibVLCSharp.Shared;

namespace ScreenRecorderNetApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Core.Initialize();

            using (var libVlc = new LibVLC())
            using (var mediaPlayer = new MediaPlayer(libVlc))
            {
                var media = new Media(libVlc, "screen://", FromType.FromLocation);
                media.AddOption(":screen-fps=24");
                media.AddOption(":sout=#transcode{vcodec=h264,vb=0,scale=0,acodec=mp4a,ab=128,channels=2,samplerate=44100}:file{dst=testvlc.mp4}");
                media.AddOption(":sout-keep");

                mediaPlayer.Play(media);
                Thread.Sleep(10*1000);
                mediaPlayer.Stop();
            }
        }
    }
}

1
우려 대상 : libvlc은 GPL로 배포됩니다. GPL 하에서 코드를 공개하지 않으려면 libvlc를 사용하지 마십시오.
Sebastian Cabot

정확하지는 않습니다. LibVLC는 LGPL입니다. 2011 년에 재 라이센스되었습니다. VLC 응용 프로그램 자체는 GPL로 남아 있습니다. videolan.org/press/lgpl-libvlc.html
Andrew

0

DXGI 데스크탑 캡처

DXGI 복제로 데스크탑 이미지를 캡처하는 프로젝트. 캡처 한 이미지를 다른 이미지 형식 (* .bmp; * .jpg; * .tif)으로 파일에 저장합니다.

이 샘플은 C ++로 작성되었습니다. DirectX (D3D11, D2D1)에 대한 경험이 필요합니다.

응용 프로그램이 수행 할 수있는 작업

  • 하나 이상의 데스크탑 모니터가있는 경우 선택할 수 있습니다.
  • 캡처 한 데스크탑 이미지의 크기를 조정하십시오.
  • 다른 스케일링 모드를 선택하십시오.
  • 출력 이미지에서 마우스 아이콘을 표시하거나 숨길 수 있습니다.
  • 출력 사진의 이미지를 회전하거나 기본값으로 그대로 둘 수 있습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.