Ramtin

آموزش پخش در پس زمینه در ویندوز 10

5 ارسال در این موضوع قرار دارد

سلام وقت بخیر،
از اونجا که برای دوست عزیزمون بهروز برای پخش موزیک یا ویدیو در پس زمینه مشکل ایجاد شده، فکر کردم این آموزش رو بذارم برای دوستانی که مشکلی مشابه دارند.
نکته: من ویژوال استودیو روی کامپیوترم ندارم پس شاید بعضی از کدهام اشتباه تایپی داشته باشند، پس خودتون با Intellisense ویژوال استودیو اون رو درست کنید.
خب پروژه جدیدی از نوع یکپارچه با ورژن SDK نسخه 10.0.14393 به نام WN_BackgroundPlayback ایجاد نمایید. درون این پروژه یک کلاس اضافه کنید و کدهای زیر رو درون اون بنویسید:

using Windows.Media.Playback;
// in code az sample e MS copy shode
namespace WN_BackgroundPlayback
{
    class PlaybackService
    {
    // sakhte intanse az class
        static PlaybackService instance;

        public static PlaybackService Instance
        {
            get
            {
                if (instance == null)
                    instance = new PlaybackService();

                return instance;
            }
        }

    // har appi mitone ye MediaPlayer dashte bashe ke dar tamame safhat mitone azash estefade kone
        public MediaPlayer Player { get; private set; }

        public PlaybackService()
        {
        // yadeton bashe hamishe AutoPlay ro false bezarin ta moshkeli baraton pish nayad
            Player = new MediaPlayer {AutoPlay = false};
        }
    }
}

سپس این کلاس رو ذخیره کنید و آنرا ببندید. 
حال فایل Package.appxmanifest را با CodeViewer باز کنید (اگه اشتباه نکنم روش راست کلیک که کنید دومین گزینه باید این فایل رو بصورت xml براتون باز کنه)
خب اینجا درون تگِ Capabalities کد زیر را بنویسید:

    <uap3:Capability Name="backgroundMediaPlayback" />   

که کد کلی باید بدین صورت باشد:

  <Capabilities>
    <Capability Name="internetClient" />
    <uap3:Capability Name="backgroundMediaPlayback" />
  </Capabilities>

حال صفحه را ذخیره و آنرا ببندید.
درون صفحه MainPage یک کنترل MediaPlayerElement قرار دهید (این کنترل از SDK 14393 به بعد قابل استفاده است!!) و یک دکمه که خاصیت Click را برای آن تعریف کرده باشید اضافه کنید:

<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>

<Button x:Name="btnPlay" Content="Play" Click="btnPlay_Clicked" />
<MediaPlayerElement x:Name="mediaPlayer" Grid.Row="1" AreTransportControlsEnabled="True" AutoPlay="False" />
</Grid>   


     
اکنون صفحه کدنویسی سی شارپ MainPage رو باز کنید و فضای نامی زیر رو به قسمت فضاهای نامی اضافه کنید:
 

using Windows.Media.Playback;


بالای کُنستراکتور (public MainPage...) این کد رو بنویسید:

public MediaPlayer Player => PlaybackService.Instance.Player;

حالا درون کُنستراکتور رویداد loadedـه صفحه را ایجاد نمایید:

        public MainPage()
        {
            InitializeComponent();
            Loaded += MainPage_Loaded;
        }

تابع آن:

        private void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            mediaPlayer.SetMediaPlayer(Player);
        }

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

var item = new MediaPlaybackItem(MediaSource.CreateFromUri(new Uri("http://dl.songdl.xyz/sOng/Album/Saman.Jalili-Ch.Haale.Khoobie/Saman.Jalili_06-Raahat.Maro.mp3")));
Player.Source = item;


دقیقا یادم نیست برای اینکه از اینا استفاده کنید چه فضاهای نامی ای نیاز هست که اضافه کنید. اگر دیدید که رنگ زیر کلمات قرمز شد موس را چند ثانیه روی آن نگه دارید ویژوال استودیو به شما یک لامپ نشان میدهد که چنانچه روی آن کلیک کنید، یک لیست نشان خواهد داد که کزینه اول را در این لیست انتخاب کنید تا فضای نامی به صفحه اضافه شود.
خب تمام شد ! پروژه را اجرا کرده و آنرا امتحان نمایید.

 


