উইন্ডোজে স্ক্রিন ক্যাপচারের দ্রুততম পদ্ধতি


159

আমি উইন্ডোজ প্ল্যাটফর্মের জন্য একটি স্ক্রিনকাস্টিং প্রোগ্রাম লিখতে চাই, তবে কীভাবে স্ক্রিনটি ক্যাপচার করা যায় সে সম্পর্কে আমি অনিশ্চিত। আমি যে পদ্ধতিটি সম্পর্কে অবগত সেগুলি হ'ল জিডিআই ব্যবহার করা, তবে আমি আগ্রহী যে এই বিষয়ে আরও কিছু উপায় আছে এবং যদি আছে, তবে কমপক্ষে ওভারহেড অন্তর্ভুক্ত হয় কিনা? গতি একটি অগ্রাধিকার।

স্ক্রিনকাস্টিং প্রোগ্রামটি গেমের ফুটেজ রেকর্ডিংয়ের জন্য হবে, যদিও এটি যদি বিকল্পগুলি সংকুচিত করে, তবে আমি এখনও অন্য যে কোনও পরামর্শের বাইরে চলে যা এ সুযোগ থেকে দূরে রয়েছে। জ্ঞান খারাপ না, সর্বোপরি।

সম্পাদনা : আমি এই নিবন্ধটি জুড়ে এসেছি: স্ক্রিন ক্যাপচারের জন্য বিভিন্ন পদ্ধতি । এটি আমাকে উইন্ডোজ মিডিয়া এপিআই করার পদ্ধতি এবং এটি করার ডাইরেক্টএক্স পদ্ধতির সাথে পরিচয় করিয়ে দিয়েছে। এটি উপসংহারে উল্লেখ করেছে যে হার্ডওয়্যার ত্বরণ অক্ষম করা ক্যাপচার অ্যাপ্লিকেশনটির কার্যকারিতা মারাত্মকভাবে উন্নত করতে পারে। আমি কেন আগ্রহী তা জানতে আগ্রহী। কেউ কি আমার জন্য নিখোঁজ শূন্যস্থান পূরণ করতে পারে?

সম্পাদনা : আমি পড়েছি যে ক্যামটাসিয়ার মতো স্ক্রিনকাস্টিং প্রোগ্রামগুলি তাদের নিজস্ব ক্যাপচার ড্রাইভার ব্যবহার করে। কেউ আমাকে কীভাবে এটি কাজ করে তার গভীরতর ব্যাখ্যা দিতে পারে এবং কেন এটি দ্রুত? এর মতো কিছু বাস্তবায়নের জন্য আমারও গাইডেন্সের প্রয়োজন হতে পারে তবে আমি নিশ্চিত যে যাইহোক বিদ্যমান নথিপত্র রয়েছে।

এছাড়াও, আমি এখন জানি যে কীভাবে ফরাসগুলি স্ক্রিনটি রেকর্ড করে। এটি পিছনের বাফার থেকে পড়ার জন্য অন্তর্নিহিত গ্রাফিক্স এপিআই হুক করে। আমি যা বুঝতে পারি তা থেকে এটি সামনের বাফার থেকে পড়ার চেয়ে দ্রুত, কারণ আপনি ভিডিও র‌্যামের চেয়ে সিস্টেম র‌্যাম থেকে পড়ছেন। আপনি নিবন্ধটি এখানে পড়তে পারেন ।


আপনি কি পুনরায় খেলনা সিস্টেমটি ব্যবহার করে চিত্রের পর্দার বিষয়বস্তু রেকর্ডিংয়ের পরিবর্তে বিবেচনা করেছেন ?
বেনজামিন লিন্ডলি

2
আপনাকে কিছু হুক করতে হবে না। আপনাকে কেবলমাত্র আপনার ইনপুট ইভেন্টগুলি লিখতে হবে যাতে তারা সরাসরি খেলা নিয়ন্ত্রণ না করে, তবে পরিবর্তে অন্যান্য ফাংশনগুলিকে কল করে। উদাহরণস্বরূপ, প্লেয়ার যদি বাম কীটি চাপ দেয় তবে আপনি কেবল প্লেয়ারের এক্স অবস্থান হ্রাস করবেন না। পরিবর্তে, আপনি একটি ফাংশন কল, মত MovePlayerLeft()। এবং আপনি কী প্রেসগুলি এবং অন্যান্য ইনপুট সময় এবং সময়কাল রেকর্ড। তারপরে, আপনি যখন প্লেব্যাক মোডে থাকবেন তখন আপনি কেবল ইনপুটটিকে উপেক্ষা করবেন এবং এর পরিবর্তে রেকর্ড করা ডেটাটি পড়বেন। যদি, ডেটাতে, আপনি একটি বাম কী টিপেন দেখেন, আপনি কল করেন MovePlayerLeft()
বেনজমিন লিন্ডলি

