PDA

View Full Version : گرفتن فیلم از صفحه نمایش



Hamidreza Bozorg
یک شنبه 20 اسفند 1391, 13:57 عصر
با سلام
من یه برنامه ای نوشتم که از دسکتاپ در هر ثانیه 10 تا عکس میگیره ( برای فیلم گرفتن از مانیتور گرفتن )
من اومدم یه تایمری کذاشتم و Interval اونو گذاشتم 100



private void timer1_Tick(object sender, EventArgs e)
{
Bitmap BM = new Bitmap(Screen.PrimaryScreen.WorkingArea.Width,Scre en.PrimaryScreen.WorkingArea.Height);

using (Graphics gr = Graphics.FromImage(BM))
{
gr.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighSpeed ;
gr.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighSp eed;
gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighSpeed;

gr.CopyFromScreen(0, 0, 0, 0, BM.Size);
}
BM.Save("C:\\" + DateTime.Now.Second.ToString() + "_" + DateTime.Now.Millisecond.ToString() + ".jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
}



اما تایمر دقیق عکساشو نمیگیره ( چون عکس گرفتن از دسکتاپ طول میکشه )
اما وقتی Interval رو میزارم 200 (5 عکس در ثانیه) درست کار میکنه
فکر کنم تایمر بدرد کار من نمیخوره ، قدرتشو نداره !!!

من چجوره برناممو بنویسم که دقیق کار کنه و حتی یک میلی ثانیه هم اشتباه نشه ؟؟؟
چون اگه یه میلی ثانیه اشتباه بشه در طولانی مدت اشتباهات به ثانیه هم میکشه !!!


با BackgroundWorker میشه ؟؟؟

دلتنگ اسمان
یک شنبه 20 اسفند 1391, 15:11 عصر
دوست عزیز برنامه جالبیه.
میشه کدهای بازخوانی رو هم بزاری؟ یعنیعکسهای گرفته شده رو پخش کرد.

youngold
یک شنبه 20 اسفند 1391, 15:11 عصر
دوست عزیز نحوه کارتون اشتباه است تایمر مشکلی نداره
گرفتن اسکرین اینقدر ها طول نمیکشه بلکه این ذخیره تصویر هست که به طول می انجامد
شما باید اسکرین ها رو در حافظه نگه دارید و یا اگر میتونید دسته دسته جمع کنید بعد ذخیره کنید ، نه اینکه عکس ها رو در هر بار گرفتن ذخیره کنید

بهتر هم هست کلیه پردازش های دیگر جز گرفتن عکس رو به زمان ذخیره نهایی فریم هاتون محول کنید

abdullah20
یک شنبه 20 اسفند 1391, 15:14 عصر
دوست عزیز گرفتن فیلم از صفحه نمایش به این سادگیا هم نیست
نرم افزارهای ضبط فیلم مثل camtasia از چندین تکنوژی با هم استفاده میکنن
درسته اصل کارشون عکس گرفتن متوالی است ولی کار ساده ای نیست

youngold
یک شنبه 20 اسفند 1391, 15:18 عصر
دوست عزیز گرفتن فیلم از صفحه نمایش به این سادگیا هم نیست
نرم افزارهای ضبط فیلم مثل camtasia از چندین تکنوژی با هم استفاده میکنن
درسته اصل کارشون عکس گرفتن متوالی است ولی کار ساده ای نیست


بله

شما هم بهتره از رفرنس های موجود برای اینکار استفاده کنید چون ظاهراً تجربه استفاده صحیح از پردازش و حافظه رو ندارید

Hamidreza Bozorg
یک شنبه 20 اسفند 1391, 19:42 عصر
دمتون گرم از جواب
اینو بگم که من برنامشو کامل نوشتم

http://barnamenevis.org/showthread.php?379202-%D8%B6%D8%A8%D8%B7-%D9%81%DB%8C%D9%84%D9%85-%D8%A7%D8%B2-%D8%AF%D8%B3%DA%A9%D8%AA%D8%A7%D9%BE

اما تایمر یه خورده دیر و زود عکسارو میگیره برا همینم تداخل بین صدا و فیلم میفته
آقایی که تجربه کافی استفاده صحیح از پردازش و حافظه رو دارید : یکم فکر کن ببین از طرف یک ساعت بخواد فیلم ضبط کنه چقدر رم رو میگیره :بامزه:

Hamidreza Bozorg
یک شنبه 20 اسفند 1391, 22:26 عصر
از BackGroundWorker که اصلا نمیشه

کسی فرق System.Threading.Timer رو با تایمر معولی میدونه ؟؟؟

youngold
یک شنبه 20 اسفند 1391, 22:52 عصر
دمتون گرم از جواب
اینو بگم که من برنامشو کامل نوشتم

http://barnamenevis.org/showthread.php?379202-%D8%B6%D8%A8%D8%B7-%D9%81%DB%8C%D9%84%D9%85-%D8%A7%D8%B2-%D8%AF%D8%B3%DA%A9%D8%AA%D8%A7%D9%BE

اما تایمر یه خورده دیر و زود عکسارو میگیره برا همینم تداخل بین صدا و فیلم میفته
آقایی که تجربه کافی استفاده صحیح از پردازش و حافظه رو دارید : یکم فکر کن ببین از طرف یک ساعت بخواد فیلم ضبط کنه چقدر رم رو میگیره :بامزه:




اینو بگم که من برنامشو کامل نوشتم

http://barnamenevis.org/showthread.p...AA%D8%A7%D9%BE (http://barnamenevis.org/showthread.php?379202-%D8%B6%D8%A8%D8%B7-%D9%81%DB%8C%D9%84%D9%85-%D8%A7%D8%B2-%D8%AF%D8%B3%DA%A9%D8%AA%D8%A7%D9%BE)
اما تایمر یه خورده دیر و زود عکسارو میگیره برا همینم تداخل بین صدا و فیلم میفتههمون طور که گفتم اگر از رفرنس های موجود استفاده کنی چون با زبان های سی و امثال اون نوشته شده ازین قبیل تاخیر ها کم پیش میاد درچند بعید بدونم اینجا همچین مشکل تاخیری داشته باشید اگر درست عمل کنید و مدیریت حافظه رو هم دقیق تر انجام دادند همچنین ظاهراً مشکل ضعیف بودن سیستم هم داشتید توی تاپیکتون باید گفت روی سیستم های ضعیف تر هم بازده بهتری دارند



آقایی که تجربه کافی استفاده صحیح از پردازش و حافظه رو دارید : یکم فکر کن ببین از طرف یک ساعت بخواد فیلم ضبط کنه چقدر رم رو میگیره :بامزه:شما خوندی من چی نوشتم؟ اگر دسته دسته در حافظه نگه دارید و در دسته های بزرگتر از یک فریم! ذخیره کنید و دسته های جدید جایگزین دسته های قبلی بشه چینین مشکلی ندارین

youngold
یک شنبه 20 اسفند 1391, 23:14 عصر
از BackGroundWorker که اصلا نمیشه

کسی فرق System.Threading.Timer رو با تایمر معولی میدونه ؟؟؟

Windows.Forms System.Timers System.Threading Timer event runs on what thread? UI thread UI or worker thread Worker thread Instances are thread safe? No Yes No Familiar/intuitive object model? Yes Yes No Requires Windows Forms? Yes No No Metronome-quality beat? No Yes* Yes* Timer event supports state object? No No Yes Initial timer event can be scheduled? No No Yes Class supports inheritance? Yes Yes No * Depending on the availability of system resources (for example, worker threads)
http://msdn.microsoft.com/en-us/magazine/cc164015.aspx

Hamidreza Bozorg
یک شنبه 20 اسفند 1391, 23:14 عصر
شما خوندی من چی نوشتم؟ اگر دسته دسته در حافظه نگه دارید و در دسته های بزرگتر از یک فریم! ذخیره کنید و دسته های جدید جایگزین دسته های قبلی بشه چینین مشکلی ندارین
آخه دسته دسته که بخواهد سیو بشه که دوباره همون قدر طول میکشه که !!!


یک کار میشه کرد که هنگامی که داره عکسارو میگیره با یه ترد دیگه عکسا ذخیره بشن
یعنی یه ترد باشه برا عکس انداختن و یه ترد هم باشه برا ذخیره سازی که مشکلی پیش نیاد

این کار جواب میده ؟؟؟

youngold
یک شنبه 20 اسفند 1391, 23:28 عصر
آخه دسته دسته که بخواهد سیو بشه که دوباره همون قدر طول میکشه که !!!


یک کار میشه کرد که هنگامی که داره عکسارو میگیره با یه ترد دیگه عکسا ذخیره بشن
یعنی یه ترد باشه برا عکس انداختن و یه ترد هم باشه برا ذخیره سازی که مشکلی پیش نیاد

این کار جواب میده ؟؟؟


تصور کنید یک بافر دارید وقتی که پر شد حالا باید ذخیره اش کنید، مثلاً هر 100 فریم ذخیره میکنید و از رم خارج میکنید
البته در بین چنج شدن بافر ها یک تاخیری میفته از لحاظ تئوری که برای اون چند تکنولوژی هست
خیلی سر بسته بگم به کا ام پلیر نگاه کنید فکر میکنید چجوری چندین ساعت فیلم رو به اون خوبی نمایش میده!؟
چندین بافر داره و چندین دقیقه پیش روی فیلم رو در خودش نگه میداره ، بافر اول که تموم میشه بافر دوم یعنی چند دقیقه بعدی رو هم آماده داره بعد بافر قبلی خالی میشه و باز میره چند دقیقه بعد از بافر دوم رو میگیره و اینجوری ترکیبی جاشون رو عوض میکنند و تاخیری نمیفته بین چنج شدن ، البته خیلی ساده گفتم


به خاطر داشته باشید که دائم نوشتن روی file stream سی پی یو رو درگیر میکنه و با اینکار شما دارید سی پی یو رو فدای رم میکنید و مسلماً روی سیستم ضعیف باید انتظار تاخیر در پردازش رو داشته باشید!

مشابه همین موضوع رو یکی از دوستان روی تقسیم داده های روی پرت سریال داشت ، به طوری که هر تک بایت رو روی پرت میفرستاد! باز هم میگم : پس باید داده ها رو در حدی در رم پر کنید که ارزش ذخیره پیدا کنند!


شاید اگر وقت امان داد در آینده کتابی در رابطه با الگوریتم های مختلف دسته بندی داده ها بنویسم
نکته بسیار زیاده

Hamidreza Bozorg
یک شنبه 20 اسفند 1391, 23:37 عصر
آقا ممنون
از تجربیاتتون استفاده کردیم
من سعی می کنم پروژم رو فردا بزارم تو سایت تا بهتره بشه در موردش صحبت کرد

فعلا

youngold
یک شنبه 20 اسفند 1391, 23:50 عصر
آخه دسته دسته که بخواهد سیو بشه که دوباره همون قدر طول میکشه که !!!


یک کار میشه کرد که هنگامی که داره عکسارو میگیره با یه ترد دیگه عکسا ذخیره بشن
یعنی یه ترد باشه برا عکس انداختن و یه ترد هم باشه برا ذخیره سازی که مشکلی پیش نیاد

این کار جواب میده ؟؟؟



آخه دسته دسته که بخواهد سیو بشه که دوباره همون قدر طول میکشه که !!!شما باید همه رو هنگام ذخیره در یک یا چند file stream بریزید نه برای هر فریم یک file stream (البته این بستگی داره که بخواید فریم های اون دسته رو مدیریت شده در یک file stream نگه دارید یا همون موقع فریم هایش رو به قطعه فیلم تبدیل کنید و در file stream مختص دسته ذخیره و در آخر این قطعات file stream(که همون دسته فریم ها هستند) رو به هم وصل کنید که البته من حالت اول رو پیشنهاد میکنم) :
در این صورت نه به اندازه هر بار ذخیره روی file stream طول نمیکشه، مطئن باشید نتیجه بهتری میگیرید چون خوندن و نوشتن روی رم خیلی سریعتر و کم هزینه تر از هارد انجام میشه و هر بار باز کردن و نوشتن file stream یک تاخیری داره که بخشیش همیشه ثابته

پس فریم ها در دسته هایی از رم ذخیره و بعد از پر شدن گنجایش مثلاً 100 تا به صورت قطعه فیلم یا غیره روی file stream مجزای اون دسته ذخیره و در پایان file stream این دسته ها به هم وصل میشند

Hamidreza Bozorg
دوشنبه 21 اسفند 1391, 08:50 صبح
آقا دمت
پروژه رو زیر گذاشتم
یه نگاه بنداز ، باهاش 1 دقیقه فیلم میگیری 50 ثانیه ذخیره میکنه !!! :ناراحت:

من زیاد از File Stream سر در نمیارم
یه نگاه بهش بنداز بعد عملی بگو چیکار کنم
واقعا ممنون از راهنماییت

دوستان دیگه هم پروژه رو دانلود کنید از راهی به ذهنتون رسید کمک کنید :گریه:

Hamidreza Bozorg
دوشنبه 21 اسفند 1391, 10:23 صبح
توی این ( http://www.ogre3d.org/addonforums/viewtopic.php?p=29150 ) تایپیک اینو نوشته بود :


texturePtr.GetBuffer().BlitToMemory(pb);
bmpData = bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, bmp.PixelFormat);
Marshal.Copy(bytes, 0, bmpData.Scan0, (int)buffer.SizeInBytes);
bmp.UnlockBits(bmpData);
if (aw == null)
aw = new VirtualStudio.AviWrite(aviFileName, 25, bmp.Height, bmp.Width, bmpData.Stride);
aw.AviAddFrame(bmp);


این کد چیکار میکنه ؟؟؟

youngold
دوشنبه 21 اسفند 1391, 11:43 صبح
توی این ( http://www.ogre3d.org/addonforums/viewtopic.php?p=29150 ) تایپیک اینو نوشته بود :


texturePtr.GetBuffer().BlitToMemory(pb);
bmpData = bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, bmp.PixelFormat);
Marshal.Copy(bytes, 0, bmpData.Scan0, (int)buffer.SizeInBytes);
bmp.UnlockBits(bmpData);
if (aw == null)
aw = new VirtualStudio.AviWrite(aviFileName, 25, bmp.Height, bmp.Width, bmpData.Stride);
aw.AviAddFrame(bmp);


این کد چیکار میکنه ؟؟؟


فریم برداری با استفاده از توابع win32 و حافظه مدیریت نشده که البته کارامد تر هست


چرا از پروژه های آماده استفاده نمیکنید؟
در سایت هایی مثل codeplex.com , codeproject.com جستجو کنید
اگر هدفتون یادگیری هست میتونید با بررسی همون ها به نتیجه برسید ، و فقط سوالاتتون رو اینجا مطرح کنید

Hamidreza Bozorg
دوشنبه 21 اسفند 1391, 13:32 عصر
فریم برداری با استفاده از توابع win32 و حافظه مدیریت نشده که البته کارامد تر هست


چرا از پروژه های آماده استفاده نمیکنید؟
در سایت هایی مثل codeplex.com , codeproject.com جستجو کنید
اگر هدفتون یادگیری هست میتونید با بررسی همون ها به نتیجه برسید ، و فقط سوالاتتون رو اینجا مطرح کنید

اینجوری انعطاف پذیریش بیشتره و هدفم یاد گیری نیست ، می خوام کم کم توسعش بدم
این کلاسی که تو تایپیک بالا نوشته خیلی سرعتش بالا تره و تا 25 فریم برثانیه هم میشه فیلم گرفت
از همون تکنیکی که گفتید استفاده کرده
میاد عکسارو میریزه تو آرایه و با یک بک گراند ورکر ( BackGroundWorker ) دسته جمعی فریم هارو میده به فایل
فقط این که نمیدونم چجوری میشه از کلاس استفاده کرد - درست توضیح نداده !!!
لطفا اگه وقت کردید یه نگاهی بهش بندازید ببین سر در میارید ؟؟؟

با تشکر