نکات اضافی: برای نمایش آهنگ در SMTC نیاز هست که مقدار SMTCـه MediaPlayer را از آن گرفته و آنرا بروز رسانی نمایید.(از اینجا به بعد کپی شده از سورناست!)
برای اینکار کافی است که شما در بالای کنستراکتور کد زیر را بنویسید:

        public SystemMediaTransportControls smtc = null;

سپس درون Loaded کد زیر را بعد از کدی که در بالا نوشتید، درون try..catch بنویسید:

            try
            {
                smtc = Player.SystemMediaTransportControls;
            }
            catch {}

با این کار SMTC پلیر را میگیریم.
حال تابع زیر را جهت بروز رسانی کردن SMTC بنویسید

        public void UpdateSMTC(string singer, string title, string cover)
        {
            if (smtc == null) return;

            smtc.PlaybackStatus = MediaPlaybackStatus.Playing;
            smtc.DisplayUpdater.Type = MediaPlaybackType.Music;

            smtc.DisplayUpdater.MusicProperties.AlbumTitle =
                smtc.DisplayUpdater.MusicProperties.Title = title;

            smtc.DisplayUpdater.MusicProperties.AlbumArtist =
                smtc.DisplayUpdater.MusicProperties.Artist = singer;

            if (!string.IsNullOrEmpty(cover))
                smtc.DisplayUpdater.Thumbnail =
                    RandomAccessStreamReference.CreateFromUri(new System.Uri(cover));

            smtc.DisplayUpdater.Update();
        }

حال درون رویداد کلیک بعد از کد پلی کردن، برای بروز رسانی آهنگ کافیست اینگونه عمل نمایید:

UpdateSMTC("Saman Jalili", "Rahat Maro", "http://dl.songdl.xyz/sOng/Album/Saman.Jalili-Ch.Haale.Khoobie/Saman.Jalili-Che.Haale.Khoobie.jpg");

به همین سادگی!
موفق باشید.

منبع هم که همیشه وین نویس هست!

پسند شده توسط 7 کاربر

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر


ببخشید من یه مشکلی کلا با این Transport Controls دارم اونم اینکه یه بار یکی از کلیداش رو بزنی بعد چند دقیقه دیگه کلا کلید هاش از کار میافته اگه دوباره کلیدی نزده باشی . 

یکم سرچ کردم دیدم با AutoResetEvent و ManualResetEvent انگار باید حلش کرد ولی بازم نتونستم مشکل رو حل کنم . راه حلی داری براش ؟

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
در در 21 تیر 1396 در 02:19، Ramtin گفته است :

سلام وقت بخیر،
از اونجا که برای دوست عزیزمون بهروز برای پخش موزیک یا ویدیو در پس زمینه مشکل ایجاد شده، فکر کردم این آموزش رو بذارم برای دوستانی که مشکلی مشابه دارند.
نکته: من ویژوال استودیو روی کامپیوترم ندارم پس شاید بعضی از کدهام اشتباه تایپی داشته باشند، پس خودتون با Intellisense ویژوال استودیو اون رو درست کنید.
خب پروژه جدیدی از نوع یکپارچه با ورژن SDK نسخه 10.0.14393 به نام WN_BackgroundPlayback ایجاد نمایید. درون این پروژه یک کلاس اضافه کنید و کدهای زیر رو درون اون بنویسید:


using Windows.Media.Playback;
// in code az sample e MS copy shode
namespace WN_BackgroundPlayback
{
    class PlaybackService
    {
    // sakhte intanse az class
        static PlaybackService instance;

        public static PlaybackService Instance
        {
            get
            {
                if (instance == null)
                    instance = new PlaybackService();

                return instance;
            }
        }

    // har appi mitone ye MediaPlayer dashte bashe ke dar tamame safhat mitone azash estefade kone
        public MediaPlayer Player { get; private set; }

