Windows'da en hızlı ekran yakalama yöntemi


159

Windows platformu için bir screencasting programı yazmak istiyorum, ancak ekranın nasıl yakalanacağından emin değilim. Fark ettiğim tek yöntem GDI kullanmaktır, ancak bununla ilgili başka yollar olup olmadığını merak ediyorum ve eğer varsa, hangisi en az ek yüke neden oluyor? Hız bir önceliktir.

Screencasting programı oyun görüntülerini kaydetmek için olacak, ancak bu seçenekleri daraltırsa, bu kapsamın dışında kalan diğer önerilere hala açıkım. Sonuçta bilgi fena değil.

Düzenleme : Bu makaleye rastladım: Ekran yakalamak için çeşitli yöntemler . Beni Windows Media API ile ve DirectX ile tanıştırdı. Sonuçta donanım hızlandırmasının devre dışı bırakılmasının yakalama uygulamasının performansını önemli ölçüde artırabileceğinden bahsedilmektedir. Bunun neden olduğunu merak ediyorum. Biri benim için eksik boşlukları doldurabilir mi?

Edit : Camtasia gibi screencasting programları kendi yakalama sürücüsü kullandığını okudum. Birisi bana nasıl çalıştığı ve neden daha hızlı olduğu hakkında derinlemesine bir açıklama verebilir mi? Bunun gibi bir şeyin uygulanması konusunda da rehberliğe ihtiyacım olabilir, ancak eminim ki mevcut belgeler zaten var.

Ayrıca, şimdi FRAPS'ın ekranı nasıl kaydettiğini biliyorum. Arka arabellekten okumak için alttaki grafik API'sini kancalar. Anladığım kadarıyla, bu ön tampondan okumaktan daha hızlıdır, çünkü video RAM'den ziyade sistem RAM'inden okuyorsunuz. Makaleyi buradan okuyabilirsiniz .


Bir yeniden oynatma sistemi kullanarak ekranın içeriğini grafik olarak kaydetmek yerine düşündünüz mü ?
Benjamin Lindley

2
Hiçbir şey takmanıza gerek yok. Giriş etkinliklerinizi yazmanız yeterlidir, böylece oyunu doğrudan kontrol etmezler, bunun yerine diğer işlevleri çağırırlar. Örneğin, oyuncu sol tuşa basarsa, sadece oyuncuların x konumunu azaltmazsınız. Bunun yerine, gibi bir işlevi çağırırsınız MovePlayerLeft(). Ayrıca tuş basışlarının ve diğer girişlerin zaman ve süresini de kaydedersiniz. Ardından, oynatma modundayken, girişi görmezden gelir ve bunun yerine kaydedilen verileri okursunuz. Verilerde, sol tuşa basmayı görürseniz, ararsınız MovePlayerLeft().
Benjamin Lindley

1
@PigBen Bu, oyun görüntülerini kaydetmek için genel bir uygulama olacaktır. Belirli bir oyun için değil. Sol tuşa basan biri sağa taşınmak anlamına gelebilir, bildiğim kadarıyla. Ayrıca, kullanıcının etkilemediği etkinlikleri dikkate almadınız. Peki ya renderleme?
someguy

1
@someguy Tamam Sanırım çok daha yoğun bir şey yapıyorsun, yukarıdaki yöntemleri kullanarak bir rutin ekledim, bir oyunda yaklaşık 30 fps'de bir aksama olmadan tekrar AVI'leri kurtarmak için. "İş gücü optimizasyonu" için Windows API kullanarak çoklu monitör ekran kaydedici yaptım ama bu hedeflenen 4 fps'de bile kötü performans gösterdi.
AJG85

1
UltraVNC'nin depo sitesinde pencereler için açık kaynaklı bir ayna sürücüsü var ultravnc.svn.sourceforge.net/viewvc/ultravnc/…
Beached

Yanıtlar:


62