1
@ পিগবেন এই গেম ফুটেজ রেকর্ড করার জন্য একটি সাধারণ অ্যাপ্লিকেশন হবে। এটি কোনও নির্দিষ্ট গেমের জন্য নয়। কেউ কি বাম কী টিপতে পারে তার অর্থ ডান স্থানান্তরিত হতে পারে, আমি জানি সমস্তই। এছাড়াও, আপনি এমন ইভেন্টগুলি বিবেচনা করেননি যা ব্যবহারকারীর দ্বারা প্রভাবিত হয় না। 'এবং রেন্ডারিংয়ের কী হবে?
someguy

1
@ সুমেগুয়ে ঠিক আছে আমি অনুমান করি আপনি আরও বেশি তীব্র কিছু করছেন, আমি উপরের পদ্ধতিগুলি ব্যবহার করে একটি ট্র্যাচিং ছাড়াই প্রায় 30fps তে একটি গেমটিতে রিপ্লে এভিআই রক্ষা করতে একটি রুটিন যুক্ত করেছি। আমি "ওয়ার্ক ফোর্স অপ্টিমাইজেশন" এর জন্য উইন্ডোজ এপিআই ব্যবহার করে একাধিক মনিটর স্ক্রিন রেকর্ডার তৈরি করেছি তবে এটি লক্ষ্যযুক্ত 4 এফপিএস এমনকি খারাপভাবে সম্পাদন করেছে।
এজেজি 85

1
সেখানে একটি ওপেন সোর্স আয়না উইন্ডোগুলির UltraVNC এর ভাণ্ডার সাইটে এখানে চালক ultravnc.svn.sourceforge.net/viewvc/ultravnc/...
beached

উত্তর:


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

সামনের বাফারের সমস্যাটি অ্যাক্সেসের মধ্যে একটি, এটি হ'ল এমন একটি সমতল অনুলিপি করার চেষ্টা করা যা বর্তমানে অনুলিপিটি "বিঘ্নিত" করা হয়েছে। এটি আমার পক্ষে যথেষ্ট কাজ করে এবং আমার হার্ড ড্রাইভ খায়!
ব্র্যান্ড্রু

@ বোবোবো আমি জানি না এটি কীভাবে কার্যকর হবে, তবে আমি হাফিয়ুভের মতো কিছু ব্যবহার করার কথা ভাবছিলাম। সম্পাদনা: অথবা সম্ভবত ব্যবহারকারীকে উপলভ্য ডিরেক্টরিতে ফিল্টারগুলি চয়ন করতে দিন।
18

1
আমি কেবল সেই কাজটি পরিচালনা করতে পারি না ... ডাইরেক্টএক্স getRenderTargetData অংশে কিছু অবৈধ কল স্পিট করে। স্পষ্টতই আপনি যেভাবে আপনার ডিভাইসটি তৈরি করবেন তার অবশ্যই অনেক বেশি গুরুত্ব থাকতে হবে।
লাইট স্ট্রাইকার

12
ডাউনভোট, এটি কেবল আপনার নিজের অ্যাপ্লিকেশনের জন্যই কাজ করে, তাই জেনেরিক প্রোগ্রামগুলি রেকর্ড করতে ব্যবহার করা যাবে না
user3125280

32

সম্পাদনা: আমি দেখতে পাচ্ছি যে এটি আপনার প্রথম সম্পাদনা লিঙ্কের নীচে "জিডিআই উপায়" হিসাবে তালিকাভুক্ত রয়েছে। এটি এখনও সেই সাইটে পারফরম্যান্স অ্যাডভাইসারির সাথে যাওয়ার এক শালীন উপায়, আপনি 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করে গন্তব্য প্রসঙ্গ তৈরির পরিবর্তে , যা ডাইরেক্টএক্স 10+ এর সাথে কাজ করে। যদি এর জন্য কোনও সমর্থন না পাওয়া যায় তবে তারা পিছিয়ে পড়ে ।CreateCompatibleDCIDXGISurface1CreateCompatibleDC

নির্দিষ্ট অ্যাপ্লিকেশনটি ব্যবহার করার জন্য এটি পরিবর্তন করতে, আপনাকে প্রথম লাইনটি গেমের উইন্ডোটির হ্যান্ডেলটি GetDC(game)যেখানে পরিবর্তন করতে হবে gameএবং তারপরে গেমের উইন্ডোটির ডানদিক heightএবং সেটও স্থাপন করতে widthহবে।

