背景
為Mac上的播放器添加一個彈幕層,這樣就可以看到直播的視頻和彈幕了朝蜘,這樣就徹底的告別了flash。有以下幾個問題需要處理
- 獲取彈幕數(shù)據(jù),以及處理彈幕數(shù)據(jù)
- 將處理后的彈幕數(shù)據(jù)署咽,展示在播放器的上一層并且使其滾動起來
AsyncSocket & GCDAsyncSocket
項目中的socket通訊使用到了CocoaAsyncSocket。
由于之前在iOS上也實現(xiàn)了彈幕的獲取生音,那時候并沒有涉及到同時有播放器的播放宁否,所以當(dāng)時使用的AsyncSocket也并沒有出現(xiàn)任何問題。這次不同的是缀遍,需要在播放的同時獲取彈幕并顯示慕匠,依然使用AsyncSocket則導(dǎo)致線程阻塞無法異步執(zhí)行播放任務(wù)和彈幕,在各種Google后想到了去查詢AsyncSocket和GCDAsyncSocket的區(qū)別瑟由,于是將其進行了切換絮重,好在只需要修改相應(yīng)的代理方法即可,方法內(nèi)的發(fā)送數(shù)據(jù)歹苦、接收數(shù)據(jù)實現(xiàn)是一致的青伤,可以無痛切換。
關(guān)于它們的詳細區(qū)別Reference_GCDAsyncSocket殴瘦,About AsyncSocket
斗魚彈幕的獲取機制狠角,細節(jié)部分可以在github上搜索,已經(jīng)有很多現(xiàn)成的實現(xiàn)方法了蚪腋,主要流程就是一次身份驗證丰歌,然后才是彈幕數(shù)據(jù)的獲取(ps:數(shù)據(jù)經(jīng)過序列化的數(shù)據(jù)),還有注意的就是為了驗證在線的心跳包機制屉凯。官方文檔
NSView 中的 NSTextField 背景透明
彈幕的展示原理
在一個彈幕容器View上分成多個彈道立帖,然后將數(shù)據(jù)放入彈道中,彈幕有3種狀態(tài)(準(zhǔn)備進入悠砚,進入中和飛出屏幕)晓勇,基于CAAnimationDelegate通過***計算彈幕進入和飛出的時間***反復(fù)繪制單個彈幕的View來達到彈幕移動的目的
這里一個比較坑的問題就是設(shè)置了半天就是無法將NSTextField中的背景顏色設(shè)置成透明的,這里折騰了我?guī)讉€小時。
最后通過一個NSTextField的擴展方法創(chuàng)建實例解決了這個問題
extension NSTextField {
/// Return an `NSTextField` configured exactly like one created by dragging a “Label” into a storyboard.
class func newLabel() -> NSTextField {
let label = NSTextField()
label.isEditable = false
label.isSelectable = false
label.textColor = .labelColor
label.backgroundColor = .controlColor
label.drawsBackground = false
label.isBezeled = false
label.alignment = .natural
label.font = NSFont.systemFont(ofSize: NSFont.systemFontSize(for: label.controlSize))
label.lineBreakMode = .byClipping
label.cell?.isScrollable = true
label.cell?.wraps = false
return label
}
}
最終效果
zhiboOnMac 下載地址
一款在Mac上無需flash觀看直播的播放器(支持斗魚和熊貓)
zhiboOnMac歷史版本