آموزش قدم به قدم ساخت Video SeekBar

evil_gates

اين نيز بگذرد ...
سلام دوستان :rose:

ظاهرا از عمده مشكلات كاربران براي طراحي يك پلير تو mmb ساخت seekbar هست. گرچه نمونه‌هاي زيادي از seekbar ها تو انجمن وجود داره اما چون دوستان درخواست آموزش اين برنامه رو داشتن سعي ميكنيم قدم به قدم راهنمايي كنيم تا بتونيد يك Video seekbar براي برنامه خودتون بسازيد.

Seekbar چي هست؟ تو برنامه هايي مثل media player يا jet audio حتما ديديد دستگيره اي رو كه با جلو يا عقب كشيدنش فيلم يا فايل صوتي در حال پخش هم به جلو يه عقب منتقل ميشه. به اون دستگيره اصطلاحا seekbar ميگن.

attachment.php


معمولا وقتي قصد داشته باشيم يك برنامه Player شبيه media player ، jetaudio يا ... بسازيم احتياج به seekbar داريم.

البته ميشه با كمك دو تا كليد و استفاده از دستورات ساده FW و BW فيلم در حال پخش رو جلو يا عقب بكشيد اما seekbar علاوه بر زيبايي، برنامه ما رو حرفه اي تر ميكنه.

براي ساخت يك seekbar روشهاي متفاوتي ميتونه وجود داشته باشه. همونطور كه تو مثالهايي كه تو انجمن هست هم اگه دقت كنيد ميبيند كه هر مثال به روشي ساخته شده. البته بعضي از مثال ها ممكنه نواقصي داشته باشه كه اگه آشنايي كامل با مكانيزم seekbar داشته باشيم ميتونيم نواقصش رو رفع و يك نمونه كامل بسازيم.

من يك برنامه پيوست كردم كه شامل يك Video Seekbar هست. تو اين برنامه سعي شده اصول استانداردي براي ساخت seekbar تو اون استفاده بشه. اين اصول استاندارد نانوشته از نظر من رواني و سادگي كدها، انعطاف پذيري كدها براي ساخت seekbarهاي متفاوت، استفاده از كمترين تعداد خطوط براي كدنويسي يك seekbar و بدون مشكل يا پرش كاركردن seekbar ساخته شده هست.

دوستان ميتونن اين برنامه رو از اينجا دانلود كنن و مطابق توضيحاتي كه در ادامه ميدم با يكي از روشهاي ساخت seekbar آشنا بشن.

بهتره قبل از هر چيزي مكانيزم يك seekbar رو بررسي كنيم:

ما يك فيلم در حال پخش داريم و يك منطقه كه نقطه آغاز و پاياني داره. همزمان با پخش فيلم تو اين منطقه يك نوار رنگي در حال تكميل شدن هست. در واقع نوار رنگي از نقطه آغاز به سمت نقطه پايان همزمان با پخش فيلم در حال حركت هست و وقتي فيلم به انتها برسه نوار رنگي هم به نقطه پايان خودش رسيده.

وقتي شما روي نقطه‌اي در فضاي موردنظر درگ ميكنيد و همزمان با حركت ماوس نوار رنگي جابجا ميشه فيلم در حال پخش هم متناسب با اون جلو يا عقب كشيده ميشه دقيقا چه اتفاقي ميفته؟

براي اينكه يك seekbar بسازيم بايد بدونيم:

1- مدت زمان كل فيلم چقدر هست؟
2- الان در چه زماني قرار داريم؟ يعني چه مدت زمان از آغاز فيلم گذشته.
3- نقطه ابتدا و انتهاي seekbar كجاست و چه رابطه اي با مدت زمان فيلم داره؟

اول اختلاف نقطه ابتدايي و انتهايي seekbar رو بدست مياريم تا طول seekbar بدست بياد. مثلا فرض كنيد نقطه آغاز عدد 50 و نقطه پايان عدد 250 باشه.

فضايي كه بين نقطه آغاز و پايان وجود داره كه از اختلاف اين دو عدد بدست مياد يعني 250 – 50 = 200 طول seekbar ما هست.

(همونطور كه ميدونيد مبناي محاسبات در mmb بر اساس pixel هست پس وقتي ميگيم 200 منظورمون 200 پيكسل هست)

بعد از محاسبه طول seekbar بايد طول فيلم رو بر طول seekbar تقسيم كنيم. (براي راحتي انجام محاسبات طول فيلم رو به ثانيه يا ميلي ثانيه بر ميگردونيم و بعد تقسيم بر طول seekbar ميكنيم)

در اينصورت ميتونيم بگيم به ازاي هر پيكسل كه در seekbar جابجا بشيم چند ثانيه تو فيلم بايد به جلو بريم يا عقب برگرديم.

حالا ميتونيم همزمان با شروع پخش فيلم به كمك يك تايمر به ازاي هر x ثانيه اي كه از فيلم طي شد يك پيكسل طول seekbar رو اضافه كنيم تا در انتهاي فيلم seekbar ما هم به نقطه پاياني برسه.

برعكس اين اتفاق هم ممكنه بيفته. يعني همزمان با حركت seekbar و جلو يا عقب كشيده شدنش طول seekbar رو در لحظه جاري بدست بياريم و متناسب با اون بگيم فيلم ما چند ثانيه جلو بره يا عقب برگرده.

فرض كنيد فيلمي داريم به طول 6 دقيقه و 40 ثانيه. اگه طول اين فيلم رو به ثانيه تبديل كنيم ميشه عدد 400