এইচডিস্ট / এইচবিডেস্কটপটিতে আপনার পিক্সেলগুলি পরে, আপনাকে এখনও এটি কোনও ফাইলে সংরক্ষণ করতে হবে তবে আপনি যদি স্ক্রিন ক্যাপচার করছেন তবে আমার মনে হয় আপনি তাদের একটি নির্দিষ্ট সংখ্যার স্মৃতিতে বাফার করতে এবং ভিডিও ফাইলটিতে সংরক্ষণ করতে চান খণ্ডগুলিতে, সুতরাং আমি ডিস্কে স্থির চিত্রটি সংরক্ষণ করার জন্য কোডটির দিকে নির্দেশ করব না।


3
msdn.microsoft.com/en-us/library/dd183370%28VS.85%29.aspx অংশ : উত্স এবং গন্তব্য ডিভাইস প্রসঙ্গে রঙের ফর্ম্যাটগুলি মেলে না, তবে বিটব্লট ফাংশনটি গন্তব্যের সাথে মিলিয়ে উত্সের রঙ ফর্ম্যাটকে রূপান্তর করে বিন্যাস।

2
কিছু প্রমাণ প্রমাণ করা ভাল হবে। আপনি কোথাও একটি পারফরম্যান্স তুলনা প্রকাশ করেছেন, বা একটি সঠিক দেখেছেন?

2
এটি প্রোফাইল করার চেষ্টা করুন। পোস্টে যেমন বলেছিলাম, জিডিআই-র অভিজ্ঞতা আছে এমন কাউকে আমি উল্লেখ করছি। যদি এটি মেমরি ফাঁস করে এবং আপনি কীভাবে এটি ঠিক করতে জানেন, ফাঁস দূর করার জন্য পোস্টটি সম্পাদনা করুন।

1
আমি এই পদ্ধতিটি দিয়ে প্রায় 5 এফপিএস পেয়েছি। এটি ইন্টিগ্রেটেড গ্রাফিক্স সহ একটি ল্যাপটপে ছিল, তাই আমি একটি বাস্তব গ্রাফিক্স কার্ড সহ একটি ডেস্কটপ থেকে আরও ভাল আশা করব, তবে এখনও এটি খুব ধীর slow
টিএমএমএম

1
@ টিএমএমএমএম ওবিএস যেভাবে এটি প্রয়োগ করে তার একটি রেফারেন্স যুক্ত করেছি। আশা করি এটি আপনার জন্য কিছুটা গতি বাড়িয়ে দিতে পারে।

19

আমি ডাইরেক্টএক্স অ্যাপ্লিকেশনগুলির জন্য এফআরপিএস এর মতো একটি ভিডিও ক্যাপচার সফ্টওয়্যার লিখেছি। উত্স কোড উপলব্ধ এবং আমার নিবন্ধটি সাধারণ কৌশলটি ব্যাখ্যা করে। Http://blog.nektra.com/main/2013/07/23/ingnmenting-direct3d-applications-to-capture-video-and-calculate-frames-per-second/ এ দেখুন

পারফরম্যান্স সম্পর্কিত আপনার প্রশ্নের সম্মান,

  • ডাইরেক্টএক্স জিডিআই এর চেয়ে দ্রুত হওয়া উচিত যখন আপনি সামনের বাফারটি পড়েন যা খুব ধীর। আমার অ্যাপ্রোচ এফআরপিএসের মতো (ব্যাকবুফার থেকে পড়া)। আমি ডাইরেক্ট 3 ডি ইন্টারফেস থেকে কিছু সেট পদ্ধতিতে বাধা দিই।

  • রিয়েলটাইমে ভিডিও রেকর্ডিংয়ের জন্য (ন্যূনতম প্রয়োগের প্রভাব সহ) একটি দ্রুত কোডেক প্রয়োজনীয় essential এফআরপিএস এর নিজস্ব লসলেস ভিডিও কোডেক ব্যবহার করে। ল্যাগারিথ এবং এইচএফএফইইউভি রিয়েলটাইম অ্যাপ্লিকেশনগুলির জন্য ডিজাইন করা জেনেরিক লসলেস ভিডিও কোডেক। আপনি যদি ভিডিও ফাইলগুলি আউটপুট করতে চান তবে আপনার এগুলি দেখতে হবে।

  • স্ক্রিনকাস্ট রেকর্ডিংয়ের আরেকটি পদ্ধতি হতে পারে মিরর ড্রাইভার লিখতে। উইকিপিডিয়া অনুসারে: ভিডিও মিররিং সক্রিয় থাকাকালীন, প্রতিবার সিস্টেমটি মিররযুক্ত এলাকার অভ্যন্তরের কোনও স্থানে প্রাথমিক ভিডিও ডিভাইসে টানলে, রি-টাইমে মিররযুক্ত ভিডিও ডিভাইসে ড্র অপারেশনটির একটি অনুলিপি কার্যকর করা হয়। এমএসডিএন এ: মিরর ড্রাইভারগুলি দেখুন: http://msdn.microsoft.com/en-us/library/windows/hardware/ff568315(v=vs.85).aspx


