2018-04-02

Uwp——NaiveMediaPlayer

一贷揽、整體效果(請原諒我的渣畫質(zhì))

image.png

? ? ? ?這是播放mp4文件的時候,mp3文件的話中間就是白板了,太懶了背景就懶得找圖片放了缴饭。最左邊的+按鈕是打開mp3,mp4文件骆莹,play是控制暫停的颗搂,右邊喇叭是調(diào)節(jié)音量的,雖然設計很反人類……(待會兒你就知道了)
? ? ? ?我用的MediaElement幕垦,不如新版的MediaPlayerElement好用丢氢,我還在其它地方的代碼看到過MediaPlayer聲明變量的,最后又給指定成了MediaPlayerElement智嚷,反正就是亂七八糟的卖丸,我還是用最菜的那個吧纺且。說MediaElement菜是因為相比最新的MediaPlayerElement盏道,播放暫停,還有音量Slider控制都集成在里面了载碌,弱雞MediaElement還得自己定義猜嘱,真的是麻煩(關(guān)鍵我還搞不定)
? ? ? ?上述實現(xiàn)了要求的基本功能,播放mp3嫁艇,mp4文件朗伶,雖然奇丑無比。
作業(yè)鏈接:https://github.com/XuweiC/NaiveUwp

二步咪、思路淺談

? ? ? ?看到這個作業(yè)论皆,毫無疑問的不知從何入手,我知道肯定有相關(guān)的類控件干這個事,但是我連它叫什么名字都不知道……所以就去這么搜Uwp--音樂播放器点晴,然后見識了各種神仙的作品感凤。反正我參考過的鏈接太多了,還有很多重樣的粒督,我是放不過來了陪竿,待會兒就幾個技術(shù)問題放一下參考鏈接吧,應該沒有人……就看三兩個鏈接然后完工的吧屠橄,如果真有的話我敬他/她是條漢子族跛。

①為了解決第一個打開文件的問題,我找到了以下傳送門锐墙。

? ? ? ?第一個鏈接:https://www.cnblogs.com/webabcd/archive/2013/01/24/2874156.html
? ? ? ?文中如是說:重新想象 Windows 8 Store Apps (6) - 控件之媒體控件: Image, MediaElement……balabala
? ? ? ?其實我是不糾結(jié)win8 win10什么的了礁哄,一開始反正什么都不懂,看就行了
? ? ? ?代碼如下:

// 播放本地視頻或音頻
        private async void btnPickFile_Click_1(object sender, RoutedEventArgs e)
        {
            FileOpenPicker picker = new FileOpenPicker();
            picker.SuggestedStartLocation = PickerLocationId.VideosLibrary;
            picker.FileTypeFilter.Add(".wmv");
            picker.FileTypeFilter.Add(".mp4");
            picker.FileTypeFilter.Add(".mp3");
            picker.FileTypeFilter.Add(".wma");
            picker.FileTypeFilter.Add(".png");
            var file = await picker.PickSingleFileAsync();
            if (file != null)
            {
                var stream = await file.OpenAsync(FileAccessMode.Read);
                // 指定需要讓 MediaElement 播放的媒體流
                mediaElement.SetSource(stream, file.ContentType);
            }
        }
// 通過指定一個 url 播放一個網(wǎng)絡視頻
        private void btnPlayUrl_Click_1(object sender, RoutedEventArgs e)
        {
            mediaElement.Source = new Uri("http://media.w3.org/2010/05/sintel/trailer.mp4", UriKind.Absolute);
        }

? ? ? ?基于以上代碼溪北,我寫出了:

 private async void OpenFileButton_Click(object sender, RoutedEventArgs e)
        {
            FileOpenPicker picker = new FileOpenPicker();
            picker.SuggestedStartLocation = PickerLocationId.VideosLibrary;
            picker.FileTypeFilter.Add(".mp4");
            picker.FileTypeFilter.Add(".mp3");
            var file = await picker.PickSingleFileAsync();
            if (file != null)
            {
                var stream = await file.OpenAsync(FileAccessMode.Read);
                // 指定需要讓 MediaElement 播放的媒體流
                mediaElement.SetSource(stream, file.ContentType);
            }
            mediaElement.Play();
        }