اگه اين عدد رو بر طول seekbar ي كه بالاتر گفتيم كه همون 200 هست تقسيم كنيم به عدد 2 ميرسيم. يعني به ازاي هر يك پيكسل جابجايي در seekbar بايد 2 ثانيه در فيلم جابجا بشيم.

بنابراين اگه طول seekbar در لحظه جاري 10 باشه پس بايد ثانيه 20 فيلم رو نمايش بديم. يا اگه طول seekbar 50 باشه بايد ثانيه 100 (يك دقيقه و 40 ثانيه) فيلم رو نمايش بديم.

به طور كلي اين ايده ما براي ساخت seekbar بود. حالا چطور اين ايده رو به كد تبديل كنيم و تو برنامه قرار بديم؟

در ادامه جزئيات برنامه پيوست شده رو بررسي ميكنيم.
 

پیوست ها

  • p1.jpg
    p1.jpg
    79.7 کیلوبایت · بازدیدها: 791
  • VideoSeekbar.zip
    11.9 کیلوبایت · بازدیدها: 981

evil_gates

اين نيز بگذرد ...
attachment.php


اين برنامه شامل:

يك شي مستطيل به نام seekbar_back براي فضاي پشت زمينه seekbar

يك شي مستطيل نارنجي رنگ به نام seekbar براي نوار رنگي seekbar

يك شي ويدئو براي پخش فيلم موردنظر كه در شروع برنامه مخفي هست.

كليدي به نام OpenVideo براي باز شدن پنجره انتخاب فيلم

كليدهايي به نام Play – Pause – Stop براي پخش يا توقف فيلم

يك شي متني به نام CBK_VTotal براي نمايش مدت زمان كل فيلم

يك شي متني به نام CBK_VTime براي نمايش زمان جاري فيلم

يك شي متني به نام status براي نمايش وضعيت پخش فيلم

و دوتا اسكريپت براي كنترل جريان seekbar

شما ميتونيد اين دو شي مستطيل رو با ابعاد و اندازه‌هاي موردنظر خودتون در جايي كه مايليد استفاده كنيد. فقط يادمون باشه كه نوار رنگيseekbar هميشه در شروع برنامه كمترين مقدار ممكن رو بايد داشته باشه يعني طولش 1 باشه و مكانش هم در ابتداي مستطيل پشت زمينه قرار داشته باشه.

بعد در زمان پخش فيلم به مرور به طول seekbar اضافه ميشه تا حداكثر طول seekbar به اندازه طول مستطيل پشت زمينه برسه. در اين مرحله كه نقطه پاياني seekbar هست فيلم هم خاتمه پيدا كرده.

تو هر بخش از اين كليدها و اسكريپتها دستوراتي نوشته شده كه با كمك هم فيلم موردنظر پخش و توسط seekbar ما جريان پخش فيلم كنترل ميشه.

ابتدا كدهاي Page Start رو بررسي ميكنيم:
کد:
obj$=[COLOR=DarkRed]'seekbar'[/COLOR]
back$=[COLOR=DarkRed]'seekbar_back'[/COLOR]
backX=[COLOR=Blue]ObjectX[/COLOR](back$)
backY=[COLOR=Blue]ObjectY[/COLOR](back$)
backW=[COLOR=Blue]ObjectWidth[/COLOR](back$)
backH=[COLOR=Blue]ObjectHeight[/COLOR](back$)
objX=[COLOR=Blue]ObjectX[/COLOR](obj$)
objY=[COLOR=Blue]ObjectY[/COLOR](obj$)
objW=[COLOR=Blue]ObjectWidth[/COLOR](obj$)
objH=[COLOR=Blue]ObjectHeight[/COLOR](obj$)
من تو خط اول نام مستطيل رنگي seekbar رو تو يك متغير رشته‌اي به نام $obj ميريزم. و تو خط دوم نام مستطيل پشت زمينه seekbar رو تو متغير رشته‌اي ديگه اي به نام $back قرار ميدم. به اين دليل اين عمل رو انجام ميدم تا هرجاي برنامه كه متغير مربوطه رو استفاده كردم درواقع برنامه اون شي رو درنظر بگيره و راحتتر بتونم ازش استفاده كنم.

تو خطوط بعدي به ترتيب:

با تابع ObjectX مختصات x مستطيل پشت زمينه رو تو متغيري به نام backX قرار ميدم.
با تابع ObjectY مختصات y مستطيل پشت زمينه رو تو متغيري به نام backY قرار ميدم.
با تابع ObjectWidth طول مستطيل پشت زمينه رو تو متغيري به نام backW قرار ميدم.
با تابع ObjectHeight عرض مستطيل پشت زمينه رو تو متغيري به نام backH قرار ميدم.
با تابع ObjectX مختصات x نوار رنگي seekbar رو تو متغيري به نام objX قرار ميدم.
با تابع ObjectY مختصات y نوار رنگي seekbar رو تو متغيري به نام objY قرار ميدم.
با تابع ObjectWidth طول نوار رنگي seekbar رو تو متغيري به نام objW قرار ميدم.
و با تابع ObjectHeight عرض نوار رنگي seekbar رو تو متغيري به نام objH قرار ميدم.

اين متغيرها دلخواه هستند و شما ميتونيد هر نام ديگه اي رو براي متغيرها انتخاب كنيد. اما من به اين خاطر تو Page Start برنامه اين كدها رو نوشتم تا بتونم دقيقا از محل قرارگيري و وضعيت طول و عرض نوار پشت زمينه و نوار رنگي seekbar اطلاع داشته باشم.

مقدار اين متغيرها در ادامه به ما كمك ميكنه تا بتونيم seekbar رو كنترل كنيم.