16

আমি ব্যাকবুফারটি পেতে d3d9 ব্যবহার করি এবং d3dx লাইব্রেরি ব্যবহার করে এটি একটি পিএনজি ফাইলে সংরক্ষণ করি:

    IDirect3DSurface9 * পৃষ্ঠ;

    // getBackBuffer
    idirect3ddevice9-> getBackBuffer (0, 0, D3DBACKBUFFER_TYPE_MONO, & পৃষ্ঠ);

    // পৃষ্ঠ সংরক্ষণ করুন
    D3DXSaveSurfaceToFileA ("filename.png", D3DXIFF_PNG, পৃষ্ঠ, NULL, NULL);

    SAFE_RELEASE (পৃষ্ঠ);

এটি করার জন্য আপনার নিজের স্বাপবফারটি তৈরি করা উচিত

d3dpps.SwapEffect = D3DSWAPEFFECT_COPY ; // for screenshots.

(সুতরাং আপনি গ্যারান্টি দিন যে আপনি স্ক্রিনশট নেওয়ার আগে ব্যাকবফার ম্যাঙ্গেল হয়নি)।


জ্ঞান তোলে, ধন্যবাদ। আপনি কি জানেন যে এই এবং এর মধ্যে পার্থক্য GetRenderTargetকী?
18:58 এ 18

এটি কেবলমাত্র বর্তমান রেন্ডার টার্গেট পায় (আপনার কল করার মুহুর্তে যদি কোনও টেক্সচারে রেন্ডার করা হয় তবে অন্য কোনও অফস্ক্রিন পৃষ্ঠ হতে পারে)।
bobobobo 19

13

আমার ছাপে, জিডিআই পদ্ধতির এবং ডিএক্স পদ্ধতির প্রকৃতির ক্ষেত্রে এটি আলাদা। জিডিআই ব্যবহার করে পেইন্টিং ফ্লুশ পদ্ধতি প্রয়োগ করে, FLUSH পদ্ধতির ফ্রেমটি আঁকুন তারপরে এটি সাফ করুন এবং একই বাফারে অন্য ফ্রেমটি পুনরায় আঁকুন, এর ফলে গেমগুলিতে ঝাঁকুনির ফলে উচ্চ ফ্রেমের হারের প্রয়োজন হয়।

  1. কেন দ্রুত এক্স এক্স? ডিএক্সে (বা গ্রাফিক্স ওয়ার্ল্ড), ডাবল বাফার রেন্ডারিং নামক একটি আরও পরিপক্ক পদ্ধতি প্রয়োগ করা হয়, যেখানে দুটি বাফার উপস্থিত থাকে, যখন সামনের বাফারটি হার্ডওয়্যারে উপস্থিত হয়, আপনি অন্য বাফারকেও রেন্ডার করতে পারেন, তারপরে ফ্রেম 1 পরে রেন্ডারিং শেষ হয়ে গেলে সিস্টেমটি অন্য বাফারের সাথে অদলবদল করে (হার্ডওয়্যারে উপস্থাপনের জন্য এটি লক করে এবং পূর্বের বাফারটি প্রকাশ করে), এইভাবে রেন্ডারিংয়ের অদক্ষতা অনেক উন্নত হয়েছে।
  2. কেন দ্রুততর হার্ডওয়্যার ত্বরণ বন্ধ? যদিও ডাবল বাফার রেন্ডারিং সহ, এফপিএস উন্নত করা হয়েছে, তবে রেন্ডারিংয়ের সময় এখনও সীমিত। আধুনিক গ্রাফিক হার্ডওয়্যার সাধারণত অ্যান্টি-এলিয়াসিংয়ের মতো রেন্ডারিংয়ের সময় প্রচুর পরিমাণে অপ্টিমাইজেশন জড়িত থাকে, এটি খুব কমপিউটিভ নিবিড়, যদি আপনার যদি উচ্চ মানের গ্রাফিক্সের প্রয়োজন না হয় তবে অবশ্যই আপনি এই বিকল্পটি অক্ষম করতে পারেন। এবং এটি আপনার কিছু সময় সাশ্রয় করবে।

আমি মনে করি আপনার সত্যিকারের যা দরকার তা হ'ল রিপ্লে সিস্টেম, যা লোকেরা যা আলোচনা করেছিল তার সাথে আমি সম্পূর্ণ একমত।


