PDA

View Full Version : مشکل در نمایش avi با DirectShow



sh_roohani
چهارشنبه 22 تیر 1384, 13:25 عصر
سلام،
من مطابق مستندات DirectShow 8.1 یه فیلترگراف می سازم و سعی می کنم باهاش یه فایل avi رو نمایش بدم. البته با IVideoWindow یه پنجره نمایش هم تخصیص می دم. اما بعد از صدا کردن تابع IMediaControl::Run تا وقتی پنجره رو یکی دو بار با ماوس حرکت ندم، چیزی روی پنجره نمایش داده نمی شه!!! فکر کردم شاید نیاز به یه refresh داشته باشه (هر چند که توی مستندات DirectShow همچین چیزی رو ننوشته). بنابراین از UpdateWindow و حتی از InvalidateRect استفاده کردم. ولی فایده ای نداشت.
کسی تا حالا به همچین مشکلی برخورده؟ می دونین اشکالش چی ممکنه باشه؟

Blaster
چهارشنبه 22 تیر 1384, 17:51 عصر
SH جان شما همون تاپیکهایی رو میری که من دوست دارم.
قبل از هر چیزی شما نباید از UpdateWindow و InvalidateRect استفاده کنید چون DirectShow پیام WM_PAINT رو خودش پردازش می کنه!
من روال کلی رو می گم شما ببین کجایه کار تون فرق می کنه.
بعد از IGraphBuilder::RenderFile شما باید یک Pointer به IVideoWindow رو از GraphBuilder بگیرین.
پنجره مورد نظر که معمولا یک Picture هست رو مشخص می کنید و HWND اون رو به تابع IVideoWindow:: put_Owner ارسال می کنید .
WindowStyle رو با استفاده از تابع put_WindowStyle به WS_CHILD | WS_CLIPSIBLINGS
ست می کنید .
طول و عرض IVideoWindow رو با تابع SetWindowPosition به اندازه PictureBox یا بخشی از اون ست می کنید .
با تابع IVideoWindow:: put_Visible اون رو Visible می کنید. البته می دونید که میشه WS_VISIBLE رو بجای فراخوانی این تابع در WindowStyle هم جا داد .
IMediaControl::Run هم که پایان عملیات هست .
فکر می کنم همین ها باشه !

sh_roohani
چهارشنبه 22 تیر 1384, 18:19 عصر
Blaster جان ممنون.
اما تنها مسئله ای که اینجا شک برانگیزه اینه که تو مثالی که با مستندات DirectShow میاد اشاره ای به IVideoWindow:: put_Visible(OATRUE) یا WS_VISIBLE نشده، فقط IVideoWindow:: put_Visible(OAFALSE) برای پایان کار مورد اشاره قرار گرفته. تازه من هر دو تای این موارد، یعنی IVideoWindow:: put_Visible و WS_VISIBLE، رو قبلا امتحان کردم. رضایت نمی ده که نمی ده!
اون UpdateWindow و InvalidateRect رو هم واقعا دیگه از سر استیصال امتحان کردم. این اشکال لعنتی حدود یک هفته یا بیشتره که پیشرفت کار منو متوقف کرده و دیگه به هر ریسمانی چنگ می زنم!

Blaster
چهارشنبه 22 تیر 1384, 22:41 عصر
چرا با DirectX 9 سعی نمی کنید ؟ DirectShow اونجا خیلی بهبود پیدا کرده.

sh_roohani
پنج شنبه 23 تیر 1384, 10:43 صبح
راستش این مشکل روی یه ماشین ویندوز 98 پیش نمیاد، ولی روی ویندوز 2000 پیش میاد. شاید هم مشکل از پیکربندی ماشین من باشه. حالا DirectX 9 رو نصب میکنم، شاید اشکال رفع بشه.

sh_roohani
پنج شنبه 23 تیر 1384, 10:58 صبح
آقا یه مشکل جدید! DirectX 8.1 حالا uninstall نمی شه! می گه «String ERROR_DSETUP was not found in string table». بعدشم می گه «ERROR_DSETUP» !!! حالا با این یکی چیکار کنم؟! چه جوری DirectX 9.0 رو نصب کنم؟ یعنی باید برم تو رجیستری هر چی راجع به DirectX 8.1 هست دستی حذف کنم؟ )-:
بعضی وقتا فکر می کنم بیخود می گن ویندوز سیستم عامل راحتیه. با اینهمه دردسرهای هرروزه که پیش میاد، لینوکس که خیلی راحت تر از این حرفاس!

sh_roohani
پنج شنبه 23 تیر 1384, 12:50 عصر
هیچ فرقی نکرد!
بالاخره مجبور شدم Directx 9.0 رو در کنار DirectX 8.1 نصب کنم. دایرکتوری های ++Visual C رو هم طوری تنظیم کردم که با DirectX 9.0 پروژه رو کامپایل کنه. بیشتر وقتا درست کار می کنه، بعضی وقتا هم نه. )-:

Blaster
پنج شنبه 23 تیر 1384, 17:05 عصر
خوشبختانه من تا حالا با این مشکلات برخورد نکردم .
راستی خاصیت AutoShow پنجره مورد نظر رو ست کردین ؟
یه چیز دیگه هم هست ، اگه از MFC استفاده می کنید برای WM_ERASEBKGND یک Handle خالی تعریف کنید . البته توی اون پنجره ای که کل Message های Thread رو دریافت می کنه !