پس برنامه در زمان اجرا ابتدا به كمك اين كدها وضعيت نوارهاي پشت زمينه و seekbar رو بدست مياره و تو متغيرهاي مورد نظر ميريزه و آماده ميشه تا فرامين بعدي رو دريافت كنه.

بعد از اين مرحله بايد به كمك كليد Openvideo فيلم موردنظر رو انتخاب و پخش كنيم. من اين كدها رو تو اين كليد نوشتم:
کد:
[B][COLOR=Navy]OpenFile[/COLOR][/B]("MPEG Files (*.mpg)|*.mpg|All Files|*.*||","*.mpg")
path$=[COLOR=Blue]CBK_OpenFile[/COLOR]
[B][COLOR=Navy]VideoLoad[/COLOR][/B]("Video","path$")
[B][COLOR=Navy]VideoScale[/COLOR][/B]("Video","380,260")
[COLOR=DarkGreen]***********[/COLOR]
[B][COLOR=Navy]MoveObject[/COLOR][/B]("obj$","objX,objY,1,objH")
status$=[COLOR=DarkRed]'Play'[/COLOR]
[B][COLOR=Navy]DisplayValue[/COLOR][/B]("status","status$")
[B][COLOR=Navy]RunScript[/COLOR][/B]("auto_move")
[B][COLOR=Navy]Show[/COLOR][/B]("Video")
[B][COLOR=Navy]VideoPlay[/COLOR][/B]("Video")
تو خط اول با دستور OpenFile امكان انتخاب فيلمي با فرمت mpg رو فراهم كردم. ميتونيد هر فرمت ديگه‌اي كه مدنظرتون هست رو هم به فيلترهاي اين دستور اضافه كنيد.

فايل ويدئويي كه انتخاب ميشه مسيري داره. تو خط بعدي اين مسير رو توسط تابعي به نام CBK_OpenFile تو متغير رشته‌اي به نام $path ثبت ميكنم و با دستور VideoLoad مقدار متغير $path رو كه همون آدرس فيلم موردنظر ما هست رو فراخواني ميكنم.

با دستور VideoScale اندازه‌هاي فيلم موردنظر رو به اندازه دلخواه ميرسونم.

چون اينجا با توجه به فضاي كاري كه در اختيار داريم ابعاد 380 و 260 مطلوب هست من با دستور VideoScale اين فضا رو براي پخش فيلم در نظر ميگيرم. ممكنه ابعاد فيلم اصلي ما بزرگتر يا كوچكتر از اين مقدار باشه كه با توجه به دستور VideoScale تغيير اندازه داده شده و تو اندازه موردنظر اجرا خواهد شد.

تو اين مرحله لازمه نوار رنگي seekbar (كه بعد‌از اين فقط نوار seekbar ميخونيمش) رو به نقطه شروع منتقل كنم.

همونطور كه قبلا هم گفتم در زمان شروع فيلم seekbar بايد در كمترين مقدار ممكن باشه. يعني طولش 1 باشه تا بعد به مرور طول اين نوار افزايش پيدا كنه.

پس با دستور MoveObject نوار seekbar رو منتقل ميكنم به نقطه موردنظر. اين دستور 4 تا پارامتر مختصات x مختصات y طول و عرض شي رو دريافت ميكنه.

در اينجا مختصات x و y نوار seekbar ما تغييري نميكنه. پس همون مقدار متغير objX و objY ميتونه قرار بگيره. بعد به جاي طول نوار عدد 1 رو قرار ميدم و به جاي عرض هم همون مقدار متغير objH رو قرار ميدم.

تو خط بعدي متغير رشته‌اي به نام $status رو در نظر ميگيرم و مقدارش برابر با عبارت Play قرار ميدم.

تو خط بعدي با دستور DisplayValue مقدار اين متغير رو تو شي متني status نمايش ميدم.

تو خط بعدي با دستور Runscript دستوراتي كه تو اسكريپت auto_move نوشته شده رو اجرا ميكنم.

تو خط بعدي با دستور Show شي ويدئو رو كه مخفي بود رو نمايش ميدم.

و تو خط آخر با دستور VideoPlay فيلم رو پخش ميكنم.
 

پیوست ها

  • p2.jpg
    p2.jpg
    186.2 کیلوبایت · بازدیدها: 741
آخرین ویرایش:

evil_gates

اين نيز بگذرد ...
خب تا اينجا فيلم موردنظر انتخاب و پخش ميشه، متناسب با مدت زمان فيلم شي متني كه براي نمايش طول فيلم و زمان جاري بود هم مقداري رو نمايش ميدن و تو شي status هم عبارت Play كه نشان دهنده وضعيت در حال پخش فيلم ما هست نمايش داده ميشه.

دستوراتي كه همزمان با پخش فيلم تو اسكريپت auto_move اجرا ميشن باعث ميشن كه نوار seekbar متناسب با پخش فيلم تكميل بشه. دستورات اين اسكريپت رو بررسي ميكنيم:
کد:
objW=[COLOR=Blue]ObjectWidth[/COLOR](obj$)
[COLOR=Blue]If [/COLOR](objW < backW) [COLOR=Blue]Then[/COLOR]
  [COLOR=Blue]If [/COLOR](status$=[COLOR=DarkRed]'Play'[/COLOR]) [COLOR=Blue]Then[/COLOR]
    objW = objW + 1
    [B][COLOR=Navy]MoveObject[/COLOR][/B]("obj$","objX,objY,objW,objH")
    time = [COLOR=Blue]INT[/COLOR](([COLOR=Blue]CBK_VTotalSec[/COLOR]/backW)*1000)
    [B][COLOR=Navy]ScriptTimer[/COLOR][/B]("TimerA=auto_move","time")
  [COLOR=Blue]Else[/COLOR]
    [B][COLOR=Navy]Return[/COLOR][/B]()
  [COLOR=Blue]End[/COLOR]
