iOS開發 簡單實現視頻音頻的邊下邊播

直接切入主題,要實現的功能是:
1、ios視頻音頻邊緩存邊播放,緩存時可以在已下載的部分拖拽進度條。
2、緩存到一半退出,再次播放同一地址的視頻時,視頻繼續下載,并且緩存進度已經走到上一次下載的位置。
3、無論是下載到一半退出還是下載完退出,已緩存的數據都存到自己指定的一個路徑。如果已下載完,下次播放時可以不再走網絡,直接播放本地文件。
4、一個有總時間,緩沖進度,播放進度的sliderbar。
(具體效果看唱吧4.1版本以后的視頻效果吧)

用到的幾個類:
1、ASIHttpRequest
2、MPMoviePlayerController
3、HTTPServer(https://github.com/robbiehanson/CocoaHTTPServer)

靈感來源是這篇文章,http://hi.baidu.com/suifeng_89/item/603cb0b95bb796ff62388e88
實現步驟:
1、先開一個request去下載要播放的視頻文件
2、在本地開一個http server,拼一個本地地址(http://127.0.0.1:xxxx/xxx.mp4),丟給MPMoviePlayerController播放。
3、本地的server當收到請求時去那個正在下載的文件中讀數據即可。

斷點下載全由ASIHttpRequest實現了,緩沖的效果用的是MPMoviePlayerController的,它自帶了總時間,已緩沖的總時間,當前時間,整個播放的過程就用MPMoviePlayerController。sliderbar是自己寫的,因為iOS自帶的不支持緩沖進度,例子:(https://github.com/Zedenem/UICircularSlider),把圓的改成長長的不難吧。。

自己曾嘗試過在iOS上用socket server實現本地服務器,各種失敗。后來查到MPMoviePlayerController的請求機制是基于http斷點下載那一套邏輯的,不像android的socket。HTTPServer已經支持各種斷點下載上傳。
只是有一點需要自己實現:當httpserver接受到MPMoviePlayerController的請求時,server要先返回一個請求包含了整個視頻文件的大小。然后MPMoviePlayerController才會不斷請求本地的服務器取數據。我的實現是這樣的。當要比方某個視頻文件的時候,先開啟一個request去下載,當收到文件總大小的時候,存到本地的一個dictionary中,request繼續下載,然后打開localserver,拼一個本地url給player,讓他自動播放。當localserver收到請求時,根據要請求的文件去本地讀文件的實際大小,返回給player,然后player就可以播放了。

HTTPServer自己已經實現了斷點下載的邏輯,你可以給他設置一個DocumentRoot,進來的文件請求會直接到這個目錄下讀文件的數據,他默認的實現獲得文件總大小的邏輯是直接用NSFileManager去取文件的總大小,而這里我們需要去自己存到本地的dictionary中讀。

大約思路就是這樣,不想寫太多東西,因為實際自己寫的代碼真的很少。還是留個思路,真正的實現由大家自己研究,總之實現起來挺簡單的,最終效果也很好,大家各種放心就好了。

后面遇到了幾個問題小說一下
1、HTTPServer不支持iOS4,好像是用到了一個gcd相關的函數不支持,因為目前我們ios4的用戶比較少了,ios7都出來了,就直接把ios4的用戶拋棄了,這里也沒有深究。
2、MPMoviePlayerController是直接可以播放mp3的,因為我們還需要播放音頻,而且是同一個頁面,如果全用MPMoviePlayerController是最好的,因為不需要切換播放器,雖然看起來有點拙。但后來發現點問題,就是播放音頻的時候,有的mp3不能拖拽,當你更改音頻的播放時間的時候,MPMoviePlayerController直接停止了,但有的音頻是可以的,最后研究好像是mp3碼率或者格式的問題,因為我們已經有很多mp3了,再替換之前的mp3不太現實,最后的實現就是音頻用avplayer播,緩沖進度用MPMoviePlayerController的,你可以想象代碼寫的多么臟。。如果大家只做視頻或者剛開始做的話,最好把這個問題研究一下,這里我也沒有深究。

如何用MPMoviePlayerController緩存在線視頻:
  1. 在iOS本地開啟Local?Server服務,然后?MPMoviePlayerController請求本地Local?Server服務。

  2. 本地Local?Server服務再不停的去對應的視頻地址獲取視頻流。

  3. 本地Local?Server請求的時候,就可以把視頻流緩存在本地。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/247865.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/247865.shtml
英文地址,請注明出處:http://en.pswp.cn/news/247865.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

volatile的原理和實現機制

volatile到底如何保證可見性和禁止指令重排序的。 “觀察加入volatile關鍵字和沒有加入volatile關鍵字時所生成的匯編代碼發現,加入volatile關鍵字時,會多出一個lock前綴指令” lock前綴指令實際上相當于一個內存屏障(也成內存柵欄&#xff0…

Table城市代碼翻譯

// data 數據變量 eara:[]// 接口調用 getChinaList() {return fetch({url: "/api/v1/china/city/search",method: "GET"});},// table 欄中的 render 函數 render: (h, params) > {return h("span",this.dictCodesCommon(params.…

iOS中的WiFi與硬件通信

WiFi通信是指手機通過WiFi與外部設備建立連接,并與外部設備進行交互、通信。手機與外部設備的WiFi通信通常是使用Socket來實現的,在這里先介紹一個第三方Socket庫(CocoaAsyncSocket)來實現WiFi通信。 CocoaAsyncSocket支持TCP和U…

MongoDB查詢報錯:class com.mongodb.MongoSecurityException: Exception authenticating MongoCredential...

異常日志: 2019-05-30 10:10:24,252 [http-nio-8080-exec-1] DEBUG [java.sql.Connection] - ooo Connection Opened 2019-05-30 10:10:24,258 [http-nio-8080-exec-1] DEBUG [java.sql.PreparedStatement] - > Executing: insert into client_config ( appid, …

動態添加后的數據轉換 — 后臺接收數據

let data this.projectPersonnel.map(item > {let obj {}obj.member item.people.map(info > {return info.id})obj.member JSON.stringify(obj.member)obj.projectId idobj.teamId item.name.idreturn obj})

iOS開發--地圖與定位

iOS開發--地圖與定位 概覽 現在很多社交、電商、團購應用都引入了地圖和定位功能,似乎地圖功能不再是地圖應用和導航應用所特有的。的確,有了地圖和定位功能確實讓我們的生活更加豐富多彩,極大的改變了我們的生活方式。例如你到了一個陌生的地…

CTO、技術總監、首席架構師的區別

項目經理是項目的直接負責人,這個角色相當于一個中間接口,不管是團隊成員還是需求方(客戶),或者是上級領導,有事都直接找他,所以這個職位著重 于管理與溝通。一般來說,項目經理的工作…

iview組件庫 - 穿梭欄設置

<Modalv-model"modal1"title"項目藥品上下架維護"width"1020":mask-closable"false"on-ok"addOk()"><Col span"36"><Selectfilterableon-change"onChangeProject"placeholder"請先…

如何優雅地使用Sublime Text3

Sublime Text&#xff1a;一款具有代碼高亮、語法提示、自動完成且反應快速的編輯器軟件&#xff0c;不僅具有華麗的界面&#xff0c;還支持插件擴展機制&#xff0c;用她來寫代碼&#xff0c;絕對是一種享受。相比于難于上手的Vim&#xff0c;浮腫沉重的Eclipse&#xff0c;VS…

題目:有一分數序列:2/1,3/2,5/3,8/5,13/8,21/13... 求出這個數列的前20項之和。...

題目&#xff1a;有一分數序列&#xff1a;2/1&#xff0c;3/2&#xff0c;5/3&#xff0c;8/5&#xff0c;13/8&#xff0c;21/13... 求出這個數列的前20項之和。 程序分析&#xff1a;請抓住分子與分母的變化規律。 public class 第二十題求數列之和 {public static void mai…

iview 組件 設置頭像更換

基于iview 組件 設置頭像更換 <!-- 頭像更換 --><div style"width: 100%;height:100%;"><div style"height: 100%;"><Upload :on-success"uploadSuccess" :show-upload-list"false" accept"image/png, i…

HTML的target屬性中_blank、_self、_parent、_top含義

_blank 瀏覽器會另開一個新窗口顯示鏈接_self&#xff0c;在同一框架或窗口中打開所鏈接的文檔。 此參數為默認值&#xff0c;通常不用指定。 _parent&#xff0c;將鏈接的文件載入含有該鏈接框架的父框架集或父窗口中。 如果含有該鏈接的框架不是嵌套的&#xff0c;則在瀏覽…

Windows 聚焦的鎖屏壁紙設置為桌面壁紙

需求&#xff1a; Windows的鎖屏壁紙偶爾遇到非常喜歡的壁紙&#xff0c;想設置為桌面壁紙。 步驟如下&#xff1a; 1. “Windows 聚焦”的鎖屏壁紙都保存在隱藏文件夾 --- Assets里。 a. 打開“資源管理器 b. 在地址欄復制粘貼下方路徑后按回車鍵&#xff0c;即可快速跳轉至這…

VUE藥監碼掃描

<!-- 藥監碼 --><div class"divContent"><div class"headDiv"><div class"spanA">請掃描相關藥監碼</div></div><button class"scanBtn" clickscan_img()>掃描藥監碼</button><bu…

Chrome 控制臺的console用法收集

Chrome 控制臺console的用法 大家都有用過各種類型的瀏覽器&#xff0c;每種瀏覽器都有自己的特色&#xff0c;本人拙見&#xff0c;在我用過的瀏覽器當中&#xff0c;我是最喜歡Chrome的&#xff0c;因為它對于調試腳本及前端設計調試都有它比其它瀏覽器有過之而無不及的地方。…

面向對象思想封裝狙擊手狙擊敵人

需求&#xff1a;狙擊手xxx使用xx槍&#xff0c;射擊敵人xxx,敵人生命值歸0&#xff0c;應聲倒下分析設計類&#xff1a; 封裝狙擊手類 屬性&#xff1a; 名字 行為&#xff1a;撿槍   裝彈   射擊封裝槍類 屬性&#xff1a; 型號 行為&#xff1a;射擊封裝彈夾類 屬性&…

JavaScript 字符串處理方法總結

變量從字符串轉換成int和float型 var weightincrease "2.5kg";undefinedparseInt(weightincrease);2parseFloat(weightincrease);2.5 字符串處理方法var words "魚神是個帥哥";undefinedwords.length6words.charAt(0);"魚"words.charAt(words.…

【js】vue 2.5.1 源碼學習(二) 策略合并

一、 整體思路1 首先是代碼的大體構造&#xff0c;先判斷引入代碼的環境&#xff0c;即對應amd 和cmd的處理2 vue_init 需要借助 initMinxin >>> // 初始化選項1: 規范 2: 合并策略。3 mergeOptions 選項合并 一個或者多個對象合并&#xff0c;并且生成一個…

解決公眾號的加載問題

相關組件內設置的方法&#xff08;方法可以多處組件運用&#xff09; <x-input on-change"changeinp" on-blur"temporaryRepair();" on-enter"temporaryRepair();" name"mobile" :show-clear"false" placeholder"…

JavaScript 數組處理方法總結

數組處理方法//定義數組var array [];undefined//查看類型typeof(array);"object"//往數組里添加數據array [first,second,third]["first", "second", "third"]//數組長度array.length3//索引array[0]"first"//添加數組新…