Tek kare toplamak için kullandığım budur, ancak bunu değiştirirseniz ve iki hedefi her zaman açık tutarsanız, dosya adı için statik bir sayaç kullanarak diske "akış" yapabilirsiniz. - Bunu nerede bulduğumu hatırlayamıyorum, ama kim olursa olsun değiştirildi!

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();
}

Teşekkürler. Bir süre önce ön tampondan okumaktan daha hızlı olduğu söylenen bu yöntemi duydum. Dürüst olmak gerekirse bu şekilde mi yapıyorsunuz ve düzgün çalışıyor mu?
someguy

Ön arabellek sorunu erişim, yani, şu anda kopyalanan "kesintiye" işlenen bir düz kopyalamaya çalışıyor. Benim için yeterince iyi çalışıyor ve sabit diskimi yiyor!
Brandrew

@bobobobo Tam olarak nasıl çalışacağını bilmiyorum, ama Huffyuv gibi bir şey kullanmayı düşünüyordum. Düzenleme: Veya kullanıcının mevcut dirsek gösterisi filtreleri arasından seçim yapmasına izin verin.
someguy

1
Ben sadece bu işi yapmak başaramıyorum ... DirectX GetRenderTargetData bölümünde bazı geçersiz çağrı tükürüyor. Açıkçası, cihazınızı oluşturma şekliniz çok önemlidir.
LightStriker

12
downvote, sadece kendi uygulamanız için çalışır, bu yüzden genel programları kaydetmek için kullanılamaz
user3125280

32

EDIT: Bunun ilk düzenleme bağlantınızın altında "GDI yolu" olarak listelendiğini görebiliyorum. Bu hala o sitedeki performans danışma ile gitmek için iyi bir yoldur, sanırım 30 fps kolayca alabilirsiniz.

Gönderen bu yorumun (ben, ben sadece birisi yapan başvuran ediyorum bunu hiçbir deneyimi var):

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);

Bunun en hızlı olduğunu söylemiyorum, ancak BitBltuyumlu cihaz bağlamları arasında kopyalama yapıyorsanız işlem genellikle çok hızlıdır.

Referans olarak, Open Broadcaster Software , DirectX 10+ ile çalışan bir anıhDest kullanarak hedef bağlamı oluşturmak yerine, "dc_capture" yönteminin bir parçası olarak böyle bir şey uygular . Bunun için destek yoksa, geri çekilirler .CreateCompatibleDCIDXGISurface1CreateCompatibleDC

Belirli bir uygulamayı kullanmak üzere değiştirmek için, ilk satırı oyun penceresinin tutamacının GetDC(game)olduğu yere değiştirmeniz gameve ardından sağ heightvewidth oyun penceresinin de ayarlamanız gerekir.

HDest / hbDesktop'taki piksellere sahip olduğunuzda, yine de bir dosyaya kaydetmeniz gerekir, ancak ekran yakalama yapıyorsanız, belirli bir sayıyı belleğe arabelleğe almak ve video dosyasına kaydetmek istediğinizi düşünürüm parçalar halinde, bu yüzden statik bir görüntüyü diske kaydetmek için kod işaret etmeyeceğim.


3
msdn.microsoft.com/en-us/library/dd183370%28VS.85%29.aspx Alıntı: Kaynak ve hedef cihaz bağlamlarının renk formatları eşleşmiyorsa, BitBlt işlevi kaynak renk formatını hedefe uyacak şekilde dönüştürür biçim.

2
Bunu kanıtlamak için bazı kanıtlar iyi olur. Bir yerde bir performans karşılaştırması yayınladınız veya doğru bir karşılaştırma gördünüz mü?

2
Profil oluşturmayı deneyin. Mesajda söylediğim gibi, GDI deneyimi olan birine atıfta bulunuyorum. Bellek sızdırıyorsa ve nasıl düzeltileceğini biliyorsanız, sızıntıyı gidermek için direği düzenleyin.

1
Bu yöntemle yaklaşık 5 fps aldım. Bu, entegre grafikli bir dizüstü bilgisayardaydı, bu yüzden gerçek bir grafik kartı olan bir masaüstünden daha iyi beklerdim, ama yine de çok yavaş.
Timmmm