[COLOR=Blue]End[/COLOR]
تو خط اول با تابع ObjectWidth طول نوار seekbar رو دريافت ميكنم و تو متغير objW ميريزم. قاعدتا چون در زمان شروع فيلم هستيم اين مقدار هم عدد 1 خواهد بود.

اين عدد به مرور اضافه خواهد شد و تا زماني كه فيلم در حال پخش باشه نوار seekbar هم به طولش اضافه ميشه. اما طول seekbar چقدر ميتونه افزايش پيدا كنه؟

قطعا هرچقدر هم طول seekbar زياد بشه نميتونه از فضاي كل seekbar كه همون مستطيل پشت زمينه هست بيشتر بشه.

بنابراين براي اينكه مطمئن بشيم اشتباهي رخ نميده با يك شرط چك ميكنيم كه آيا طول seekbar از طول فضاي پشت زمينه كوچكتر هست يا نه ؟ !

تو شرط ما مقدار objW كه همون طول seekbar هست با backW كه همون طول مستطيل پشت زمينه هست مقايسه ميشه و اگه شرط صحيح باشه يعني objW < backW باشه دستورات داخل شرط اجرا ميشن.

نكته ديگه‌اي كه بايد تو اين اسكريپت چك كنيم اينه كه آيا فيلم درحال پخش هست يا به هر دليلي عمليات پخش متوقف شده.

اگه فيلم درحال پخش باشه مقدار متغير $status هم بايد مساوي عبارت Play باشه.

پس با يك شرط ديگه چك ميكنيم كه آيا status$ = Play هست يا نه. در صورتي كه شرط صحيح باشه يعني فيلم در حال پخش هست پس ميشه دستورات بعدي رو اجرا كرد وگرنه با دستور Return عمليات اجراي دستورات اين اسكريپت رو متوقف ميكنيم.

اگه شرط صحيح باشه يعني فيلم درحال پخش باشه ابتدا به مقدار متغير objW كه همون طول نوار seekbar‌ هست يك واحد اضافه ميكنم.

بعد دوباره با دستور MoveObject نوار seekbar رو مختصات جديد منتقل ميكنم.

نتيجه اين دستور اينه كه به طول seekbar يك پيكسل اضافه ميشه.

اين چرخه يعني اضافه شدن به طول seekbar بايد تا زماني كه فيلم در حال پخش هست ادامه پيدا كنه. بنابراين با دستور ScriptTimer دستورات اين اسكريپت رو اينقدر تكرار ميكنيم تا شرطهايي كه بالاتر گفتيم نقض بشه.

اما دستور ScriptTimer احتياج به پارامتري داره كه بگه هر چندثانيه يكبار اين دستورات اجراشه بشه.

همونطور كه قبلا هم گفتم از محاسبه اختلاف طول فيلم بر طول seekbar عددي بدست مياد كه ميگه نسبت پخش فيلم با seekbar چي هست و ميتونيم بگيم هرچندثانيه يكبار اين دستورات اجرا بشن تا متناسب با طول فيلم نوار seekbar هم تكميل بشه.

بنابراين قبل از دستور ScriptTimer با استفاده از اين خط اين نسبت رو بدست ميارم و مدت زمان بدست اومده رو تو متغيري به نام time ثبت ميكنم:
کد:
time = [COLOR=Blue]INT[/COLOR](([COLOR=Blue]CBK_VTotalSec[/COLOR]/backW)*1000)
تو اين دستور ابتدا تو پرانتر داخل طول فيلم به ثانيه (توسط تابع CBK_VTotalSec) تقسيم بر backW كه همون طول مستطيل پشت زمينه seekbar بود تقسيم ميشه. و مقدار بدست اومده در عدد 1000 ضرب ميشه تا اين زمان به ميلي ثانيه محاسبه بشه. و در نهايت از اونجايي كه ممكنه حاصل اين ضرب و تقسيم عددي اعشاري بشه با تابع INT بخش اعشاري كه عدد ناچيزي ميشه و تاثيري هم نخواهد داشت رو دور ميريزم و فقط بخش صحيح محاسبات رو تو متغير time ثبت ميكنيم.

حالا ميتونيد با دستور ScriptTimer و مقدار متغير time بگيم دستورات اين اسكريپت هر چند ثانيه يكبار تكرار بشه تا به مرور در طول پخش فيلم نوار seekbar‌ هم تكميل بشه.

چون تو برنامه اي نوشتيم از دوتا ScriptTimer همزمان استفاده خواهيم كرد بنابراين براي اجراي دستورات اين اسكريپت من از TimerA استفاده كردم تا خللي در انجام عمليات موازي پيش نياد.
 

evil_gates

اين نيز بگذرد ...
تا اينجا فيلم موردنظر پخش ميشه و متناسب با پخش فيلم نوار seekbar‌ هم به طور خودكار تكميل ميشه.

حالا نوبت اينه كه دستوراتي كه به طور دستي seekbar رو جابجا ميكنن رو بررسي كنيم.

من بايد بتونم وقتي روي نقطه‌اي در مستطيل پشت زمينه seekbar درگ كردم نوار seekbar به نقطه موردنظر جابجا بشه يعني طولش زياد يا كم بشه و متناسب با اون فيلم هم به جلو بره يا عقب برگرده.

