Windows Phone播放视频流
- 前言
???? MediaElement是Windows Phone中播放本地或者網絡視頻文件和音樂文件的常用控件,支持的格式可以從這里看。通過Play,Pause,Stop,Position方法或屬性可以方便的控制文件的播放暫停或快進。MediaElement包含6種狀態,分別是buffering、opening、playing、closed、stopped、pause。可以通過注冊MediaElement的CurrentStateChanged事件來獲取CurrentState來對UI做出不同的響應。需要注意的是,MediaElement在某些特定狀態下對于API的調用不會立即反應。比如,當MediaElement的狀態在buffering的時候,如果調用Play事件,MediaElement要等到緩沖結束后才能執行Play操作。在這種場景下就需要我們針對特定的CurrentState做出UI上的交互來填補緩沖時間帶來的程序無響應問題。下面就來給出一個XAML的例子。
<MediaElement x:Name="media" Source="xbox.wmv" CurrentStateChanged="media_state_changed" Width="300" Height="300"/>????? Source是控制播放文件路徑的屬性,上面給出一個播放本地文件的例子,也可以指定網絡上的文件路徑。當更改或設置Source的值后,MediaElement的狀態會進入opening,如果設置Source為null,則會進入closed狀態。今天我們重點要說的是,如何使用MediaElement播放網絡的視頻流,即直播的場景。
- MediaStreamSource
??? MediaStreamSource是用于將視頻流直接送入MediaElement的媒體管道中的類,也可以作為用于MediaElement不支持的視頻格式的中轉站。通過MediaElement的SetSource方法指定,SetSource方法也可以用來播放本地的視頻流。為了完成網絡視頻流的轉換等處理,通常我們自定義一個繼承MediaStreamSoure的類,再實現一些必要的方法。比如,OpenMediaAsync、GetSampleAsync、SeekAsync等。下面我們就來看看一個簡單的自定義類實現的步驟。
protected override void OpenMediaAsync() { //描述媒體示例 _mediaSampleAttributes[MediaSampleAttributeKeys.FrameHeight] = _height.ToString(); _mediaSampleAttributes[MediaSampleAttributeKeys.FrameWidth] = _width.ToString(); //描述媒體流 _mediaStreamAttributes[MediaStreamAttributeKeys.Height] = _height.ToString(); _mediaStreamAttributes[MediaStreamAttributeKeys.Width] = _width.ToString(); _mediaStreamAttributes[MediaStreamAttributeKeys.CodecPrivateData] =""; _mediaStreamAttributes[MediaStreamAttributeKeys.VideoFourCC] ="H264"; //詳盡描述媒體流 _mediaStreamDescriptions.Add(new MediaStreamDescription(MediaStreamType.Video, _mediaStreamAttributes)); //描述媒體源 Dictionary<MediaSourceAttributesKeys, string> mediaSourceAttributes =new Dictionary<MediaSourceAttributesKeys, string>(); mediaSourceAttributes[MediaSourceAttributesKeys.CanSeek] ="false"; mediaSourceAttributes[MediaSourceAttributesKeys.Duration] = _duration.ToString(CultureInfo.InvariantCulture); ReportOpenMediaCompleted(mediaSourceAttributes, _mediaStreamDescriptions); }???? 當MediaElement的Source被指定后將進入opening狀體,這時將調用OpenMediaAsync方法。這個方法用來描述將要播放的視頻流的流體,高寬,格式,長短等信息。VideoFourCC屬性代表要播放的流的視頻格式,它是由一個四個字符的字符串指定,比如:"H264","MP43","YV12"等。通過調用ReportOpenMediaCompleted方法告知MediaElement視頻流已經打開可以繼續進行下面的操作。
protected override void GetSampleAsync(MediaStreamType mediaStreamType) { var msd =new MediaStreamDescription(MediaStreamType.Video, _mediaStreamAttributes); //詳盡描述媒體示例 var mediaSample =new MediaStreamSample( msd, _mediaStream, _offect, _count, _timeStamp, _mediaSampleAttributes); ReportGetSampleCompleted(mediaSample); }????? 在MediaStreamSource打開之后,將調用GetSampleAsync方法。上面的代碼通過ReportGetSampleCompleted方法將組織好的視頻流裝入到媒體管道中。如果這個時候視頻流由于網絡原因或者需要轉碼等操作還沒有準備好,那么我們可以調用ReportGetSampleProgress方法來通知MediaElement緩沖的進度,這時MediaElement將進入到buffering狀態,如果當前的CurrrentState是Playing,那么視頻播放將暫停播放進入到buffering狀態。GetSampleAsync方法會被調用多次,直到再次受到來自ReportGetSampleCompleted的視頻流才繼續播放。
protected override void SeekAsync(long seekToTime) {ReportSeekCompleted(seekToTime); }????? 在播放網絡媒體視頻流的過程中常常需要進度條的功能。如果將MediaSourceAttributesKeys.CanSeek的屬性值設成false,那么SeekAsync的參數seekToTime將是0。如果你要實現進度條的功能,那么必須要確保seekToTime的值在視頻的duration之內。如果改觸發了進度,那么我們就需要重新組織視頻流,直到重新調用ReportGetSampleCompleted方法,MediaElement才會繼續播放。
????? 當視頻播放接受后我們需要插入一個空的MediaStreamSample來告知MediaElement視頻播放結束,這時CurrentState將進入到closed狀態。
- 總結
??? 以上我們簡單的介紹了在Windows Phone中播放視頻流的方法,播放音頻流的方法也是如此,需要修改MediaStreamType屬性的值。流的來源可以通過Socket或者Http。格式轉換是一個在視頻播放中很復雜的問題,這里就不進行介紹了,有需要的同學可以留言討論或者自行研究。
?
轉載于:https://www.cnblogs.com/ghostwutao/p/3642464.html
總結
以上是生活随笔為你收集整理的Windows Phone播放视频流的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux中如何查找文件中内容
- 下一篇: HTTP网络协议栈