1
কেন পুনরায় খেলুন সিস্টেমটি সম্ভব হয় না তা আলোচনা দেখুন। স্ক্রিনকাস্টিং প্রোগ্রামটি কোনও নির্দিষ্ট গেমের জন্য নয়।
someguy

10

আমি এমন একটি ক্লাস লিখেছিলাম যা স্ক্রিন ক্যাপচারের জন্য জিডিআই পদ্ধতি প্রয়োগ করেছিল। আমিও অতিরিক্ত গতি চেয়েছিলাম, তাই ডাইরেক্টএক্স পদ্ধতিটি আবিষ্কার করার পরে (গেটফ্রন্টবফারের মাধ্যমে) আমি চেষ্টা করেছিলাম, এটি আরও দ্রুত হওয়ার প্রত্যাশা করে।

আমি হতাশ হয়ে গিয়েছিলাম যে জিডিআই প্রায় 2.5x দ্রুত সম্পাদন করে। আমার দ্বৈত মনিটর প্রদর্শন ক্যাপচার 100 টি ট্রায়াল পরে, জিডিআই বাস্তবায়ন স্ক্রিন ক্যাপচার প্রতি গড় 0.65s, যখন ডাইরেক্টএক্স পদ্ধতির গড় 1.72s হয়। সুতরাং আমার পরীক্ষাগুলি অনুসারে জিডিআই গেটফ্রন্টবফারের চেয়ে অবশ্যই দ্রুত।

আমি getRenderTargetData এর মাধ্যমে ডাইরেক্টএক্স পরীক্ষা করার জন্য ব্র্যান্ড্রুয়ের কোডটি পেতে সক্ষম হয়েছি। পর্দার অনুলিপি পুরোপুরি কালো হয়ে এসেছে। তবে এটি সেই ফাঁকা স্ক্রিনটি সুপার দ্রুত অনুলিপি করতে পারে! আমি এটির সাথে ঝাঁকুনি রাখব এবং এর বাস্তব ফলাফলগুলি দেখার জন্য একটি কার্যকরী সংস্করণ পাওয়ার আশা করব।


তথ্যের জন্য আপনাকে ধন্যবাদ. আমি ব্র্যান্ড্রুয়ের কোড পরীক্ষা করিনি, তবে আমি জানি যে GetRenderTargetDataপদ্ধতি গ্রহণ করা কার্যকর হয় । আমি আমার অ্যাপ্লিকেশন শেষ করার পরে আমার নিজের উত্তর লিখব। অথবা, আপনি সমস্ত কিছু কাজ করার পরে আপনার আপডেট করতে পারেন।
someguy

প্রতি স্ক্রিনক্যাপচার 0.65 ?! একটি ভাল জিডিআই বাস্তবায়ন (ডিভাইসগুলির চারপাশে রাখা ইত্যাদি) আধুনিক কম্পিউটারে সহজেই 1920x1200 এ 30fps করা উচিত।
ক্রিস্টোফার ওয়েজবাক

আমি ধরে নিই যে জিডিআই দ্বারা
রচিত

আমি স্লিমডিএক্সের সাহায্যে সি # তে এই পরীক্ষাটি করেছি এবং আশ্চর্যরকমভাবে একই ফলাফল পেয়েছি। সম্ভবত এটি এই বিষয়টির সাথে থাকতে পারে যে স্লিমডিএক্স ব্যবহার করে, একবারে একবার তৈরি করার পরিবর্তে, প্রতিটি ফ্রেম আপডেটের জন্য একটি নতুন স্ট্রিম এবং একটি নতুন বিটম্যাপ তৈরি করতে হবে, একই জায়গায় পুনরায় বাঁধাই এবং ওভাররাইটিং চালিয়ে যেতে হবে।
সিজার

কেবল একটি ব্যাখ্যা: আসলে, "একই ফলাফলগুলি" জিডিআই দ্রুত হওয়ার কথা উল্লেখ করছিল - যেমন ক্রিসটফার উল্লেখ করেছেন, 30fps + খুব করণীয় ছিল এবং এখনও প্রচুর অতিরিক্ত সিপিইউ রেখেছিল।
সিজার

8

কয়েকটি জিনিস আমি সংগ্রহ করতে সক্ষম হয়েছি: দৃশ্যত একটি "মিরর ড্রাইভার" ব্যবহার করা দ্রুততর যদিও আমি কোনও ওএসএস সম্পর্কে অবগত নই।

অন্যান্য রিমোট কন্ট্রোল সফ্টওয়্যারের তুলনায় আরডিপি এত তাড়াতাড়ি কেন?