بنابراين من ابتدا تو خود مستطيل پشت زمينه اين دستورات رو مينويسم:
کد:
[COLOR=Blue]If [/COLOR](status$<>'') [COLOR=Blue]Then[/COLOR]
  [B][COLOR=Navy]ScriptTimer[/COLOR][/B]("TimerB=manual_move","0")
[COLOR=Blue]End[/COLOR]
دقت كنيد كه من اين كد رو در حالت Mouse Down نوشتم يعني زماني كه كليك ماوس فشرده شده نه زماني كه رها شده.

اين كد در واقع يك شرط ساده هست كه وضعيت پخش فيلم رو بررسي ميكنه. اگه فيلمي براي پخش انتخاب نشده باشه يا فيلم Stop شده باشه يا به هر دليل ديگه‌اي مقدار $status كه نشان دهنده وضعيت فيلم هست تهي باشه بنابراين نبايد seekbar هم جابجا بشه.

پس با اين شرط من ميگم اگه ' ' <> $status هست يعني داخل اين متغير حتما مقداري وجود داره. پس دستورات اسكريپت manual_move رو اجرا كن.

و البته چون موازي با اين اسكريپت دستورات اسكريپت auto_move هم اجرا ميشه از TimerB براي اين اسكريپت استفاده ميكنم.

اما دستورات اسكريپت manual_move چي هست؟
کد:
backX2 = backX + backW
x1 = [COLOR=Blue]Mou***[/COLOR]()
x2 = x1
[COLOR=Blue]If [/COLOR]( x2 < backX) [COLOR=Blue]Then[/COLOR]
  x2 = backX
[COLOR=Blue]End[/COLOR]
[COLOR=Blue]If [/COLOR]( x2 > backX2) [COLOR=Blue]Then[/COLOR]
  x2 = backX2
[COLOR=Blue]End[/COLOR]
[B][COLOR=Navy]MoveObject[/COLOR][/B]("obj$","objX,objY,x2-backX,objH")
param=[COLOR=Blue]INT[/COLOR](((x2-backX)*(([COLOR=Blue]CBK_VTotalSec[/COLOR]/100)*(100/backW))+1)*1000)
mouse_status = [COLOR=Blue]MouseLButton[/COLOR]()
[COLOR=Blue]If [/COLOR](mouse_status=0) [COLOR=Blue]Then[/COLOR]
  [B][COLOR=Navy]VideoRewind[/COLOR][/B]("Video","param")
  [B][COLOR=Navy]ScriptTimer[/COLOR][/B]("TimerA=auto_move","0")
  Return()
[COLOR=Blue]End[/COLOR]
[B][COLOR=Navy]ScriptTimer[/COLOR][/B]("TimerB=manual_move","0")
اول بايد نقطه ابتدايي و انتهايي seekbar رو بدست بيارم.

اگه نقطه ابتدايي يا مختصات x نوار مستطيل پشت زمينه رو با طولش جمع كنيم نقطه انتهايي هم بدست مياد.

بنابراين من تو خط اول مقدار backX رو كه همون مختصات x مستطيل پشت زمينه هست رو با backW كه طول مستطيل پشت زمينه هست جمع ميكنم و نتيجه رو تو متغيري به نام backX2 ميريزم.

مثلا اگه مختصات x ما 1 و طول مستطيل ما 50 باشه مختصات نقطه x2 عدد 51 خواهد شد. پس نقطه ابتدايي 1 و نقطه انتهايي 51

تو خط دوم به كمك تابع Mou*** مختصات x ماوس رو بدست ميارم و تو متغيري به نام x1 ميريزم. و تو خط بعد متغير ديگه‌اي به نام x2 در نظر ميگيرم و مقدار x1 رو به اون منتقل ميكنم.

اين عمليات رو به اين دليل انجام ميدم تا بتونم در هر لحظه وضعيت ماوس رو داشته باشم.

بعد با دوتا شرط مختصات ماوس رو بررسي ميكنم.

تو شرط اول اگه مقدار x2<backX باشه يعني مختصات ماوس كوچكتر از نقطه ابتدايي seekbar باشه. مقدار backX كه همون نقطه ابتدايي seekbar هست رو تو متغير x2 ميريزم.

تو شرط دوم اگه مقدار x2>backX2 باشه يعني مختصات ماوس بزرگتر از نقطه انتهايي seekbar باشه. مقدار backx2 كه همون نقطه انتهايي seekbar هست رو تو متغير x2 ميريزم.

تو خط بعدي با دستور MoveObject نوار seekbar رو به نقطه بدست اومده منتقل ميكنم.

تو اين دستور پارامتر مختصات x و y نوار seekbar طبق معمول تغييري نميكنه و همون objX و objY كافيه. پارامتر عرض seekbar هم همينطور همون objH قرار ميگيره.

ميمونه پارامتر طول كه بايد مقدار x2 رو از مختصات x مستطيل پشت زمينه كم كنم تا مقدار دقيق مكاني كه ماوس (تو مستطيل پشت زمينه) كليك شده بدست بياد و بشه طول نوار seekbar به همون اندازه افزايش يا كاهش پيدا كنه.

خب تا اينجا نوار seekbar جابجا شد اما بايد متناسب با تغييري كه اين نوار كرده فيلم هم جلو يا عقب بره.

بنابراين بايد نسبت تغييرات طول seekbar رو به طول فيلم و زمان در حال پخش محاسبه كنم و نتيجه در 1000 ضرب كنم و در نهايت با INT بخش صحيحش رو نگه دارم تا بتونم دقيقا بگم اگه مثلا 10 پيكسل به طول نوار seekbar اضافه شد چقدر بايد فيلم جلو بره يا اگه مثلا 50 پيكسل از طول seekbar كم شد فيلم چقدر به عقب برگرده.