? ? ? ?對我什么都沒干姐仅,就把文件后綴名改掉了,同時忽視了url播放網(wǎng)絡視頻刻盐,因為添加源就可以了掏膏,我們要Naive一點的,就播放本地視頻吧敦锌。

②為了解決第二個播放控制問題馒疹,我參考了以下鏈接。

? ? ? ?我是真的服氣乙墙!MediaElement真是廢物颖变!好了吐槽完了,我們來說說播放控制吧听想,因為上述過程結(jié)束之后需要一個簡易的播放暫停按鈕啊腥刹,再Naive也得要這個吧!所以我就在這條路上越走越遠汉买,什么音量了衔峰,滑塊了,神煩蛙粘。
第二道傳送門:https://blog.csdn.net/linwh8/article/details/70314698
以及? ? ? ?? ? ? ?? ?https://www.cnblogs.com/tianma3798/p/5928217.html
? ? ? ?第一個鏈接中代碼如下

private void pause_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                if (_mediaTimelineController.State == MediaTimelineControllerState.Running)
                {
                    EllStoryboard.Pause();
                    _mediaTimelineController.Pause();
                }
                else
                {
                    //EllStoryboard.Resume();
                    EllStoryboard.Begin();
                    _mediaTimelineController.Resume();
                }
            }
            catch
            {

            }
        }

        private void start_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                DispatcherTimer timer = new DispatcherTimer();
                timer.Interval = TimeSpan.FromSeconds(1);
                timer.Tick += timer_Tick;
                timer.Start();
                EllStoryboard.Begin();
                _mediaTimelineController.Start();
            }
            catch {

            }

        }

? ? ? ?部分變量的解釋我放在這里:

public sealed partial class MainPage : Page
    {
        MediaPlayer _mediaPlayer = new MediaPlayer();
        MediaTimelineController _mediaTimelineController = new MediaTimelineController();
        TimeSpan _duration;
        // MediaPlaybackSession _mediaPlaybackSession = new MediaPlaybackSession();
        public MainPage()
        {
            this.InitializeComponent();
            var mediaSource = MediaSource.CreateFromUri(new Uri("ms-appx:///Assets/Video1.MP4"));
            mediaSource.OpenOperationCompleted += MediaSource_OpenOperationCompleted;
            _mediaPlayer.Source = mediaSource;
            _mediaPlayer.CommandManager.IsEnabled = false;
            _mediaPlayer.TimelineController = _mediaTimelineController;
            //_mediaPlayer.Play();
            _mediaPlayerElement.SetMediaPlayer(_mediaPlayer);
        }

? ? ? ?所以我理所當然的沒學會垫卤,他用的就是上述我提到的mediaplayer,然后
_mediaPlayerElement.SetMediaPlayer(_mediaPlayer);……不提了不提了出牧,都是淚穴肘。
然后我又找到了第二個鏈接,代碼如下:

private void button_Click(object sender, RoutedEventArgs e)
{
    if (button.Content.ToString() == "播放")
    {
        button.Content = "暫停";
        mediaElement.Play();
    }
    else
    {
        button.Content = "播放";
        mediaElement.Pause();
    }
}

? ? ? ?于是就有了我作業(yè)里的:

 private void PlayButton_Click(object sender, RoutedEventArgs e)
        {
            if (PlayButton.Content.ToString() == "Play")
            {
                PlayButton.Content = "Pause";
                mediaElement.Play();
            }
            else
            {
                PlayButton.Content = "Play";
                mediaElement.Pause();
            }
        }

? ? ? ?盡管這樣還會有一個小bug舔痕,我測試的時候先點的+打開一個文件评抚,然后按鈕還是Play豹缀,點一下,沒反應慨代,再點一下耿眉,才能暫停,好了這個問題我們先不談了鱼响。(MediaPlayerElement你是真的賴皮)

③音量控制問題

? ? ? ?顯然鸣剪,MediaElement并沒給配音量調(diào)節(jié),所以為了解決這個問題丈积,我第一個想到的是筐骇,我得做一個Slider,通過數(shù)據(jù)綁定讓音量隨滑塊值的變化而變化江滨,而且點擊喇叭之后出現(xiàn)滑塊铛纬,也就是可以用一個flyout。
? ? ? ?理想當然豐滿唬滑,結(jié)果是我做了一個反人類的音量調(diào)節(jié)器……flyout也由于沒有搞定滑塊數(shù)據(jù)綁定而無心再弄告唆,以及被MediaPlayerElement氣得半死。
? ? ? ?我的音量調(diào)節(jié)功能是我自己瞎搗鼓的晶密,代碼如下:

public void Volumn_ValueChanged(object sender, RoutedEventArgs e)
       {
           
       }
       private void VoiceButton_Click(object sender, RoutedEventArgs e)
       {
           mediaElement.Volume = Volumn.Value;
           //mediaElement.Volume = {Binding value, ElementName=Volumn};
       }

? ? ? ?你一眼就能看到我把音量調(diào)節(jié)放在了Click里擒悬,也就是說拖動滑塊,然后點擊那個喇叭稻艰,然后就完成了音量調(diào)節(jié)功能了懂牧,本來這里應該放置靜音功能的。結(jié)果調(diào)節(jié)沒搞成尊勿,然后就成這樣了僧凤。
? ? ? ?以下是我在搜集資料時候參考的部分鏈接: uwp開發(fā):Slider控件和MediaElement綁定,實現(xiàn)拖動播放元扔。
哼躯保,你說為什么沒有Slider&音量控制這個選項?因為MediaPlayerElement已經(jīng)完成這件事了澎语!倒是進度條拖動控制視頻播放進度的東西有一堆途事,用的是一個叫做轉(zhuǎn)換器的東西。
? ? ? ?參考代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.UI.Xaml.Data;

namespace Homework8.Converter
{
    class timeLineConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, string language)
        {
            return ((TimeSpan)value).TotalSeconds;
        }

        public object ConvertBack(object value, Type targetType, object parameter, string language)
        {
            return TimeSpan.FromSeconds((double)value);
      }
    }
}