স্পষ্টতই স্ট্রেচরেক্টের কয়েকটি কনভোলিউশনগুলি ব্যবহার করা বিটব্ল্টের চেয়ে দ্রুত

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

এবং আপনি যেটির উল্লেখ করেছেন (D3D dll এর মধ্যে ফ্রেপগুলি জড়িত করা) সম্ভবত এটি D3D অ্যাপ্লিকেশনগুলির একমাত্র উপায়, তবে উইন্ডোজ এক্সপি ডেস্কটপ ক্যাপচারের সাথে কাজ করবে না। সুতরাং এখন আমি কেবল চাই যে সাধারণ ডেস্কটপ উইন্ডোগুলির জন্য কোনও ফ্রেপ সমতুল্য গতি অনুযায়ী হবে ... কেউ?

(আমি মনে করি এরো দিয়ে আপনি ফ্রেপ-জাতীয় হুক ব্যবহার করতে পারবেন তবে এক্সপি ব্যবহারকারীরা ভাগ্যের বাইরে চলে যাবেন)।

এছাড়াও স্পষ্টতই স্ক্রিন বিট গভীরতা এবং / অথবা হার্ডওয়্যার অ্যাক্সেল অক্ষম করে। সহায়তা করতে পারে (এবং / অথবা এ্যারো অক্ষম করা)।

https://github.com/rdp/screen-capture-recorder-program এ যুক্তিসঙ্গতভাবে দ্রুত বিটব্লট ভিত্তিক ক্যাপচার ইউটিলিটি এবং এর ইনস্টলের অংশ হিসাবে একটি বেঞ্চমার্ক অন্তর্ভুক্ত রয়েছে, যা আপনাকে সেগুলি অনুকূল করে তোলার জন্য বিটমার্কের গতি পেতে দেয়।

ভার্চুয়ালডাবের একটি "ওপেনগেল" স্ক্রিন ক্যাপচার মডিউলও রয়েছে যা বলা হয় দ্রুত এবং পরিবর্তন সনাক্তকরণের মতো কাজগুলি http://www.virtualdub.org/blog/pivot/entry.php?id=290


আমি ভাবছি, আপনার "স্ক্রিন-ক্যাপচার-রেকর্ডার" বা বিটব্লট নিজে ব্যবহার করা কি দ্রুত হবে? আপনার প্রকল্পে কিছু অপ্টিমাইজেশন আছে?
blez

আপনি যদি বিটব্ল্ট নিজেকে ব্যবহার করেন তবে আপনি একটি অতিরিক্ত ম্যাকসিপি এড়াতে পারেন (মেমকিটি সাধারণত সবচেয়ে বড় বাধা নয় যদিও এটি কিছুটা সময় যোগ করে - আমি কেবল এটির বেঞ্চমার্ক ইউটিলিটির জন্য এখানে উল্লেখ করছি, তবে আপনার যদি কিছু প্রয়োজন বা দিকনির্দেশনা প্রয়োজন তবে এটি দুর্দান্ত )
রজারডপ্যাক

8

সি ++ এর জন্য আপনি ব্যবহার করতে পারেন: http://www.pinvoke.net/default.aspx/gdi32/BitBlt.html
এটি সমস্ত ধরণের 3 ডি অ্যাপ্লিকেশন / ভিডিও অ্যাপ্লিকেশনগুলিতে কাজ না করে। তারপরে এই লিঙ্কটি আরও কার্যকর হতে পারে কারণ এটি আপনি ব্যবহার করতে পারেন এমন 3 টি পৃথক পদ্ধতি বর্ণনা করে।

