開發一個淘寶那樣的APP多錢?4000夠不?”
“不夠?那5萬總夠了吧?”
你以為的段子其實是N多實體老板們的心聲,他們或許不懂技術但有錢,有錢就能造出一萬個高仿淘寶APP。
可惜這些號稱某個領域垂直的APP們大多從面世到荒蕪訪問量也不過在數百之間徘徊(員工和老顧客),至于原因么
沒有產品經理,沒有運營,沒有前期的推廣費用,,,
大多數傳統行業的公司只是自己覺得自己應該開發一個APP來為自己的客戶服務,實現客戶數據留存,但一頓操作之后發現推廣APP的成本簡直不亞于重造世界!
直到微信小程序的出現,這個依托于微信的類APP可以說從根部解決了這個問題。
投入研發精力少,更重要的是能依托微信進行推廣,這種推廣模式才是傳統老板們的強項,所以各種個性化的小程序井噴式的爆發。
你的手機上或許不會有多少APP,但一定會有幾十個使用過的小程序,社會需求旺盛才有值得我們學習投入的可能,而今天推薦的這本書就是——《微信小程序開發零基礎入門》
本身作者周文潔畢業于澳大利亞墨爾本大學信息技術專業,工學碩士學位。
這位美女學霸曾任職于微軟大中華區客戶服務與技術支持中心,現任職于安徽師范大學,從事教學、系統運維和研發等工作。
她是教育部2018年第一批產學協同育人項目——微信事業部“微信小程序課程改革”負責人。
主要從事Java程序設計、Android程序設計、HTML5網頁前端設計等課程教學工作,擅長案例式教學模式,并開發過多個商業項目。
近年來出版Web前端開發技術系列教材,獨立編著了《HTML5網頁前端設計》和《HTML5網頁前端設計實戰》等教材。
本書是一本從零開始學習的微信小程序開發入門書,讀者無需額外的基礎。全書以項目驅動為宗旨,循序漸進、案例豐富,詳細介紹了微信小程序的入門基礎知識與使用技巧。
全書共4部分12章,分別組成如下。
第一部分是入門篇,包括第1章和第2章的內容。其中,第1章是微信小程序入門,概要介紹了小程序的誕生、特點和主要功能,詳細講解了如何注冊開發者賬號和完善信息,以及開發工具的下載與安裝;第2章是第一個微信小程序,從零開始講解新建項目、真機預覽和調試、代碼提交等操作,并基于該項目介紹了小程序的目錄結構和開發者工具的基本功能。
第二部分是基礎篇,包括第3章和第4章的內容。其中,第3章是小程序框架,主要講解了邏輯層、視圖層和基礎布局模型flex的用法;第4章是小程序組件,按照功能分類依次介紹了視圖容器、基礎內容、表單、導航、媒體、地圖和畫布組件的用法。
第三部分是應用篇,包括第5~11章的內容。這7章分別講解了微信小程序中的各類API,包括網絡API、媒體API、文件API、數據緩存API、位置API、設備API以及界面API。
第四部分是提高篇,包括第12章的內容。這一章提供了一個綜合設計應用實例——高校新聞小程序的設計與實現。該章從創建程序開始詳細介紹了一個仿網易新聞小程序的完整項目開發過程,包括頁面的布局樣式設計、邏輯的處理,以及相關API的調用等。
本書最后是附錄。本書包含完整例題應用110個,均在微信web開發者工具和真機中調試通過,并提供了全套例題源代碼、練習題和視頻講解。
微信小程序(Mini Program)是一種輕量級的應用,它實現了應用“觸手可及”的夢想,用戶無須下載、安裝即可在微信中使用小程序。
等你學廢了這本書,你既可以找個班上上,也可以抽空接點私活兒,怎么操作就看你自己了,只要能掙錢,干啥不是干呢?
文記錄一下在使用 flv.js 播放監控視頻時踩過的各種各樣的坑。雖然官網給的 Getting Started 只有短短幾行代碼,跑一個能播視頻的 demo 很容易,但是播放時各種各樣的異常會搞到你懷疑人生。
究其原因,一方面 GitHub 上文檔比較晦澀,說明也比較簡陋;另一方面是受“視頻播放”思維的影響,沒有對流的足夠認識以及缺乏處理流的經驗。
下面我將自己踩過的坑,以及踩坑過程中補充的相關知識,詳細總結一下。
本文介紹的內容包括以下方面:
啥是直播?啥是點播?
直播就不用說了,抖音普及之下大家都知道直播是干嘛的。點播其實就是視頻播放,和咱們嗶哩嗶哩看視頻一摸一樣沒區別,就是把提前做好的視頻放出來,就叫點播。
點播對于我們前端來說,就是拿一個 mp4 的鏈接地址,放到 video 標簽里面,瀏覽器會幫我們處理好視頻解析播放等一些列事情,我們可以拖動進度條選擇想看的任意一個時間。
但是直播不一樣,直播有兩個特點:
先看一下什么叫流數據。大部分沒有做過音視頻的前端同學,我們常接觸的數據就是 ajax 從接口獲取的 json 數據,特別一點的可能是文件上傳。這些數據的特點是,它們都屬于一次性就能拿到的數據。我們一個請求,一個響應,完整的數據就拿回來了。
但是流不一樣,流數據獲取是一幀一幀的,你可以理解為是一小塊一小塊的。像直播流的數據,它并不是一個完整的視頻片段,它就是很小的二進制數據,需要你一點一點的拼接起來,才有可能輸出一段視頻。
再看它的實時性。如果是點播的話,我們直接將完整的視頻存儲在服務器上,然后返回鏈接,前端用 video 或播放器播就行了。但是直播的實時性,就決定了數據源不可能在服務器上,而是在某一個客戶端。
數據源在客戶端,那么又是怎么到達其他客戶端的呢?
這個問題,請看下面這張流程圖:
如圖所示,發起直播的客戶端,向上連著流媒體服務器,直播產生的視頻流會被實時推送到服務端,這個過程叫做推流。其他客戶端同樣也連接著這個流媒體服務器,不同的是它們是播放端,會實時拉取直播客戶端的視頻流,這個過程叫做拉流。
推流—> 服務器-> 拉流,這是目前流行的也是標準的直播解決方案。看到了吧,直播的整個流程全都是流數據傳輸,數據處理直面二進制,要比點播復雜了幾個量級。
具體到我們業務當中的攝像頭實時監控預覽,其實和上面的完全一致,只不過發起直播的客戶端是攝像頭,觀看直播的客戶端是瀏覽器而已。
我們常接觸的文本,json,圖片等等,都屬于靜態數據,前端用 ajax 向接口請求回來的數據就是靜態數據。
像上面說到的,直播產生的視頻和音頻,都屬于流數據。流數據是一幀一幀的,它的本質是二進制數據,因為很小,數據像水流一樣連綿不斷的流動,因此非常適合實時傳輸。
靜態數據,在前端代碼中有對應的數據類型,比如 string,json,array 等等。那么流數據(二進制數據)的數據類型是什么?在前端如何存儲?又如何操作?
首先明確一點,前端是可以存儲和操作二進制的。最基本的二進制對象是 ArrayBuffer,它表示一個固定長度,如:
let buffer=new ArrayBuffer(16) // 創建一個 16 字節 的 buffer,用 0 填充
alert(buffer.byteLength) // 16
ArrayBuffer 只是用于存儲二進制數據,如果要操作,則需要使用 視圖對象。
視圖對象,不存儲任何數據,作用是將 ArrayBuffer 的數據做了結構化的處理,便于我們操作這些數據,說白了它們是操作二進制數據的接口。
視圖對象包括:
按照上面的標準,一個 16 字節 ArrayBuffer,可轉化的視圖對象和其長度為:
這里只是簡單介紹流數據在前端如何存儲,為的是避免你在瀏覽器看到一個長長的 ArrayBuffer 不知道它是什么,記住它一定是二進制數據。
前面說到,直播需要實時性,延遲當然越短越好。當然決定傳輸速度的因素有很多,其中一個就是視頻數據本身的大小。
點播場景我們最常見的 mp4 格式,對前端是兼容性最好的。但是相對來說 mp4 的體積比較大,解析會復雜一些。在直播場景下這就是 mp4 的劣勢。
flv 就不一樣了,它的頭部文件非常小,結構簡單,解析起來又塊,在直播的實時性要求下非常有優勢,因此它成了最常用的直播方案之一。
當然除了 flv 之外還有其他格式,對應直播協議,我們一一對比一下:
其實早期常用的直播方案是 RTMP,兼容性也不錯,但是它依賴 Flash,而目前瀏覽器下 Flash 默認是被禁用的狀態,已經被時代淘汰的技術,因此不做考慮。
HLS 協議也很常見,對應視頻格式就是 m3u8。它是由蘋果推出,對手機支持非常好,但是致命缺點是延遲高(10~30 秒),因此也不做考慮。
RTP 不必說,瀏覽器不支持,剩下的就只有 flv 了。
但是 flv 又分為 HTTP-FLV 和 WebSocket-FLV,它兩看著像兄弟,又有什么區別呢?
前面我們說過,直播流是實時傳輸,連接創建后不會斷,需要持續的推拉流。這種需要長連接的場景我們首先想到的方案自然是 WebSocket,因為 WebSocket 本來就是長連接實時互傳的技術。
不過呢隨著 js 原生能力擴展,出現了像 fetch 這樣比 ajax 更強的黑科技。它不光支持對我們更友好的 Promise,并且天生可以處理流數據,性能很好,而且使用起來也足夠簡單,對我們開發者來說更方便,因此就有了 http 版的 flv 方案。
綜上所述,最適合瀏覽器直播的是 flv,但是 flv 也不是萬金油,它的缺點是前端 video 標簽不能直接播放,需要經過處理才行。
處理方案,就是我們今天的主角:flv.js
前面我們說到,flv 同時支持 WebSocket 和 HTTP 兩種傳輸方式,幸運的是,flv.js 也同時支持這兩種協議。
選擇用 http 還是 ws,其實功能和性能上差別不大,關鍵看后端同學給我們什么協議吧。我這邊的選擇是 http,前后端處理起來都比較方便。
接下來我們介紹 flv.js 的具體接入流程,官網在這里
假設現在有一個直播流地址:http://test.stream.com/fetch-media.flv,第一步我們按照官網的快速開始建一個 demo:
import flvjs from 'flv.js'
if (flvjs.isSupported()) {
var videoEl=document.getElementById('videoEl')
var flvPlayer=flvjs.createPlayer({
type: 'flv',
url: 'http://test.stream.com/fetch-media.flv'
})
flvPlayer.attachMediaElement(videoEl)
flvPlayer.load()
flvPlayer.play()
}
首先安裝 flv.js,代碼的第一行是檢測瀏覽器是否支持 flv.js,其實大部分瀏覽器是支持的。接下來就是獲取 video 標簽的 DOM 元素。flv 會把處理后的 flv 流輸出給 video 元素,然后在 video 上實現視頻流播放。
接下來是關鍵之處,就是創建 flvjs.Player 對象,我們稱之為播放器實例。播放器實例通過 flvjs.createPlayer 函數創建,參數是一個配置對象,常用如下:
上面的是否有音頻,視頻的配置,還是要看流地址是否有音視頻。比如監控流只有視頻流沒有音頻,那即便你配置 hasAudio: true 也是不可能有聲音的。
播放器實例創建之后,接下來就是三步走:
基礎實現流程就這么多,下面再說一下處理過程中的細節和要點。
基本 demo 跑起來了,但若想上生產環境,還需要處理一些關鍵問題。
點播中的暫停與播放很容易,播放器下面會有一個播放/暫停按鍵,想什么時候暫停都可以,再點播放的時候會接著上次暫停的地方繼續播放。但是直播中就不一樣了。
正常情況下直播應該是沒有播放/暫停按鈕以及進度條的。因為我們看的是實時信息,你暫停了視頻,再點播放的時候是不能從暫停的地方繼續播放的。為啥?因為你是實時的嘛,再點播放的時候應該是獲取最新的實時流,播放最新的視頻。
具體到技術細節,前端的 video 標簽默認是帶有進度條和暫停按鈕的,flv.js 將直播流輸出到 video 標簽,此時如果點擊暫停按鈕,視頻也是會停住的,這與點播邏輯一致。但是如果你再點播放,視頻還是會從暫停處繼續播放,這就不對了。
那么我們換個角度,重新審視一下直播的播放/暫停邏輯。
直播為什么需要暫停?拿我們視頻監控來說,一個頁面會放好幾個攝像頭的監控視頻,如果每個播放器一直與服務器保持連接,持續拉流,這會造成大量的連接和消耗,流失的都是白花花的銀子。
那我們是不是可以這樣:進去網頁的時候,找到想看的攝像頭,點擊播放再拉流。當你不想看的時候,點擊暫停,播放器斷開連接,這樣是不是就會節省無用的流量消耗。
因此,直播中的播放/暫停,核心邏輯是拉流/斷流。
理解到這里,那我們的方案應該是隱藏 video 的暫停/播放按鈕,然后自己實現播放和暫停的邏輯。
還是以上述代碼為例,播放器實例(上面的 flvPlayer 變量)不用變,播放/暫停代碼如下:
const onClick=isplay=> {
// 參數 isplay 表示當前是否正在播放
if (isplay) {
// 在播放,斷流
player.unload()
player.detachMediaElement()
} else {
// 已斷流,重新拉流播放
player.attachMediaElement(videoEl.current)
player.load()
player.play()
}
}
用 flv.js 接入直播流的過程會遇到各種問題,有的是后端數據流的問題,有的是前端處理邏輯的問題。因為流是實時獲取,flv 也是實時轉化輸出,因此一旦發生錯誤,瀏覽器控制臺會循環連續的打印異常。
如果你用 react 和 ts,滿屏異常,你都無法開發下去了。再有直播流本來就可能發生許多異常,因此錯誤處理非常關鍵。
官方對異常處理的說明不太明顯,我簡單總結一下:
首先,flv.js 的異常分為兩個級別,可以看作是 一級異常 和 二級異常。
再有,flv.js 有一個特殊之處,就是它的 事件 和 錯誤 都是用枚舉來表示,如下:
下面介紹的異常和事件,都是基于上述枚舉,你可以理解為是枚舉下的一個 key 值。
一級異常有三類:
二級級異常常用的有三類:
了解這些之后,我們在播放器實例上監聽異常:
// 監聽錯誤事件
flvPlayer.on(flvjs.Events.ERROR, (err, errdet)=> {
// 參數 err 是一級異常,errdet 是二級異常
if (err==flvjs.ErrorTypes.MEDIA_ERROR) {
console.log('媒體錯誤')
if(errdet==flvjs.ErrorDetails.MEDIA_FORMAT_UNSUPPORTED) {
console.log('媒體格式不支持')
}
}
if (err==flvjs.ErrorTypes.NETWORK_ERROR) {
console.log('網絡錯誤')
if(errdet==flvjs.ErrorDetails.NETWORK_STATUS_CODE_INVALID) {
console.log('http狀態碼異常')
}
}
if(err==flvjs.ErrorTypes.OTHER_ERROR) {
console.log('其他異常:', errdet)
}
}
除此之外,自定義播放/暫停邏輯,還需要知道加載狀態。可以通過以下方法監聽視頻流加載完成:
player.on(flvjs.Events.METADATA_ARRIVED, ()=> {
console.log('視頻加載完成')
})
為什么會有樣式定制?前面我們說了,直播流的播放/暫停邏輯與點播不同,因此我們要隱藏 video 的操作欄元素,通過自定義元素來實現相關功能。
首先要隱藏播放/暫停按鈕,進度條,以及音量按鈕,用 css 實現即可:
/* 所有控件 */
video::-webkit-media-controls-enclosure {
display: none;
}
/* 進度條 */
video::-webkit-media-controls-timeline {
display: none;
}
video::-webkit-media-controls-current-time-display {
display: none;
}
/* 音量按鈕 */
video::-webkit-media-controls-mute-button {
display: none;
}
video::-webkit-media-controls-toggle-closed-captions-button {
display: none;
}
/* 音量的控制條 */
video::-webkit-media-controls-volume-slider {
display: none;
}
/* 播放按鈕 */
video::-webkit-media-controls-play-button {
display: none;
}
播放和暫停的邏輯上面講了,樣式這邊自定義一個按鈕即可。除此之外我們還可能需要一個全屏按鈕,看一下全屏的邏輯怎么寫:
const fullPage=()=> {
let dom=document.querySelector('.video')
if (dom.requestFullscreen) {
dom.requestFullscreen()
} else if (dom.webkitRequestFullScreen) {
dom.webkitRequestFullScreen()
}
}
其他自定義樣式,比如你要做彈幕,在 video 上面蓋一層元素自行實現就可以了。
ello,各位程序員,前兩篇關于大數據的文章收到了不少的肯定,小媛非常開心,我會陸陸續續在后面繼續更新我在學習大數據過程中的一些見解,當然也希望我的一些建議能夠為大家的對于了解大數據以及如何學習大數據貢獻一份綿薄之力。今天我的主題是講講如何在初學大數據時候能夠快速入門,避免踩坑。廢話不多說了,首先上圖一張。
這是今天也就是2017.10.30在某直聘app上看到的,從薪資以及招聘公司就可以看出現在大數據的缺口還是很大的,大數據也在像各個行業滲透,我們通過數據可以解決很多宏觀上無法把控的事務,通過數據的收集處理分析可以得到更加科學性的得出一些用肉眼或者意識和思維無法得出的結論。例如,企業可以運用‘大數據’改善決策流程和業務成效的潛能;在醫療中,大數據剖析應用的計算能力可以讓我們能夠在幾分鐘內就可以解碼整個DNA,而且讓我們可以制訂出最新的治療方案,同時可以更好的去理解和預測疾病;在電商行業中,利用大數據進行精準營銷,它根據客戶的消費習慣提前生產資料、物流管理等,有利于精細社會大生產;在金融行業中,更多應用于交易,現在很多股權的交易都是利用大數據算法進行,這些算法現在越來越多的考慮了社交媒體和網站新聞來決定在未來幾秒內是買出還是賣出。在傳統領域大數據同樣將發揮巨大作用:幫助農業根據環境氣候土壤作物狀況進行超精細化耕作;在工業生產領域全盤把握供需平衡,挖掘創新增長點;交通領域實現智能輔助乃至無人駕駛,堵車與事故將成為歷史;能源產業將實現精確預測及產量實時調控。大數據不但單只是應用于企業和政府,在不久的未來在我們每個人身上會廣泛應用。Balabala...好像要偏題了。關于大數據的應用后面會我專門策劃一個專題給大家講解。再說下學習吧,為了讓我們的大數據技能跟就業接軌,學習內容一定要貼合現在的企業要求,就拿咱們官方頭條和BAT的招聘為例,看圖,各位看管。
頭條的大數據招聘崗
百度、騰訊、阿里巴巴的大數據崗
從這些招聘中我看到HR對大數據的技能的要求,主要分為兩個層面,一個是大數據的各個生態架構組件的靈活運用,因為大數據的整個框架是搭建在linux系統上面的,所以要熟悉linux開發環境,另外做任何開發,都離不開一門語言,從招聘中我們也看到,大數據主流的使用語言基本是C++,java和python,這里特別說一下python,Stack Overflow 最近的調查顯示,Python 已經成了發展最快的主流編程語言,也是 Stack Overflow 上來自高收入國家的訪問中,點擊量最高的標簽。而且python在數據領域方面性能卓越,開發周期短,在企業中也非常受歡迎。如果有新手想入門的話,力薦python,畢竟人生苦短嘛,嘿嘿哈。其實這個具體原因的話,大家可以看我上一篇文章。企業上需要的人才必須對大數據的一些組件比較擅長,包括Hadoop,yarn, HDFS, storm, zookeeper,Hive,Hbase,kafka,Flume,Spark等等,組件挺多,但是你如果能夠做到精通其中的一個就可以拿到薪資可觀的offer了,另外一個層面就是數據挖掘,數據提取出來很重要的一個環節就是數據挖掘,數據挖掘涉及到很多算法,針對不同的業務難點具體選擇你要學習的算法,如果你是數學專業的想轉行大數據這里的優勢就體現出來了。學算法的重要就在于你能夠在具體的業務場景中明確自己需要些什么數據,哪些數據作為收集和處理的重點,以及擬定我們數據處理的方式,不然的話,數據只是一個簡單的收集,可能你收集到的數據都不一定是自己需要的,結果不僅浪費了人力,服務器也跟著你受苦受難了,哈哈。
根據以上分析,這下你應該知道自己需要學什么了吧,對于初學者入門大數據來講就要先掌握大數據的生態架構以及數據挖掘算法等等。小媛解釋的這么清楚,應該說出了很多HR的心聲吧!
新手入門大數據一定要注意的幾個誤區(這里你們必須mark下,免得本末倒置):
第一:花太多學習語言的時間在上面,很多同學呀因為是零基礎,所以先從語言著手,很多學java的大佬不僅會讓你學語法基礎,數據結構,核心編程,還推薦你把J2EE、HTML5、Struts2、SpringMVC、Mybatis、Hibernate也學習一下,天了嚕,這些知識只有在大數據可視化階段才能用到,如果你學這么多,干嘛還要來學大數據呢,直接做前后端攻城獅不就好了嘛。事實上你知道學習一門語言的語法基礎,數據結構和核心編程就ok了,而且語言的功夫并不是一朝一夕的,好在學大數據生態架構的話編程的成分占得不算很多,很多時候需要從業務、規模、產品設計、應用場景等多個方面來考慮和解決問題,所以當你先進入這個領域慢慢在修煉自己語言的內功也不遲哈。如果你是新手,建議你從python學起,代碼簡單,容易上手。
第二:linux的學的太深,不可否認大數據的架構是基于linux基礎上的,但是你要明白的是linux只是一個系統,說白了還是在為大數據服務,小媛認為你只要能夠運用基本的linux知識將大數據生態系統搭建起來就可以,但是基本命令一定要通過多多練習熟練掌握。而且在大型公司作業中,系統搭建都是通過跑腳本,并且未來云主機的普及Linux環境都無需搭建啦。
第三:過度依靠書籍,不可否認,很多書籍是比較經典,例如人人皆知的Hadoop權威指南,但是作為初學者,光看書是不行的,你抓不到學習的重點,另外技術這東西一定要多多實踐,而且現在有很多書籍,討論的知識點非常的淺,在一個就是書籍出版一般都比真正企業中的技術落后。畢竟,這個時代,it領域內,技術更新太快啦。
今天內容就到這里,關于學習python和linux我來提點建議:
Python和linux也發展了很多年,網上的免費學習資源非常的多。
python大家可以去百度廖雪峰老師的官方網站,各個版本的教程都有,很適合零基礎小白的學習。
Linux的話就是推薦鳥哥和阿銘老師的,這兩位大佬的課都非常的經典。
然后具體的學習要點,我下次在分享給大家。
如果有想直接要鏈接的,可以關注私信我哦。
后面還會繼續給大家推出一些大數據的入門方法,喜歡小媛的記得分享和關注哦。蟹蟹你們啦,可愛的程序員。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。