        public PlaybackService()
        {
        // yadeton bashe hamishe AutoPlay ro false bezarin ta moshkeli baraton pish nayad
            Player = new MediaPlayer {AutoPlay = false};
        }
    }
}

سپس این کلاس رو ذخیره کنید و آنرا ببندید. 
حال فایل Package.appxmanifest را با CodeViewer باز کنید (اگه اشتباه نکنم روش راست کلیک که کنید دومین گزینه باید این فایل رو بصورت xml براتون باز کنه)
خب اینجا درون تگِ Capabalities کد زیر را بنویسید:


    <uap3:Capability Name="backgroundMediaPlayback" />   

که کد کلی باید بدین صورت باشد:


  <Capabilities>
    <Capability Name="internetClient" />
    <uap3:Capability Name="backgroundMediaPlayback" />
  </Capabilities>

حال صفحه را ذخیره و آنرا ببندید.
درون صفحه MainPage یک کنترل MediaPlayerElement قرار دهید (این کنترل از SDK 14393 به بعد قابل استفاده است!!) و یک دکمه که خاصیت Click را برای آن تعریف کرده باشید اضافه کنید:


<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>

<Button x:Name="btnPlay" Content="Play" Click="btnPlay_Clicked" />
<MediaPlayerElement x:Name="mediaPlayer" Grid.Row="1" AreTransportControlsEnabled="True" AutoPlay="False" />
</Grid>   


     
اکنون صفحه کدنویسی سی شارپ MainPage رو باز کنید و فضای نامی زیر رو به قسمت فضاهای نامی اضافه کنید:
 


using Windows.Media.Playback;


بالای کُنستراکتور (public MainPage...) این کد رو بنویسید:


public MediaPlayer Player => PlaybackService.Instance.Player;

حالا درون کُنستراکتور رویداد loadedـه صفحه را ایجاد نمایید:


        public MainPage()
        {
            InitializeComponent();
            Loaded += MainPage_Loaded;
        }

تابع آن:


        private void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            mediaPlayer.SetMediaPlayer(Player);
        }

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


var item = new MediaPlaybackItem(MediaSource.CreateFromUri(new Uri("http://dl.songdl.xyz/sOng/Album/Saman.Jalili-Ch.Haale.Khoobie/Saman.Jalili_06-Raahat.Maro.mp3")));
Player.Source = item;


دقیقا یادم نیست برای اینکه از اینا استفاده کنید چه فضاهای نامی ای نیاز هست که اضافه کنید. اگر دیدید که رنگ زیر کلمات قرمز شد موس را چند ثانیه روی آن نگه دارید ویژوال استودیو به شما یک لامپ نشان میدهد که چنانچه روی آن کلیک کنید، یک لیست نشان خواهد داد که کزینه اول را در این لیست انتخاب کنید تا فضای نامی به صفحه اضافه شود.
خب تمام شد ! پروژه را اجرا کرده و آنرا امتحان نمایید.

 


نکات اضافی: برای نمایش آهنگ در SMTC نیاز هست که مقدار SMTCـه MediaPlayer را از آن گرفته و آنرا بروز رسانی نمایید.(از اینجا به بعد کپی شده از سورناست!)
برای اینکار کافی است که شما در بالای کنستراکتور کد زیر را بنویسید:


        public SystemMediaTransportControls smtc = null;

سپس درون Loaded کد زیر را بعد از کدی که در بالا نوشتید، درون try..catch بنویسید:


            try
            {
                smtc = Player.SystemMediaTransportControls;
            }
            catch {}

با این کار SMTC پلیر را میگیریم.
حال تابع زیر را جهت بروز رسانی کردن SMTC بنویسید


        public void UpdateSMTC(string singer, string title, string cover)
        {
            if (smtc == null) return;

            smtc.PlaybackStatus = MediaPlaybackStatus.Playing;
            smtc.DisplayUpdater.Type = MediaPlaybackType.Music;

            smtc.DisplayUpdater.MusicProperties.AlbumTitle =
                smtc.DisplayUpdater.MusicProperties.Title = title;

            smtc.DisplayUpdater.MusicProperties.AlbumArtist =
                smtc.DisplayUpdater.MusicProperties.Artist = singer;

            if (!string.IsNullOrEmpty(cover))
                smtc.DisplayUpdater.Thumbnail =
                    RandomAccessStreamReference.CreateFromUri(new System.Uri(cover));

            smtc.DisplayUpdater.Update();
        }

