本文講解的是 iOS 視頻播放, 支持本地,在線播放. 進(jìn)度拖動(dòng),精準(zhǔn)跳轉(zhuǎn),獲取視頻的長度等問題
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡(jiǎn)單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:主機(jī)域名、網(wǎng)站空間、營銷軟件、網(wǎng)站建設(shè)、通許網(wǎng)站維護(hù)、網(wǎng)站推廣。
demo 記得點(diǎn)亮 star. 3Q
iOS 視頻播放主要使用的類 AVPlayerItem,AVPlayerLayer,AVPlayer
AVPlayerItem: 提供視頻信息, 利用視頻的 url 創(chuàng)建一個(gè)對(duì)象.利用 kvo 監(jiān)聽 status,可以獲取當(dāng)前視頻的狀態(tài).
AVPlayer: 就類似視頻的控制者. 可以用來控制視頻的播放,暫停,跳轉(zhuǎn)等. 它的創(chuàng)建依賴于AVPlayerItem
AVPlayerLayer: 用于視頻的顯示. 可以理解成一個(gè) view. 它的創(chuàng)建依賴于AVPlayer
簡(jiǎn)單總結(jié): AVPlayer控制視頻狀態(tài), AVPlayerLayer用于顯示,AVPlayerItem提供視頻信息
獲取視頻的長度 s
視頻精準(zhǔn)跳轉(zhuǎn).拖動(dòng) UISlider,監(jiān)聽 value 改變方法如下:
//為什么timescale要設(shè)置成 600 CMTime教程
最近工作之余, 寫了一個(gè)視頻播放器,輸入要播放的視頻資源地址,即可實(shí)現(xiàn)播放功能。
目前功能比較簡(jiǎn)單,支持鎖屏、屏幕旋轉(zhuǎn)等基礎(chǔ)功能,后續(xù)會(huì)繼續(xù)完善。。。
下面講解下實(shí)現(xiàn)思路:
因 MediaPlayer/MediaPlayer.h 中 MPMoviePlayerController MP_DEPRECATED("Use AVPlayerViewController in AVKit.", ios(2.0, 9.0)) 在iOS9以后已經(jīng)廢棄,為了更好的兼容性,采用了 AVFoundation/AVFoundation.h 為技術(shù)實(shí)現(xiàn)方案。
框架在此就不講解了,官網(wǎng)講的比較清楚,不懂的可以查看官檔。 - 戳這里
監(jiān)聽視頻資源的加載狀態(tài), 根據(jù)不同的狀態(tài)進(jìn)行相應(yīng)的操作。
更新視頻資源的播放進(jìn)度。
實(shí)現(xiàn)控制視圖 QYPlayerControlView 的Delegate。 當(dāng)控制視圖進(jìn)行了相應(yīng)操作,事件被傳遞到該類中進(jìn)行統(tǒng)一處理。
該類中還有對(duì)操作視圖 顯示/隱藏 的方法。
后續(xù)調(diào)整視頻亮度、音量、進(jìn)度等手勢(shì)都需添加在該分類中,便于統(tǒng)一管理。
主要存放時(shí)間轉(zhuǎn)換的分類 NSString+Custom 、常用宏 QYPlayerDefine 等工具類。
1). BaseViewController 中實(shí)現(xiàn)了控制屏幕旋轉(zhuǎn)的系統(tǒng)方法,實(shí)現(xiàn)的控制器要繼承自 BaseViewController 。
2). 在子控制器中實(shí)現(xiàn)如下方法。
此時(shí)屏幕旋轉(zhuǎn)功能已經(jīng)添加成功!
以上便是整個(gè)播放器的源碼解析,具體的細(xì)節(jié)請(qǐng)查看源碼。
源碼放在GitHub上了,想查看的小伙伴可以 -戳這里。
千里之行,始于足下。
快進(jìn):AVPlayer .rate 1
慢放: 0 AVPlayer .rate 1
快退: AVPlayer .rate 0 (m3u8 不能快退)
MP4:如果快進(jìn)到了緩存不夠的地方:KVC監(jiān)聽 AVPlayerItem .isPlaybackBufferEmpty = yes
快退到頭會(huì)走通知AVPlayerItemDidPlayToEndTimeNotification
m3u8(靜態(tài)):快進(jìn)與MP4格式視頻一致,可以10倍 20倍播放。
m3u8(動(dòng)態(tài)):快進(jìn)到了緩存不夠的地方,會(huì)走通知AVPlayerItemDidPlayToEndTimeNotification。
備注:使用[AVPlayerItem stepByCount:-24];
將AVPlayerItem 向前或向后移動(dòng)指定的步數(shù),正數(shù)前進(jìn),負(fù)數(shù)后退。 每個(gè)步數(shù)的大小取決于AVPlayerItem啟用的AVPlayerItemTracks對(duì)象;
注冊(cè)監(jiān)聽和通知
如何將視頻添加上自定義的渲染效果,并顯示?
1、解碼視頻
2、獲取視頻幀
3、渲染視頻幀
4、顯示渲染后的視頻幀
5、編碼視頻幀,生成新的視頻
AVPlayer:驅(qū)動(dòng)播放用例的中心階層,是用于管理媒體資產(chǎn)的回放和定時(shí)的控制器對(duì)象
這里AVPlayer,我制作簡(jiǎn)單的播放,暫停,seek。并且添加上AVPlayerItemVideoOutput做一個(gè)視頻幀輸出的工作。
創(chuàng)建一個(gè)播放器
AVPlayerItemVideoOutput 獲取視頻幀
主要的核心工具是 AVPlayerItemVideoOutput ,這對(duì)象相當(dāng)于一個(gè)視頻解碼工具,對(duì)它進(jìn)行屬性設(shè)置,可以獲取視頻中某一時(shí)刻的想要數(shù)據(jù)的 CVPixelBuffer 視頻幀。
通過獲取到的CVPixelBuffer,進(jìn)行OPenGL自定義渲染顯示。
外部需要開啟一個(gè)定時(shí)器,來實(shí)時(shí)的進(jìn)行畫面的刷新。定時(shí)器時(shí)間可以根據(jù)視頻的FPS來控制。
至此如何獲取視頻幀就可以了。
如何獲取視頻幀,這里都比較簡(jiǎn)單,都是通過系統(tǒng)層去實(shí)現(xiàn)功能。
主要注意的是:
1、AVPlayerItemVideoOutput的獲取的數(shù)據(jù)格式定義,根據(jù) 需求設(shè)置RGBA還是YUV420的數(shù)據(jù) 。
2、AVPlayer使用seek時(shí)候,使用 精度比較高的方法 ,提高在seek時(shí)候的畫面流暢度
3、獲取的CVPixelBuffer 在Swift語言,不需要手動(dòng)釋放 。在OC上需要調(diào)用 CVPixelBufferRelease() 手動(dòng)釋放
Git Code:AVPlayer-Render
網(wǎng)頁題目:ios開發(fā)視頻播放,iOS 視頻
分享路徑:http://chinadenli.net/article16/dsdsddg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、網(wǎng)站制作、品牌網(wǎng)站制作、用戶體驗(yàn)、做網(wǎng)站、小程序開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)