من نتيجه اين محاسبه رو تو متغيري به نام param ثبت ميكنم.

تو خط بعدي با تابع MouseLButton وضعيت كليك چپ ماوس رو بررسي ميكنم و نتيجه رو تو متغيري به نام mouse_status ميريزم.

اگه مقدار متغير mouse_status = 0 باشه يعني كليك چپ ماوس كه در حال درگ بود رها شده بنابراين دستورات داخل شرط اجرا ميشه.

داخل شرط با دستور VideoRewind فيلم رو به نقطه اي كه مقدار param تو محاسبات قبلي بدست آورده بود منتقل ميكنم.

چون ماوس رها شده بنابراين بايد مجددا همزمان با پخش فيلم طول نوار seekbar هم به طور خودكار افزايش پيدا كنه پس تو خط بعد با دستور ScriptTimer اسكريپت auto_move رو اجرا ميكنم و با دستور Return انجام عمليات اين اسكريپت رو متوقف ميكنم.

اگه شرط بالا صحيح نباشه يعني كليك چپ ماوس همچنان فشرده شده باشه يعني ما همچنان در حال درگ كردن در فضاي seekbar هستيم پس دستورات شرط ناديده گرفته ميشه و تو خط آخر با دستور ScriptTimer مجددا دستورات همين اسكريپت يعني اسكريپت manual_move اجرا ميشه.
 
آخرین ویرایش:

evil_gates

اين نيز بگذرد ...
هر كليدي كه تو برنامه قرار ميگيره و ميتونه تاثيري بر عمليات seekbar داشته باشه رو بايد با دقت مطالعه كنيم و بگيم مقدار اين تاثيرات چقدر خواهد بود و چطور ميتونيم با كمك اين كليدها seekbar رو هم كنترل كنيم.

كليد Play كه در برنامه قرار داره وظيفش پخش مجدد فيلم در صورتي كه فيلم به هر دليل متوقف شده باشه هست. پس به شكلي ميتونه رو فرايند seekbar هم تاثير گذار باشه.

كليد Pause فيلم رو به طور موقت متوقف ميكنه پس اگه اين كليد فشرده بشه بايد دستورات auto_move كه seekbar رو به طور خودكار تكميل ميكرد متوقف بشه.

يا كليد Stop كه فيلم رو طور كامل متوقف ميكنه كه اگه اين كليد فشرده بشه بايد همه چيز به وضعيت اول برگرده.

يا حتي خود فيلم وقتي به انتها رسيد چه اتفاقي بيفته و چه تاثيري تو seekbar داره؟

من تو كليد Play اين دستورات رو نوشتم:
کد:
[COLOR=Blue]If [/COLOR](path$<>[COLOR=DarkRed]''[/COLOR]) [COLOR=Blue]Then[/COLOR]
  [COLOR=Blue]If [/COLOR](status$<>[COLOR=DarkRed]'Play'[/COLOR]) [COLOR=Blue]Then[/COLOR]
    status$=[COLOR=DarkRed]'Play'[/COLOR]
    [B][COLOR=Navy]DisplayValue[/COLOR][/B]("status","status$")
    [B][COLOR=Navy]ScriptTimer[/COLOR][/B]("TimerA=auto_move","0")
    [B][COLOR=Navy]Show[/COLOR][/B]("Video")
    [B][COLOR=Navy]VideoPlay[/COLOR][/B]("Video")
  [COLOR=Blue]End[/COLOR]
[COLOR=Blue]End[/COLOR]
دستورات اين كليد فقط بايد زماني كه فيلمي انتخاب شده باشه و به هر دليلي متوقف شده باشه اجرا بشه.

بنابراين من اول با يك شرط چك ميكنم كه آيا اصلا فيلمي انتخاب شده براي پخش يا نه؟ در صورتي كه مقدار متغير $path كه همون مسير فايل انتخاب شده ما بود تهي باشه يعني اصلا فيلمي براي پخش انتخاب نشده. پس دستورات داخل شرط اجرا نميشه.

اما اگه اين متغير مخالف تهي باشه پس يعني فيلمي انتخاب شده و حالا نوبت بررسي وضعيت پخش فيلم هست.

اگه فيلم ما در حال پخش باشه دليلي نداره كه دستورات اين كليد اجرا بشه. چون فيلمي كه در حال پخش هست رو كه مجددا پخش نميكنيم.

اگه فيلم به هر دليلي متوقف شده باشه بايد با اين كليد مجددا اون رو پخش كنيم. پس با يك شرط ديگه وضعيت متغير $status رو بررسي ميكنم.

اگه مقدار اين متغير مساوي عبارت Play باشه يعني فيلم در حال پخش هست اما اگه مقدار اين متغير مخالف Play باشه يعني فيلم ما متوقف شده پس دستورات داخل شرط اجرا ميشن.

تو خط اول دستورات داخل شرط من مقدار متغير $status رو مساوي عبارت Play قرار ميدم و اون رو با دستور DisplayValue تو شي متني status نمايش ميدم.

با دستور ScriptTimer اسكريپت auto_move رو كه براي كنترل خودكار seekbar رو اجرا ميكنم و تو خطوط بعدي با دستور Show فايل ويدئويي رو نمايش و با VideoPlay اون رو پخش ميكنم.