حال درون رویداد کلیک بعد از کد پلی کردن، برای بروز رسانی آهنگ کافیست اینگونه عمل نمایید:


UpdateSMTC("Saman Jalili", "Rahat Maro", "http://dl.songdl.xyz/sOng/Album/Saman.Jalili-Ch.Haale.Khoobie/Saman.Jalili-Che.Haale.Khoobie.jpg");

به همین سادگی!
موفق باشید.

منبع هم که همیشه وین نویس هست!

ممنونم ازت رامتین جان ولی متاسفانه این روش فقط توی ویندوز ده دسکتاپ کاربرد داره و روی ویندوز ده موبایل بی فایده است و من هنوز که هنوزه راه حل مناسبی و ساده ای برای پخش صدا در بکگراند در موبایل پیدا نکردم اگر یه وقت این مورد رو پیدا کردی یه پست بزنی ممنونت میشم. البته نه اون روش فوق پیچیده ای که خود مایکروسافت هم تا حدودی آموزشش رو گذاشته دنبال یه روش ساده مثل همین هستم ولی باز هم اگر بتونی همون روش پیشنهادی مایکروسافت هم به زبون ساده و قابل فهم ارائش بدی که دیگه فوق العاده است.

ویرایش شده در توسط نکوه

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
در 4 ساعت قبل، نکوه گفته است :

ممنونم ازت رامتین جان ولی متاسفانه این روش فقط توی ویندوز ده دسکتاپ کاربرد داره و روی ویندوز ده موبایل بی فایده است و من هنوز که هنوزه راه حل مناسبی و ساده ای برای پخش صدا در بکگراند در موبایل پیدا نکردم اگر یه وقت این مورد رو پیدا کردی یه پست بزنی ممنونت میشم. البته نه اون روش فوق پیچیده ای که خود مایکروسافت هم تا حدودی آموزشش رو گذاشته دنبال یه روش ساده مثل همین هستم ولی باز هم اگر بتونی همون روش پیشنهادی مایکروسافت هم به زبون ساده و قابل فهم ارائش بدی که دیگه فوق العاده است.

سلام،

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

ساده ترین راه هم همینه.

 

موفق باشید.

پسند شده توسط 1 کاربر

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
در 8 ساعت قبل، نکوه گفته است :

ممنونم ازت رامتین جان ولی متاسفانه این روش فقط توی ویندوز ده دسکتاپ کاربرد داره و روی ویندوز ده موبایل بی فایده است و من هنوز که هنوزه راه حل مناسبی و ساده ای برای پخش صدا در بکگراند در موبایل پیدا نکردم اگر یه وقت این مورد رو پیدا کردی یه پست بزنی ممنونت میشم. البته نه اون روش فوق پیچیده ای که خود مایکروسافت هم تا حدودی آموزشش رو گذاشته دنبال یه روش ساده مثل همین هستم ولی باز هم اگر بتونی همون روش پیشنهادی مایکروسافت هم به زبون ساده و قابل فهم ارائش بدی که دیگه فوق العاده است.

این راه اگه جواب نده راهش BackgroundMediaPlayer هستش . باید یک Windows Runtime Component بسازی که به اون مسج بزنی از فورگراند اون اجرا کنی . خواه ناخواه یک مقدار پیچیده هست ذاتاً روشش . در ضمن این روش که رامتین معرفی کرده برای بیلد 14393 به بعد فقط جواب میده البته مطمئن نیستم . تو داکیومنت مایکروسافت فک کنم نوشته بود 14393 میخواد 

ویرایش شده در توسط NGame
پسند شده توسط 2 کاربر

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
مهمان
این موضوع برای عدم ارسال قفل گردیده است.