日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

视频播放器分析

發布時間:2023/12/18 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 视频播放器分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

視頻播放器分析

?

?????? 當我們進入到視頻網頁,點擊視頻播放或直接點擊本地視頻,會調起視頻播放器。而調起的視頻播放器,我們一般分為系統播放器和QB視頻播放器。


? ? 系統播放器??????????????????????????????????????????????????????????? QB播放器

?

播放器的基本功能有播放/暫停、快進/后退、音量和亮度控制、視頻列表進度條等。我們對播放器的操作是如何實現的呢?答案是播放器內核。

?????? 你可以看到系統播放器和QB播放器的界面明顯不同,那是因為QB播放器采取的是自定義播放器樣式。下面就針對這兩種形式的播放器進行介紹。

?

一、系統播放器

?????? 系統播放器是使用 MediaPlayer.framework中的MPMoviePlayerController?類實現的。該類實例對象可以播放本地或在線視頻,使用MPMediaPlayback協議中的屬性和方法實現視頻的播放/暫停、快進/后退、拖動進度條操作等。下面簡單描述一下播放器的實現邏輯。

1.創建播放器

?引入 MediaPlayer.framework.然后在使用到MPMoviePlayerController 的文件中導入相應的頭文件。?MPMoviePlayerController 類通過一個NSURL來初始化,這個URL可以使本地的,也可以是遠程的。初始化需要通過 initWithContentURL 方法來實現:???

MPMoviePlayerController?*moviePlayer?=?[?[?MPMoviePlayerController?alloc]initWithContentURL: [NSURL?urlWithString:@"http://"]?];//遠程?

?

NSString*?path?=[?NSString?stringWithFormat:@"%@/Documents/video.3gp",NSHomeDirectory()];//地路徑??

MPMoviePlayerController?*moviePlayer?=?[?[?MPMoviePlayerController?alloc]initWithContentURL: [NSURL?fileURLWithPath:path]];//本地的?

2.設置播放器樣式屬性

UI實現這里不做過多描述,有興趣的同學可以去官網查看UIViewController類。

moviePlayer.moviewControlMode?=?MPMovieControlModeDefault;

?

可以使用下列樣式:?



?
屏幕寬高比例

moviePlayer.scallingMode?=?MPMovieScallingModeAspectFit;



?
3.添加通知監控媒體播放控制器狀態

播放器通過使用通知來告知你的應用程序當前視頻的播放狀態。在何時候發送通知,如結束加載內容、技術播放、改變寬高比等。播放器會將事件發送到通知中心,你可以對其進行配置,指定將這些事件轉發到你的應用程序的一個對象。要接收這些通知,需要使用 NSNotificationCenter 類,為播放器添加一個觀察者(observer):?

NSNotificationCenter*?notificationCenter?=?[NSNotificationCenter?defaultCenter];

[?notificationCenter?addObserver:self?selector:@selector(moviePlayerPreloadFinish:)?name:MPMoviePlayerContentPreloadDidFinishNotification?object:moviePlayer?];

通知會發到你指定的委托類和目標方法。通知參數讓你可以知道是哪個事件觸發了委托方法:

-(void)moviePlayerPreloadDidFinish:(NSNotification*)notification{?

//添加你的處理代碼}??

4.播放和停止視頻

播放視頻調用play 方法,播放器會自動將視圖切換到電影播放器并開始播放:

[?moviePlayer?play?];?

當用戶點擊完成按鈕,或者 stop 方法被調用都會停止:

[?moviePlayer?stop?];

當電影停止播放后會自動切回播放前應用程序所在的視圖。?

上述只是系統播放器的簡單邏輯,想了解更多,可以去官網查看MPMoviePlayerController的常用屬性和方法。

?

二、QB播放器

MPMoviePlayerController足夠強大,幾乎不用寫幾行代碼就能完成一個播放器,但是正是由于它的高度封裝使得要自定義這個播放器變得很復雜,甚至是不可能完成。如QB需要自定義播放器的樣式,那么如果要使用MPMoviePlayerController就不合適了,而要對視頻有自由的控制則AVFoundation框架是更好的選擇。它更加接近于底層,所以靈活性也更強:



?
而要理解AVFoundation框架就得說到AVAssetAVAssetAVFoundation框架的主類, 是一個抽象類,理解了它的框架就理解了AVFoundation框架。

1.AVAsset

AVAsset是基于時間的視聽數據(視頻、音頻)的抽象類。下圖列出了其子類,當具體實現一個對象時,就是用到它的子類。



?

一個asset對象包含如下內容。每個AVAssetTrack分別對應asset要展示或處理的內容:音頻、視頻、文本、字幕。所以asset對象提供了多媒體的所有信息:字幕、時長、畫面比例等。在簡單的asset實例中,一個track對應音頻,一個track對應視頻。在復雜的asset實例中,則可能有多個音頻與視頻疊加的track

?

track有多個屬性:類型(音頻/視頻)、音頻/視頻的特性、元數據、時間軸、格式描述數組。

?

?

2. AVPlayer

若要播放asset內容,則必須用到AVPlayer。用這個類的對象來控制asset(音頻/視頻)的播放,如:播放/暫停,定點播放等。使用AVPlayerItem管理asset狀態,AVPlayerItemTrack管理track狀態,使用AVPlayerLayer進行展示。這幾個類的關系可以這么去形容。Asset可以被視為影盤、AVPlayer是放映機、AVPlayerLayer是熒幕。



?
3.播放

總的來說,asset主要有兩種類型,一種是基于文件的(本地文件、媒體庫),另一種是基于流媒體的(HTTP流媒體格式的在線文件)。

本地文件播放的步驟如下。

1.先通過AVPlayerLayerAVPlayer創建播放器對象包括它的UI

2. 使用 AVURLAsset創建asset對象后,創建AVPlayerItem對象并將它與AVPlayer對象聯系起來。

3.當接收到AVPlayerItem的狀態改變的通知時,就變為就緒播放狀態了。

4.接下來的播放操作,通過SynUI來響應對應的事件。

?

在線視頻的播放步驟如下。

1.利用URL來創建AVPlayerItem?對象,將實例與播放器聯系起來,準備播放。

2.當準備播放時,會創建AVAsset??AVAssetTrack?對象。

3.創建監控。用來監控播放器和AVPlayerItem?對象的狀態。當狀態發生改變時,監控器會發送鍵值進行通知。此時必須通過主線程調用相關的函數來更新播放器的展示。

4.對視頻進行播放操作,響應UI事件。關于視頻的播放,可以查看這篇資料https://developer.apple.com/library/prerelease/ios/documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/02_Playback.html#//apple_ref/doc/uid/TP40010188-CH3-SW8

?

下面簡單的說一下自定義瀏覽器里面的某些功能的是如何實現的。

1.播放/暫停

AVPlayer對應著兩個方法playpause來實現。但是關鍵問題是如何判斷當前視頻是否在播放,通常情況下可以通過判斷播放器的播放速度來獲得播放狀態。如果rate0說明是停止狀態,1是則是正常播放狀態。

2.視頻的切換

AVPlayer提供了- (void)replaceCurrentItemWithPlayerItem:(AVPlayerItem *)item方法用于在不同的視頻之間切換(AVFoundation內部還有一個AVQueuePlayer專門處理播放列表切換,有興趣的朋友可以自行研究)。

3.定點播放

拖動視頻時,通過手勢監控,告知時間的變化。因為視頻播放,播放內核會有定時器在時間發生變化的時候通知外層做進度更新。拖動完成時程序會告訴內核需要定位的時間點,實現進度條和畫面同步。

?

針對下面這個bug進行分析。



?
播放進度原理

播放進度在退出播放器時會把當前的播放時間點保存到本地的數據庫中,達到記錄當前播放進度的目的。

?

產生原因:

因為qqv格式播放時切前后臺時是會重新播放的,這時應該是讀取上次播放的歷史記錄,然后跳到該歷史播放時間點。但是原來的邏輯里面沒有存這個歷史記錄,所以就從頭開始播放了。

?

播放器原理學習后的思考:

1、該文只是簡單的描述了一下播放器大概的框架,細枝末節還未弄清楚

2、此文中還存有一些描述不恰當的地方,還需要后期學習更正

3、我們在測試中發現的問題,牽扯到的是各個類中的屬性或方法,每次開發的改動,相同的操作都有可能傳遞不同的值導致邏輯錯誤。

4、播放器的功能其實也就界面中看到的那些,但是這些按鈕響應的事件有著多個不同的值,若要真正最大范圍覆蓋到播放器的所有功能,就需要了解到函數參數的意義,通過不同的操作達到傳遞不同的參數值。


?
?
?
?

總結

以上是生活随笔為你收集整理的视频播放器分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。