كليد Pause براي توقف لحظه اي فيلم در حال پخش استفاده ميشه. دستورات اين كليد شامل:
کد:
status$=[COLOR=DarkRed]'Pause'[/COLOR]
[B][COLOR=Navy]DisplayValue[/COLOR][/B]("status","status$")
[B][COLOR=Navy]VideoPause[/COLOR][/B]("Video")
ابتدا مقدار متغير $status رو نشان دهنده وضعيت فيلم هست رو مساوي عبارت Pause قرار ميدم. و با دستور DisplayValue اين مقدار رو تو شي متني status نمايش ميدم.

بعد با دستور VideoPause فيلم رو متوقف ميكنم.

حتما متوجه شديد كه دليل استفاده از شرط 'staus$='Play تو اسكريپت auto_move براي همين بود كه اگه مقدار اين عبارت مخالف Play هست يعني فيلم متوقف شده و ديگه نبايد دستورات اون اسكريپت اجرا بشه.



كليد Stop براي توقف كامل فيلم در حال پخش و بازگرداندن فيلم به نقطه اول استفاده ميشه. دستورات اين كليد شامل:
کد:
status$=[COLOR=DarkRed]''[/COLOR]
[B][COLOR=Navy]DisplayValue[/COLOR][/B]("status","status$")
[B][COLOR=Navy]MoveObject[/COLOR][/B]("obj$","objX,objY,1,objH")
time$=[COLOR=DarkRed]'00:00:00'[/COLOR]
[B][COLOR=Navy]DisplayValue[/COLOR][/B]("[COLOR=Blue]CBK_VTime[/COLOR]","time$")
[B][COLOR=Navy]VideoStop[/COLOR][/B]("Video")
[B][COLOR=Navy]Hide[/COLOR][/B]("Video")
تو خط اول چون فيلم به طور كامل متوقف شده مقدار متغير $status رو مساوي تهي قرار ميدم و با دستور DisplayValue مقدار اين متغير رو تو شي متني status نمايش ميدم.

چون فيلم بايد به نقطه اول خودش برگرده پس seekbar هم بايد به نقطه ابتدايي برگرده تا تو شروع مجدد از همون نقطه شروع به پخش بشه. پس با دستور MoveObject نوار seekbar رو به نقطه آغاز بر ميگردونم.

ما يك شي متني به نام CBK_VTime داشتيم كه زمان جاري فيلم رو نمايش ميداد. وقتي فيلم به طور كامل متوقف ميشه مقدار اين شي هم بايد صفر بشه بنابراين با يك متغير رشته‌اي به نام $time عبارت 00:00:00 در نظر ميگيرم و با دستور DisplayValue مقدار متغير رو تو شي متني نمايش ميدم.

در نهايت با VideoStop فيلم رو متوقف و با دستور Hide شي ويدئو رو مخفي ميكنم.

وقتي فيلم به انتها ميرسه هم دقيقا بايد همين اتفاقات بيفته يعني فيلم متوقف بشه و به نقطه اول خودش برگرده پس همه دستوراتي كه براي كليد Stop نوشتم رو كپي ميكنم و تو شي ويدئو تو بخش RunScript و تو قسمت OnFinish تكرار ميكنم.



حالا من يك Video Seekbar كامل دارم و ميتونم از اون براي هر نوع برنامه پخش كننده‌اي استفاده كنم.

براي ساخت seekbar روشهاي ديگه اي هم وجود داره كه بنا به دلايلي كه تو پست اول گفتم من اين روش رو انتخاب و راهنماييتون كردم كه چطور يك seekbar بسازيد.

اين seekbar ي كه ساختيم ميتونه ابعاد و محل قرارگيريش متناسب با ميل خودتون تغيير كنه. ميتونيد كليدهاي ديگه اي رو به اين برنامه اضافه كنيد اما باز هم تاكيد ميكنم قبل از اضافه كردن يك كليد يا يك دستور به برنامه به تاثيراتي كه روي seekbar ميزاره دقت كنيد و اون رو تو برنامه لحاظ كنيد.

در پايان اميدوارم اين آموزش مفيد بوده باشه و اگه كاستي تو فرايند اين آموزش مشاهده شد دوستان به بزرگواري خودشون و كم سوادي بنده ببخشن.

موفق باشيد.
:rose:
 

kharazmi

Member
عالی بود ممنون

من هم خیلی دنبال همچین برنامه ای گشتم که درست کار کنه و در عین حال ساده باشه ولی از نمونه ای که توی خود برنامه mmb بود در پروژم استفاده کردم و نتیجه گرفتم ولی نتونستم width سیک بارش را زیاد کنم ...

آموزش شما هم خیلی خوبه ولی حالت "فول اسکرین" رو هم اضافه کنید فکر کنم بهتر باشه
:)
 

evil_gates

اين نيز بگذرد ...
دوست عزيز
منظور ما از اين مبحث فقط seekbar بود كه اميدواريم حاصل شده باشه.

براي ساخت يك پلير كامل نكات زيادي هست كه بايد رعايت بشه كه البته چون اين نكات خيلي ساده هستن و نمونه هاي زيادي هم تو انجمن هست از گفتنش چشم پوشي كرديم.

براي پاسخ سوالتون هم ميتونيد يك كليد به نام fullscreen تو برنامه قرار بديد و اين كد رو بهش اختصاص بديد:

کد:
[COLOR="Navy"][B]VideoParam[/B][/COLOR]("Video","FULLSCREEN = ON")
 

kharazmi

Member
درسته همین کار را کردم البته یک کلید درست کردم که اسکریتی را که کدهای زیر درونش هست را صدا می زنه
کد:
If (GetVideoParam(Video,FULLSCREEN)) Then
  VideoParam("Video","fullscreen=off")
Else
  VideoParam("Video","fullscreen=on")
End