1
@ Timmmm OBS'nin bunu uygulama şekline bir başvuru ekledim. Umarım bu sizin için işleri biraz hızlandırabilir.

19

DirectX uygulamaları için FRAPS'a benzer bir video yakalama yazılımı yazdım. Kaynak kodu mevcuttur ve makalem genel tekniği açıklar. Http://blog.nektra.com/main/2013/07/23/instrumenting-direct3d-applications-to-capture-video-and-calculate-frames-per-second/ adresine bakın.

Performansla ilgili sorularınıza saygı duymak,

  • Çok yavaş olan ön tampondan okurken DirectX, GDI'dan daha hızlı olmalıdır. Benim yaklaşımım FRAPS'a (backbuffer'dan okuma) benzer. Direct3D arabirimlerinden bir dizi yöntemi keserim.

  • Gerçek zamanlı video kaydı için (minimum uygulama etkisi ile) hızlı bir kodek gereklidir. FRAPS kendi kayıpsız video codec bileşenini kullanır. Lagarith ve HUFFYUV, gerçek zamanlı uygulamalar için tasarlanmış genel kayıpsız video kodekleridir. Video dosyaları çıktısı almak istiyorsanız bunlara bakmalısınız.

  • Ekran kayıtlarını kaydetmenin başka bir yaklaşımı bir Ayna Sürücüsü yazmak olabilir. Wikipedia'ya göre: Video yansıtma etkin olduğunda, sistem yansıtılmış alanın içindeki bir konumda birincil video aygıtına her çekişte, çizim işleminin bir kopyası yansıtılmış video aygıtında gerçek zamanlı olarak yürütülür. MSDN'deki ayna sürücülerine bakın: http://msdn.microsoft.com/en-us/library/windows/hardware/ff568315(v=vs.85).aspx .


16

Backbuffer'ı almak için d3d9 kullanıyorum ve bunu d3dx kütüphanesini kullanarak bir png dosyasına kaydediyorum:

    IDirect3DSurface9 * yüzey;

    //  GetBackBuffer
    idirect3ddevice9-> GetBackBuffer (0, 0, D3DBACKBUFFER_TYPE_MONO ve yüzey);

    // yüzeyi koru
    D3DXSaveSurfaceToFileA ("dosyaadı.png", D3DXIFF_PNG, yüzey, NULL, NULL);

    SAFE_RELEASE (yüzey);

Bunu yapmak için swapbuffer'ınızı

d3dpps.SwapEffect = D3DSWAPEFFECT_COPY ; // for screenshots.

(Dolayısıyla, ekran görüntüsünü almadan önce backbuffer'ın karışık olmadığını garanti edersiniz).


Mantıklı, teşekkürler. Bunun ve arasındaki farkın ne olduğunu biliyor musunuz GetRenderTarget?
someguy

Bu sadece geçerli oluşturma hedefini alır (arama yaptığınız anda bir kişi dokuya işliyorsa başka bir ekran dışı yüzey olabilir).
bobobobo

13

Benim izlenimimde, GDI yaklaşımı ve DX yaklaşımı doğası gereği farklıdır. GDI kullanarak boyama FLUSH yöntemini uygular, FLUSH yaklaşımı çerçeveyi çizer ve daha sonra temizler ve aynı tamponda başka bir çerçeveyi yeniden çizer, bu da oyunlarda titremenin yüksek kare hızı gerektirmesine neden olur.

  1. NEDEN DX daha hızlı? DX'de (veya grafik dünyasında), iki tamponun bulunduğu, iki tamponun bulunduğu daha olgun bir yöntem uygulanır, ön tamponu donanıma sunduğunuzda, diğer tampona da, ardından çerçeve 1 render işlemi tamamlandığında, sistem diğer tampona takas edilir (donanıma sunulması için kilitlenir ve önceki tamponu serbest bırakır), bu şekilde render verimsizliği büyük ölçüde geliştirilir.
  2. NEDEN Donanım Hızlandırmasını Daha Hızlı Kapatıyorsunuz? çift ​​arabellek oluşturmada, FPS geliştirilir, ancak oluşturma süresi hala sınırlıdır. modern grafik donanımı, genellikle kenar yumuşatma gibi renderleme sırasında çok fazla optimizasyon gerektirir, bu yüksek hesaplama grafiklerine gerek duymazsanız, elbette bu seçeneği devre dışı bırakabilirsiniz. ve bu size biraz zaman kazandıracak.

Bence gerçekten ihtiyacınız olan şey, insanların tartıştıklarına tamamen katıldığım bir tekrarlama sistemi.


1
Yeniden oynatma sisteminin neden mümkün olmadığı konusundaki tartışmaya bakın. Screencasting programı herhangi bir oyun için değil.
someguy

10

Ekran yakalama için GDI yöntemini uygulayan bir sınıf yazdım. Ben de ekstra hız istedim, bu yüzden DirectX yöntemini keşfettikten sonra (GetFrontBuffer aracılığıyla) daha hızlı olmasını bekledim.

GDI'nın yaklaşık 2,5 kat daha hızlı performans gösterdiğini fark ettim. İkili monitör ekranımı yakalayan 100 denemeden sonra, GDI uygulaması ekran yakalama başına ortalama 0,65 saniye, DirectX yöntemi ise ortalama 1,72 saniye oldu. Testlerime göre GDI, GetFrontBuffer'dan kesinlikle daha hızlı.

Getrewender'ın GetRenderTargetData üzerinden test etmek için Brandrew kodunu çalıştıramadım. Ekran kopyası tamamen siyah çıktı. Ancak, bu boş ekranı süper hızlı kopyalayabilir! Bununla uğraşmaya devam edeceğim ve gerçek sonuçları görmek için çalışan bir sürüm almayı umuyorum.


Bilgi için teşekkürler. Brandrew'un kodunu test etmedim, ama GetRenderTargetDatayaklaşımın işe yaradığını biliyorum . Belki başvurumu bitirdiğimde kendi cevabımı yazarım. Veya, her şeyi çalıştıktan sonra kendinizinkini güncelleyebilirsiniz.
someguy

Ekran başına 0.65 ?! İyi bir GDI uygulaması (cihazları tutmak, vb.) 1920x1200'de 30fps'yi modern bir bilgisayarda kolayca yapmalıdır.
Christopher Oezbek

GDI tarafından oluşturulan görüntü kalitesinin
DX'den

Bu testi SlimDX ile C # 'da gerçekleştirdim ve şaşırtıcı bir şekilde aynı sonuçları buldum. Belki de bu, SlimDX kullanarak, bir kez oluşturmak, geri sarmak ve aynı konumun üzerine yazmaya devam etmek yerine, her çerçeve güncellemesi için yeni bir akış ve yeni bir bitmap oluşturmak zorunda olmasıyla ilgili olabilir.
Cesar

Sadece bir açıklama: "aynı sonuçlar", GDI'nın daha hızlı olduğu anlamına geliyordu. @Christopher'ın belirttiği gibi, 30 fps + çok yapılabilir ve hala bol miktarda yedek CPU bıraktı.
Cesar

8

Öğrenebileceğim birkaç şey var: Görünüşe göre bir OSS sürücüsünün farkında olmasam da "ayna sürücüsü" kullanmak hızlı.

RDP neden diğer uzaktan kumanda yazılımlarına kıyasla bu kadar hızlı?

Ayrıca görünüşe göre bazı StretchRect kıvrımlarını kullanmak BitBlt'den daha hızlıdır

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

Ve bahsettiğiniz (D3D dll'sine bağlanan fraps) muhtemelen D3D uygulamaları için tek yoldur, ancak Windows XP masaüstü yakalama ile çalışmaz. Şimdi sadece normal masaüstü pencereleri için eşdeğer bir fraps olsaydı ...

(Bence aero ile fraps benzeri kancalar kullanabilirsiniz, ancak XP kullanıcıları şanssız olurdu).

Ayrıca görünüşte ekran bit derinliklerini değiştirmek ve / veya donanım hızını devre dışı bırakmak. yardımcı olabilir (ve / veya aero'yu devre dışı bırakabilir).

https://github.com/rdp/screen-capture-recorder-program , oldukça hızlı bir BitBlt tabanlı yakalama yardımcı programı ve kurulumunun bir parçası olarak, BitBlt hızlarını optimize etmek için kıyaslayabilmenizi sağlayan bir kıyaslama içerir.

VirtualDub ayrıca hızlı olduğu ve değişiklik algılaması gibi şeyler yaptığı söylenen bir "opengl" ekran yakalama modülüne de sahiptir http://www.virtualdub.org/blog/pivot/entry.php?id=290


Acaba, "ekran yakalama kaydedicinizi" veya BitBlt'i kendim kullanmak daha mı hızlı olacak? Projenizde biraz optimizasyon var mı?
blez

Bitblt'u kendiniz kullanırsanız, ekstra bir memcpy'den kaçınabilirsiniz (memcpy genellikle en büyük darboğaz değildir, ancak biraz zaman ekler - Ben sadece burada karşılaştırma programı için bahsediyordum, ancak bir şeye veya direk şovuna ihtiyacınız varsa, o zaman güzel )
rogerdpack

8

C ++ için şunları kullanabilirsiniz: http://www.pinvoke.net/default.aspx/gdi32/BitBlt.html
Bu, her tür 3D uygulama / video uygulaması üzerinde çalışmayabilir. Daha sonra bu bağlantı , kullanabileceğiniz 3 farklı yöntemi açıkladığından daha yararlı olabilir.

Eski yanıt (C #): System.Drawing.Graphics.Copy
kullanabilirsiniz , ancak çok hızlı değildir.

Tam olarak şunu yazdığım örnek bir proje: http://blog.tedd.no/index.php/2010/08/16/c-image-analysis-auto-gaming-with-source/

Direct3D gibi daha hızlı bir yöntem kullanarak bu örneği güncellemeyi planlıyorum: http://spazzarama.com/2009/02/07/screencapture-with-direct3d/

Ve işte video çekmek için bir link: Nasıl C # .Net kullanarak video olmak için ekran yakalamak için?


2
Ah, ben C programlama (muhtemelen C ++) ve .NET kullanmayı planlıyorum bahsetmeyi unuttum. Çok özür dilerim :/.
someguy

Zaten BitBlt'in (GDI) farkındaydım. Yine de Direct3D'ye bakacağım. Teşekkürler!
someguy

Bunu birkaç hafta önce araştırıyordum, ama henüz uygulamaya koymadım. Direct3D !! yolu !! GDI + kullanan C # yerleşik yönteminden daha hızlı.
Tedd Hansen

Orijinal yazımı güncelledim. Bağlantıya göre, GetFrontBufferData () çağrıldığında DirectX yavaştır. Oyun görüntüleri kaydedilirken dikkate alınması gereken bir şey var mı? Bunu benim için bağlamsallaştırır mısınız?
someguy

1
GDI yavaştır, bu nedenle sorunlu etki alanı için uygun değildir, DirectX veya OpenGL tek mantıklı öneri olacaktır.

6

Windows 8 ile Microsoft, Windows Masaüstü Çoğaltma API'sını tanıttı. Bunu resmi olarak tavsiye etmenin yolu budur. Screencasting için sahip olduğu güzel bir özellik, pencere hareketini algılamasıdır, böylece pencereler hareket ettirildiğinde ham pikseller yerine blok deltaları iletebilirsiniz. Ayrıca, hangi dikdörtgenlerin bir çerçeveden diğerine değiştiğini size söyler.

Microsoft örnek kodu oldukça karmaşıktır, ancak API aslında basit ve kullanımı kolaydır. Resmi örnekten çok daha basit bir örnek proje oluşturdum:

https://github.com/bmharper/WindowsDesktopDuplicationSample

Dokümanlar: https://docs.microsoft.com/en-gb/windows/desktop/direct3ddxgi/desktop-dup-api

Microsoft resmi örnek kodu: https://code.msdn.microsoft.com/windowsdesktop/Desktop-Duplication-Sample-da4c696a


Github projesi, web videosu ve Resident Evil 7 ile test edilen Windows 10'da mükemmel bir şekilde çalışıyor.
jw_

GPU-Z'yi başlatır başlatmaz bu program ekranı tutmayı durdurur.
Marino Šimić

5

Güçlü bir ekran yakalayıcısı olan c ++ açık kaynak projesi WinRobot @git'i deneyebilirsiniz

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;

Destek :

  • UAC Penceresi
  • Winlogon
  • DirectShowOverlay

1
Bu ... bir çok düşük seviye kanca. Yönetici hakları varsa, yakalama hızı inanılmaz.
toster-cx

Winrobot'u çok güçlü ve pürüzsüz buldum.
ashishgupta_mca

WinRobot kodunu inceledim ve çığır açıcı wrt ekran yakalama görmedim: aynı CreateCompatibleDC..BitBlt kullanıyor. Hizmet bağlamında gerçekleştirildiğinde sihir olmadığı sürece?
shekh

@shekh: Çalışmanız çok yüzeyseldi. Kod, ekranı ekran çizim yüzeyinden bir kopya DD yüzeyine kopyalamak için IDirectDrawSurface7-> BltFast () kullanır, ardından görüntüyü kopyalamak için bir Filemapping kullanır. Oldukça karmaşık çünkü kod, masaüstlerine kolayca erişemeyeceğiniz bir hizmette çalışıyor.
Elmue

2

Kendimi directx ile yapıyorum ve olmasını istediğiniz kadar hızlı olduğunu düşünüyorum. hızlı kod örneği yok, ama yararlı olması gereken bu buldum . directx11 sürümü çok farklı olmamalı, directx9 belki biraz daha fazla, ama bu yol


2

Aşağıdaki öneri sorunuza cevap vermez farkındayım ama hızla değişen DirectX görünümünü yakalamak için bulduk en basit yöntem, bir fiş etmektir video kamera , video kartının S-video bağlantı noktasına ve aynı görüntüler kaydetmek bir film. Ardından videoyu kameradan bilgisayardaki MPG, WMV, AVI vb. Dosyalara geri aktarın.


2

Ekran Kaydı VLC API kullanılarak C # ile yapılabilir . Bunu göstermek için örnek bir program yaptım. LibVLCSharp ve VideoLAN.LibVLC.Windows kütüphanelerini kullanır . Bu çapraz platform API'sını kullanarak video oluşturma ile ilgili daha birçok özelliğe ulaşabilirsiniz.

API dokümantasyonu için bakınız: 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
Kime endişe duyabilir: Lütfen libvlc'nin GPL altında yayınlandığını unutmayın. Kodunuzu GPL altında bırakmak istemiyorsanız libvlc kullanmayın.
Sebastian Cabot

Bu tam olarak doğru değil, LibVLC LGPL'dir - 2011'de yeniden piyasaya sürüldü. VLC uygulamasının kendisi GPL olarak kalıyor: videolan.org/press/lgpl-libvlc.html
Andrew

0

DXGI Masaüstü Yakalama

DXGI çoğaltması ile masaüstü görüntüsünü yakalayan proje. Çekilen görüntüyü farklı görüntü formatlarında (* .bmp; * .jpg; * .tif) dosyaya kaydeder.

Bu örnek C ++ ile yazılmıştır. DirectX (D3D11, D2D1) ile de biraz deneyime ihtiyacınız var.

Uygulama Ne Yapabilir

  • Birden fazla masaüstü monitörünüz varsa seçim yapabilirsiniz.
  • Yakalanan masaüstü görüntüsünü yeniden boyutlandırın.
  • Farklı ölçekleme modları seçin.
  • Çıktı görüntüsünde fare simgesini gösterebilir veya gizleyebilirsiniz.
  • Çıktı resmi için görüntüyü döndürebilir veya varsayılan olarak bırakabilirsiniz.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.