日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

Windows Phone播放视频流

發(fā)布時(shí)間:2025/5/22 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Windows Phone播放视频流 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
  • 前言

???? MediaElement是Windows Phone中播放本地或者網(wǎng)絡(luò)視頻文件和音樂文件的常用控件,支持的格式可以從這里看。通過Play,Pause,Stop,Position方法或?qū)傩钥梢苑奖愕目刂莆募牟シ艜和;蚩爝M(jìn)。MediaElement包含6種狀態(tài),分別是buffering、opening、playing、closed、stopped、pause。可以通過注冊(cè)MediaElement的CurrentStateChanged事件來獲取CurrentState來對(duì)UI做出不同的響應(yīng)。需要注意的是,MediaElement在某些特定狀態(tài)下對(duì)于API的調(diào)用不會(huì)立即反應(yīng)。比如,當(dāng)MediaElement的狀態(tài)在buffering的時(shí)候,如果調(diào)用Play事件,MediaElement要等到緩沖結(jié)束后才能執(zhí)行Play操作。在這種場(chǎng)景下就需要我們針對(duì)特定的CurrentState做出UI上的交互來填補(bǔ)緩沖時(shí)間帶來的程序無響應(yīng)問題。下面就來給出一個(gè)XAML的例子。

<MediaElement x:Name="media" Source="xbox.wmv" CurrentStateChanged="media_state_changed" Width="300" Height="300"/>

????? Source是控制播放文件路徑的屬性,上面給出一個(gè)播放本地文件的例子,也可以指定網(wǎng)絡(luò)上的文件路徑。當(dāng)更改或設(shè)置Source的值后,MediaElement的狀態(tài)會(huì)進(jìn)入opening,如果設(shè)置Source為null,則會(huì)進(jìn)入closed狀態(tài)。今天我們重點(diǎn)要說的是,如何使用MediaElement播放網(wǎng)絡(luò)的視頻流,即直播的場(chǎng)景。

  • MediaStreamSource

??? MediaStreamSource是用于將視頻流直接送入MediaElement的媒體管道中的類,也可以作為用于MediaElement不支持的視頻格式的中轉(zhuǎn)站。通過MediaElement的SetSource方法指定,SetSource方法也可以用來播放本地的視頻流。為了完成網(wǎng)絡(luò)視頻流的轉(zhuǎn)換等處理,通常我們自定義一個(gè)繼承MediaStreamSoure的類,再實(shí)現(xiàn)一些必要的方法。比如,OpenMediaAsyncGetSampleAsyncSeekAsync等。下面我們就來看看一個(gè)簡(jiǎn)單的自定義類實(shí)現(xiàn)的步驟。

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); }

???? 當(dāng)MediaElement的Source被指定后將進(jìn)入opening狀體,這時(shí)將調(diào)用OpenMediaAsync方法。這個(gè)方法用來描述將要播放的視頻流的流體,高寬,格式,長(zhǎng)短等信息。VideoFourCC屬性代表要播放的流的視頻格式,它是由一個(gè)四個(gè)字符的字符串指定,比如:"H264","MP43","YV12"等。通過調(diào)用ReportOpenMediaCompleted方法告知MediaElement視頻流已經(jīng)打開可以繼續(xù)進(jìn)行下面的操作。

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打開之后,將調(diào)用GetSampleAsync方法。上面的代碼通過ReportGetSampleCompleted方法將組織好的視頻流裝入到媒體管道中。如果這個(gè)時(shí)候視頻流由于網(wǎng)絡(luò)原因或者需要轉(zhuǎn)碼等操作還沒有準(zhǔn)備好,那么我們可以調(diào)用ReportGetSampleProgress方法來通知MediaElement緩沖的進(jìn)度,這時(shí)MediaElement將進(jìn)入到buffering狀態(tài),如果當(dāng)前的CurrrentState是Playing,那么視頻播放將暫停播放進(jìn)入到buffering狀態(tài)。GetSampleAsync方法會(huì)被調(diào)用多次,直到再次受到來自ReportGetSampleCompleted的視頻流才繼續(xù)播放。

protected override void SeekAsync(long seekToTime) {ReportSeekCompleted(seekToTime); }

????? 在播放網(wǎng)絡(luò)媒體視頻流的過程中常常需要進(jìn)度條的功能。如果將MediaSourceAttributesKeys.CanSeek的屬性值設(shè)成false,那么SeekAsync的參數(shù)seekToTime將是0。如果你要實(shí)現(xiàn)進(jìn)度條的功能,那么必須要確保seekToTime的值在視頻的duration之內(nèi)。如果改觸發(fā)了進(jìn)度,那么我們就需要重新組織視頻流,直到重新調(diào)用ReportGetSampleCompleted方法,MediaElement才會(huì)繼續(xù)播放。

????? 當(dāng)視頻播放接受后我們需要插入一個(gè)空的MediaStreamSample來告知MediaElement視頻播放結(jié)束,這時(shí)CurrentState將進(jìn)入到closed狀態(tài)。

  • 總結(jié)

??? 以上我們簡(jiǎn)單的介紹了在Windows Phone中播放視頻流的方法,播放音頻流的方法也是如此,需要修改MediaStreamType屬性的值。流的來源可以通過Socket或者Http。格式轉(zhuǎn)換是一個(gè)在視頻播放中很復(fù)雜的問題,這里就不進(jìn)行介紹了,有需要的同學(xué)可以留言討論或者自行研究。

?

轉(zhuǎn)載于:https://www.cnblogs.com/ghostwutao/p/3642464.html

總結(jié)

以上是生活随笔為你收集整理的Windows Phone播放视频流的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。