পুরানো উত্তর (সি #):
আপনি System.Drawing.Graphics.Copy ব্যবহার করতে পারেন , তবে এটি খুব দ্রুত নয়।

একটি নমুনা প্রকল্প যা আমি হুবহু এটি করে লিখেছি: http://blog.tedd.no/index.php/2010/08/16/c-image-analysis-auto-gaming-with-source/

আমি ডিরেক্ট 3 ডি এর মতো দ্রুত পদ্ধতি ব্যবহার করে এই নমুনাটি আপডেট করার পরিকল্পনা করছি: http://spazzarama.com/2009/02/07/screencapture-with-direct3d/

এবং ভিডিওতে ক্যাপচারের জন্য এখানে একটি লিঙ্ক রয়েছে: সি #। নেট ব্যবহার করে কীভাবে ভিডিও হতে পর্দা ক্যাপচার করবেন?


2
আহ, আমি সি তে প্রোগ্রামিং (সম্ভবত সি ++) উল্লেখ করতে ভুলে গেছি এবং। নেট ব্যবহার করার পরিকল্পনা করছি না। অনেক দুঃখিত :/.
someguy

আমি ইতিমধ্যে বিটব্ল্ট (জিডিআই) সম্পর্কে সচেতন ছিলাম। আমি ডিরেক্ট 3 ডি সন্ধান করব, যদিও। ধন্যবাদ!
someguy

আমি কয়েক সপ্তাহ আগে এটি সন্ধান করছিলাম, তবে এখনও এটি বাস্তবায়নের লক্ষ্যে পৌঁছতে পারি নি। ডাইরেক্ট 3 ডি !! উপায় !! সিডি বিল্টিন পদ্ধতির চেয়ে দ্রুত যা জিডিআই + ব্যবহার করে।
টেড হানসেন

আমি আমার আসল পোস্টটি আপডেট করেছি। লিঙ্ক অনুসারে, গেটফ্রন্টবফারডাটা () কল করার সময় ডাইরেক্টএক্স স্লো হয়। গেম ফুটেজ রেকর্ড করার সময় এটি কি বিবেচনার জন্য কিছু? আপনি কি আমার জন্য এটি প্রাসঙ্গিক করতে পারেন?
someguy

1
জিডিআই ধীর গতির, সুতরাং এটি সমস্যা ডোমেনের পক্ষে উপযুক্ত নয়, ডাইরেক্টএক্স বা ওপেনজিএল একমাত্র বুদ্ধিমান প্রস্তাবনা recommend

6

উইন্ডোজ 8 এর সাথে মাইক্রোসফ্ট উইন্ডোজ ডেস্কটপ ডুপ্লিকেশন এপিআই চালু করেছিল। এটি করার আনুষ্ঠানিকভাবে প্রস্তাবিত উপায়। স্ক্রিনকাস্টিংয়ের জন্য এটির একটি দুর্দান্ত বৈশিষ্ট্য হ'ল এটি উইন্ডো চলাচল সনাক্ত করে, তাই কাঁচা পিক্সেলের পরিবর্তে উইন্ডোগুলি প্রায় সরানো হলে আপনি ব্লক ডেল্টাস সংক্রমণ করতে পারেন। এছাড়াও, এটি আপনাকে জানায় যে কোন আয়তক্ষেত্রগুলি এক ফ্রেম থেকে অন্য ফ্রেমে পরিবর্তিত হয়েছে।

মাইক্রোসফ্ট উদাহরণ কোডটি বেশ জটিল, তবে এপিআই আসলে সহজ এবং ব্যবহারযোগ্য। আমি একটি উদাহরণ প্রকল্প একসাথে রেখেছি যা অফিসিয়াল উদাহরণের চেয়ে অনেক সহজ:

https://github.com/bmharper/WindowsDesktopDuplicationSample

দস্তাবেজ: https://docs.microsoft.com/en-gb/windows/desktop/direct3ddxgi/desktop-dup-api

মাইক্রোসফ্ট অফিসিয়াল উদাহরণ কোড: https://code.msdn.microsoft.com/windowsdesktop/Desktop- সদৃশ- নমুনা-da4c696a


গিথুব প্রকল্পটি উইন্ডোজ 10 এ পুরোপুরি কাজ করে, ওয়েব ভিডিও এবং রেসিডেন্ট এভিল 7 এর সাথে পরীক্ষিত The
jw_

আপনি জিপিইউ-জেড চালু করার সাথে সাথে এই প্রোগ্রামটি স্ক্রিনটি ধরা বন্ধ করে দেয়।
মেরিনো Šimić

5

আপনি শক্তিশালী স্ক্রিন ক্যাপচারার সি ++ ওপেন সোর্স প্রকল্প উইনরোবট @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;

সমর্থন:

  • ইউএসি উইন্ডো
  • Winlogon
  • DirectShowOverlay

1
এটি ... অনেকগুলি নিম্ন স্তরের হুক ক্যাপচার গতি আশ্চর্যজনক যদি আপনার প্রশাসনের অধিকার থাকে।
টস্টার-সিএক্স

আমি উইনরোবটকে খুব শক্তিশালী এবং মসৃণ পেয়েছি।
আশীষগুপ্ত_মকা

আমি উইনরোবট কোড অধ্যয়ন করেছি এবং কিছুতেই গ্রাউন্ডব্রেকিং আর্ট স্ক্রিন ক্যাপচার দেখিনি: এটি একই ক্রিয়েটকম্পিটিডডিসি..বিটব্ল্ট ব্যবহার করছে। পরিষেবা প্রসঙ্গে যখন এটি করা হয় তখন কোনও জাদু না থাকলে?
শেখ

@ শেখ: আপনার পড়াশোনাটি অতি পৃষ্ঠপোষক ছিল। কোডটি স্ক্রিনের অঙ্কন পৃষ্ঠ থেকে অনুলিপি ডিডি পৃষ্ঠে অনুলিপি করতে IDirectDrawSurface7-> BltFast () ব্যবহার করে, তারপরে এটি চিত্রটি অনুলিপি করতে একটি ফাইলম্যাপিং ব্যবহার করে। এটি বেশ জটিল কারণ কোডটি এমন পরিষেবাতে চলছে যেখানে আপনি সহজেই ডেস্কটপগুলি অ্যাক্সেস করতে পারবেন না।
এলমেউ

2

আমি নিজে এটি ডাইরেক্টেক্স দিয়ে করি এবং মনে করি এটি আপনি যতটা দ্রুত চাইবেন তত দ্রুত। আমি একটি দ্রুত কোড নমুনা হবে না, কিন্তু আমি খুঁজে পাওয়া যায় নি এই যা উপযোগী হতে হবে। ডাইরেক্টএক্স 11 সংস্করণটি খুব বেশি আলাদা হওয়া উচিত না, ডাইরেক্টএক্স 9 সম্ভবত আরও কিছুটা হলেও চলার পথে চলবে


2

আমি বুঝতে পেরেছি যে নিম্নলিখিত পরামর্শটি আপনার প্রশ্নের উত্তর দেয় না, তবে দ্রুত পরিবর্তিত ডাইরেক্টএক্স ভিউ ক্যাপচারের জন্য আমি খুঁজে পেয়েছি সবচেয়ে সহজ পদ্ধতিটি হ'ল ভিডিও কার্ডের এস-ভিডিও বন্দরে একটি ভিডিও ক্যামেরা প্লাগ করা এবং চিত্রগুলি হিসাবে রেকর্ড করা একটি সিনেমা. তারপরে ক্যামেরা থেকে ভিডিওটি কম্পিউটারে একটি এমপিজি, ডাব্লুএমভি, এভিআই ইত্যাদি ফাইলে স্থানান্তর করুন।


2

স্ক্রিন রেকর্ডিং ভিএলসি এপিআই ব্যবহার করে সি # তে করা যেতে পারে । আমি এটি প্রদর্শনের জন্য একটি নমুনা প্রোগ্রাম করেছি। এটি LibVLCSharp এবং VideoLAN.LibVLC.Windows লাইব্রেরি ব্যবহার করে। আপনি এই ক্রস প্ল্যাটফর্ম API ব্যবহার করে ভিডিও রেন্ডারিং সম্পর্কিত আরও অনেকগুলি বৈশিষ্ট্য অর্জন করতে পারেন।

এপিআই ডকুমেন্টেশনের জন্য দেখুন: LibVLCSharp এপিআই গিথুব

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 প্রকাশিত হয়েছে। আপনি যদি জিপিএল এর অধীনে আপনার কোডটি প্রকাশের উদ্দেশ্যে না করেন তবে libvlc ব্যবহার করবেন না।
সেবাস্তিয়ান ক্যাবট

যে বেশ সঠিক না হয়, LibVLC LGPL - এটা 2011 দ্য ভিএলসি অ্যাপ্লিকেশনে relicensed ছিল নিজেই জিপিএল অবশেষ: videolan.org/press/lgpl-libvlc.html
অ্যান্ড্রু

0

ডিএক্সজিআই ডেস্কটপ ক্যাপচার

প্রকল্প যা DXGI সদৃশ সঙ্গে ডেস্কটপ ইমেজ ক্যাপচার। বিভিন্ন চিত্র ফরম্যাটে (* .bmp; * .jpg; * .if) ক্যাপচার করা চিত্রটি ফাইলটিতে সংরক্ষণ করে।

এই নমুনাটি সি ++ তে লেখা আছে। ডাইরেক্টএক্সের (ডি 3 ডি 11, ডি 2 ডি 1) আপনারও কিছু অভিজ্ঞতা দরকার।

অ্যাপ্লিকেশন কি করতে পারে

  • আপনার যদি একাধিক ডেস্কটপ মনিটর থাকে তবে আপনি চয়ন করতে পারেন।
  • ধরা পড়া ডেস্কটপ চিত্রটিকে পুনরায় আকার দিন।
  • বিভিন্ন স্কেলিং মোড চয়ন করুন।
  • আপনি আউটপুট ইমেজে মাউস আইকনটি প্রদর্শন বা লুকিয়ে রাখতে পারেন।
  • আপনি আউটপুট ছবির জন্য চিত্রটি ঘোরান, বা এটি ডিফল্ট হিসাবে রেখে দিতে পারেন।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.