ولی می خواستم زمان لود شدن صفحه فیلمی را که آدرسش در متغیری ذخیره کرده بودم پخش کنه اومدم اسکریپت زیر را در اکشن صفحه قرار دادم تا موقع باز شدن صفحه اجرا بشه
کد:
path$="address film"
VideoLoad("Video","path$")
VideoScale("Video","380,260")

و کدهای زیر را هم در قسمت دکمه play

کد:
MoveObject("obj$","objX,objY,1,objH")
status$='Play'
DisplayValue("status","status$")
RunScript("auto_move")
Show("Video")
VideoPlay("Video")

درست شد ولی یک مشکل کوچیک هست و اونم اینه که وقتی که فیلم در حال پخش هست روی دکمه play کلیک می کنم سیک بار به سر خط می ره ولی فیلم به پخش خودش ادامه میده !

برای این چیکار کنم

ممنون
 

samadionline

Well-Known Member
2 Video Seekbar Pro

سلام به تمام مالتی مدیا کاران عزیز

این هم 2 عدد پروژه Video Seekbar برای شما دوستان عزیز که تمامی مشکلات شما در پخش video رو حل می کنه

موفق و پیروز باشید.
 

پیوست ها

  • 2 Video Seekbar Pro.zip
    326.6 کیلوبایت · بازدیدها: 344
  • Untitled-1.jpg
    Untitled-1.jpg
    36.7 کیلوبایت · بازدیدها: 26
  • Untitled-2.jpg
    Untitled-2.jpg
    26.6 کیلوبایت · بازدیدها: 21

sinafar

New Member
سلام.چگونه می توان قبل از رفتن به صفحه اول یک کلید استارت معکوس درست کرد که همین که سی دی در درایو قرار گرفت شروع به شمارش کند سپس وازد صفحه اول شود؟ ممنون
 

kharazmi

Member
evil_gates خیلی ممنون از بابت همه کمک هاتون از برنامه شما در پروژم استفاده کردم بدون عیب و نقص :rose:

این هم 2 عدد پروژه Video Seekbar برای شما دوستان عزیز که تمامی مشکلات شما در پخش video رو حل می کنه

موفق و پیروز باشید.

جالب بود ولی چطوری می شه Width طول ، seekbar اون برنامه ای که اسمش mmb_vcd_player بود را ، بیشتر کرد ؟؟؟
 

evil_gates

اين نيز بگذرد ...
سلام.چگونه می توان قبل از رفتن به صفحه اول یک کلید استارت معکوس درست کرد که همین که سی دی در درایو قرار گرفت شروع به شمارش کند سپس وازد صفحه اول شود؟ ممنون

دوست عزيز

اول اينكه اين مبحث براي آموزش ساخت seekbar هست لطفا براي سوالتون يك مبحث جديد ايجاد كنيد.

ضمن اينكه لطفا راجع به سوالتون توضيح دقيقتري بديد من كه متوجه منظورتون نشدم تا بتونم راهنمايي كنم.

موفق باشيد.
 

evil_gates

اين نيز بگذرد ...
evil_gates خیلی ممنون از بابت همه کمک هاتون از برنامه شما در پروژم استفاده کردم بدون عیب و نقص :rose:



جالب بود ولی چطوری می شه Width طول ، seekbar اون برنامه ای که اسمش mmb_vcd_player بود را ، بیشتر کرد ؟؟؟

دوست عزيز
اون نمونه برگرفته از همون مثالي هست كه تو مسير نصب نرم افزار mmb قرار داره.
 

samadionline

Well-Known Member
evil_gates خیلی ممنون از بابت همه کمک هاتون از برنامه شما در پروژم استفاده کردم بدون عیب و نقص :rose:



جالب بود ولی چطوری می شه Width طول ، seekbar اون برنامه ای که اسمش mmb_vcd_player بود را ، بیشتر کرد ؟؟؟

دوست عزیز از منوی viwe اول گزینه Dimensions رو فعال کنید.

بعد از گروه slidebar آبجکت TrackBack2 رو انتخاب کنید و از محور w پنجره Dimensions اندازه دلخواه رو بدید
همین تنظیم رو به آبجکت TrackSldr2 بدید.

مشکلی بود بنده در خدمتم
 

kharazmi

Member
آره درسته این نمونه توی سمپل های mmb هم هست و کمی ظاهرش تغییر کرده

دوست عزیز از منوی viwe اول گزینه Dimensions رو فعال کنید.

بعد از گروه slidebar آبجکت TrackBack2 رو انتخاب کنید و از محور w پنجره Dimensions اندازه دلخواه رو بدید
همین تنظیم رو به آبجکت TrackSldr2 بدید.

مشکلی بود بنده در خدمتم

درست شد خیلی ممنون
 

samadionline

Well-Known Member
آره درسته این نمونه توی سمپل های mmb هم هست و کمی ظاهرش تغییر کرده



درست شد خیلی ممنون

این سمپل با اونیکه توی سمپل های مالتی مدیا بیلدر موجود هست کاملا فرق میکنه .

توی این سمپل از یک روش کاملا حرفه ای برای پخش تراک ویدئو استفاده شده.

یکم به سورس دقت داشته باشید خواهید فهمید
 

arshiaaziz2000

New Member
سلام به تمام مالتی مدیا کاران عزیز

این هم 2 عدد پروژه Video Seekbar برای شما دوستان عزیز که تمامی مشکلات شما در پخش video رو حل می کنه

موفق و پیروز باشید.

mmb من ورژن 4.9.8.7 است اگه امکان داره این برنامه را با این ورژن بذارید.
 

جدیدترین ارسال ها

بالا