? ? ? ?總結(jié):在實現(xiàn)Naive播放器的時候咏连,我遇到的就是以上幾個問題盯孙,MediaPlayerElement選手們,嫉妒使我面目猙獰祟滴。這告訴我們以后要實現(xiàn)什么功能的時候要去找找那些主流的控件/工具,這能省大力氣歌溉!其實一個用戶交互體驗好垄懂,干凈骑晶、功能齊全的音樂播放器還是挺復雜的,這次我對那些控件的使用有了更多的理解草慧,參考官方文檔也能學到很多東西桶蛔,比如:
? ? ? ?https://docs.microsoft.com/zh-cn/windows/uwp/design/controls-and-patterns/media-playback

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市漫谷,隨后出現(xiàn)的幾起案子仔雷,更是在濱河造成了極大的恐慌,老刑警劉巖舔示,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碟婆,死亡現(xiàn)場離奇詭異,居然都是意外死亡惕稻,警方通過查閱死者的電腦和手機竖共,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來俺祠,“玉大人公给,你說我怎么就攤上這事≈┰” “怎么了淌铐?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蔫缸。 經(jīng)常有香客問我匣沼,道長,這世上最難降的妖魔是什么捂龄? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任释涛,我火速辦了婚禮,結(jié)果婚禮上倦沧,老公的妹妹穿的比我還像新娘唇撬。我一直安慰自己,他們只是感情好展融,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布窖认。 她就那樣靜靜地躺著,像睡著了一般告希。 火紅的嫁衣襯著肌膚如雪扑浸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天燕偶,我揣著相機與錄音喝噪,去河邊找鬼。 笑死指么,一個胖子當著我的面吹牛酝惧,可吹牛的內(nèi)容都是我干的榴鼎。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼晚唇,長吁一口氣:“原來是場噩夢啊……” “哼巫财!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起哩陕,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤平项,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后悍及,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體闽瓢,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年并鸵,在試婚紗的時候發(fā)現(xiàn)自己被綠了鸳粉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡园担,死狀恐怖届谈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情弯汰,我是刑警寧澤艰山,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站咏闪,受9級特大地震影響曙搬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鸽嫂,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一纵装、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧据某,春花似錦橡娄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至筷狼,卻和暖如春瓶籽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背埂材。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工塑顺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人楞遏。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓茬暇,卻偏偏與公主長得像首昔,于是被迫代替她去往敵國和親寡喝。 傳聞我的和親對象是個殘疾皇子糙俗,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容