normandie播放框架

normandie是什麼?

它是一個用c/c++/java實現的一個播放框架,完全基於android sdk/ndk開發,並且掛載了ffmpeg,openssl,drm等開源庫和相關協議實現.
設計上90%多的API,行爲模式,生命週期與android mediaplayer保持一致,學習成本低,無縫切換。
持續迭代,優化,多項指標超過android原生框架。
支持系統feature,又支持很多系統支持起來比較費勁或支持不了或運營難度高的feature
支持從android4.0到android9.0,flyme4到flyme7。
支持32bit and 64bit。

normandie的用途?

最初的目的是爲了統一處理國內市場衆多的音視頻播放格式的支持問題,不依賴android框架不跟隨android版本迭代,自行迭代一步步完善,解放繁瑣的適配android框架的人力。
後來發展爲,支持衆多格式,支持本地,在線流媒體等多種播放業務的SDK,支持了flyme的多個產品。

normandie的一生?

對自己做的東西還是有感情的,所以稍微擬人化了,相信很多工程師程序員都有這樣的精力。
一生說的不太恰當,可能到了中年吧。
從開始調研立項到設計實現,中間經歷了團隊成員離開開發人員從3減到最後剩下一個,最後終於發佈了1.0版本,在質疑下與cp sdk進行pk,任何需求都滿足提供保姆式服務,再老的機型也提供優化支持比如mx2(android4.0 1g ram),不但在指標上達到業內水平,做到無微不至的服務,拿下了第一個業務音樂。
隨着flyme業務的發展,它也迎來了高光時刻,支持了音樂的本地/在線業務以及各種定製的免流,drm等需求,支持了資訊,瀏覽器,短視頻應用,應用中心等流媒體,短視頻的播放需求,兼容接入的各種cp。部分產品的月活在千萬級別。

clipboard.png
最初的框架設計

clipboard.png

player對象的生命週期設計

history

v1.0.0 Normandie

Support video formats: mkv, mpeg4, flv, rmvb, avi, wmv, 3gp, asf, vob, ts, mts, m2ts, mov etc
Support video decoders: h263,h264,hevc,mpeg,vp6,vp8,vp9 etc
Support HW avc and hevc decoders.
Support video rescale.
Support audio formats: mp3, m4a, aac, flac, ape, ac3, dts, wav, wma, mka,ogg,ra,amr,mpa etc.
Support audio decoders: aac,mpeg,mp3,aac,ape,flac,pcm,dpcm etc.
Support audio resample.
Support MIDI.
Support subtitle internal and external, such as srt etc.
Support protocols: http,https,rtps,hls etc.
Support player operations: start, stop, pause, resume, seek, switch audio channel, switch subtitle, get position, get duration, get play state, get media metadata, get information of audio track and subtitle, buffering for online media, etc.
Support playback loop mode.
Support input using path, url, uri and fd.
Support DLNA.
Support video seek preview which is not supported by AOSP.
Support android surfaceview.
Support two kinds of audio render: audiotrack and opensl es.
Support two kinds of video render: ANativeWindow and opengl es.
Support video shot.
Support Music/Video apps switch to Normandie quickly from android.
Support record audio/video frames, pcm and yuv to file for debug.
Support a demo app with full features.

v2.0.0 Normandie

解決v1.0.0遺留和新發現的bug
重構online stream buffering線程.
重構parser(data extractor)線程.
重構"實現具體player的對象的生命週期".
FFMpegEngine分解.
MediaCodec硬解支持視頻旋轉.
重構audio decoder線程.
重構video decoder線程.
旗艦機型上支持HD音效.(現在大於16bit的音頻全部重採樣的16bit播放).新的機型不再有HD音效這個概念,刪除這個需求。
重構audio render線程.
重構video render線程.
優化rtsp播放.
優化m3u8播放.
穩定性健壯性測試(在線本地長時間播放,且過程中交互,播放結束交互)及優化.
內存使用測試(在線本地長時間播放),及內存優化,比如重複使用event減少malloc次數.
CPU使用對比(與android框架)及優化.
性能對比(之1啓動時間與android框架)及優化.
Demo播放器增加播放框架選擇菜單, 可以選擇normandie或android框架播放某一個媒體文件.
Demo播放器增加app進程自身物理內存使用實時顯示.
Demo播放器增加app進程自身cpu佔比實時顯示.

v2.6.1 Normandie

解決v2.0.0遺留和新發現的bug.
實現向前的x2,x4倍數快速播放.
實現向前的x2,x4倍數慢速播放.
優化opengles render對非規則比例視頻不用內存對齊拷貝就可以直接render,減少內存和cpu使用.
解決部分視頻播放抖動到問題.
優化音軌切換效果更爲平滑.(平滑程度優於android)
優化字幕(內嵌/外掛)切換效果更爲平滑.
在amlogic平臺適配了硬解.
修復添加外掛字幕只能在start之前,之後添加失效的問題.
允許setNextPlayer的參數爲null.
優化http/https讀數據和reconnect機制並啓用.
優化hls播放大大提升在服務器(比如代理服務器)不穩定情況下緩衝概率高的體驗.
實現了http的代理功能.支持代理服務器需要驗證用戶名和密碼.
實現了hls的代理功能.支持代理服務器需要驗證用戶名和密碼.
提供了Envrionment類實現全局代理,通過該類基於http傳輸的協議都可以實現代理(支持代理服務器需要驗證用戶名和密碼);提供了MediaPlayer.setDataSource(url,map)接口用於實現單個MediaPlayer的播放代理.
優化ffmpeg庫的大小,爲音樂專門裁剪ffmpeg庫,並實現腳本編譯時根據發佈對象動態裁剪.
修復極端情況下多線程導致的looper線程退不出的問題(ANR).
優化硬解調用,通過標準api查詢是否對應的avc/hevc profile是否支持硬件解碼器.
向前兼容android5.0以下的android版本,android4.0,android4.2,android4.4.
SDK發佈由jar包變更爲發佈aar包,更好的配合Android studio的使用.

v2.8.0 Normandie

解決v2.6.1遺留和新發現的bug.
解決瀏覽器調用硬解播放的時候偶現有聲音無圖像黑屏.
解決瀏覽器軟解播放的時候多次(大於8)在網頁窗口和懸浮窗口之間切換後有聲音無圖像(黑屏)的問題.
新功能:分屏顯示同一視頻圖像的多個拷貝(軟解).
解決SDK在低版本yunos(只在該版本)上接口被反射時拋出異常的問題.
優化m3u8:增加對EXT-X-DISCONTINUITY時間戳變化的處理.
優化線程的優先級.
優化log打印.
優化性能不佳的場景下音樂播放卡頓問題.
優化ANR,保證API接口不阻塞主線程.
新功能:音樂裁剪鈴聲製作,主要功能:
可以根據時間選擇裁剪mp3,flac,aac,ac3設置成鈴聲
音樂波形數據的生成和顯示
自動識別音樂高潮部分,推薦給用戶裁剪位置
也可以裁剪mp4視頻
支持音樂上架應用中心(已經上架).

v2.8.6 Normandie

解決v2.8.0遺留和新發現的bug
去掉開源庫ffmpeg的ape file version檢查的限制.
優化開源庫ffmpeg的ape demuxer解析ape 3.99 insane導致的seek時間長的問題.
修復開源庫ffmpeg的ra demuxer文件結束時不返回eof返回eio的bug.
支持gsm,gsm-ms音頻格式.
聲音輸出支持flyme固件在旗艦機型的hifi音效.

v2.9 Normandie (release)

解決一些遺留,反饋問題.
修復"amr播放結束後ffmpeg返回eio不返回eof"的問題.
修復ffmpeg開源庫hls中斷機制缺失.
音視頻SDK-機型兼容M96-當播放器使用nextplayer時避開M96 audioflinger修改的根據audiotrack更新採樣率的邏輯:
目前只有96上的audioflinger這樣改了,據說爲了更好的hifi效果,三星平臺,mtk平臺上,針對hifi效果,mtk有相關邏輯實現,沒有這個問題,但這樣m96對第三方應用使用就有限制了,使用不兼容就會出這個問題.
[音頻框架]【M96】播放採樣率爲44.1KHz以上的歌曲,播放到10秒左右會卡頓一下.
修復升級android sdk後運行app報錯“com/android/dx/command/dexer/Main : Unsupported major.minor version 52.0”【demo】.
兼容系統框架非hifi機型上均衡器開啓強制把float轉換成int導致的音樂電流聲問題:
app根據是否hifi機型在創建MediaPlayer對象的時候傳下來
後續機型結合system property判斷.
修復audiotrack flush調用不起作用的問題.
[normandie]優化在系統資源緊張的情況下,視頻播放中的音頻的流暢性.
MediaPlayer API release加鎖解決app多線程release重入的問題.
[代碼優化]移植NDK沒有的AOSP的AutoMutex到sdk.
兼容非hifi pad上audioflinger固定分配給audiotrack內存不不夠大的問題,在audiotrack對象申請失敗後減小申請buffer個數繼續申請.
性能優化:將數據鏈條爲空埋點從logi降到logd.
反射android.os.SystemProperties.get獲取phone機型名稱和hifi屬性.
重命名normandie私有libcrypto,libssl,解決音樂在Android N上作爲系統app時不能運行的問題.
修復normandie demo在android N上由於mediacontroller回調變化導致的seek位置一直爲0的問題【demo】.
解決player切成midiplayer後不能切回nmdplayer.
[音視頻sdk]優化,通過緩存減少sdk中反射的調用次數.
修復android n上pthread_cond_timedwait對小於1s無感造成的程序異常問題.
【normandie】【demo】把normandie加入打開文件的程序列表.
修復[USB HOST]【M1793&M1792】無法選中OTG設備中的音樂文件播放.
[優化]在用fd打開文件時,不使用sonivox庫的eas接口判斷fd是否midi,反過來判斷nmd是否支持midi.
修復音視頻SDK[MTK反饋]播放.imy格式音頻文件,點擊播放暫停按鈕功能異常.
支持代理digest鑑權,並且digest和basic動態兼容.
採用新的發佈方式aar包打包so+artifactory在線接入.

v2.9.1 Normandie

【優化】getDurationSlow增加中斷機制.

v2.9.2 Normandie

修復“495968 【Flyme6】【全機型】【音樂】【6.0.03】郵件中點擊midi格式音樂播放失敗“.

v2.9.3 Normandie

將使用write float接口的條件從API Level21提高到API Level22,修復“525540 6.3.02[MX4Pro適配]---播放在線無損音樂或者下載無損音樂到本地播放----出現很大的雜音”.

v2.9.6 Normandie

實現android libc沒有的pthread_cancel.
隔離libc,由於android版本差異,造成libc不同,有些可以通過實現處理掉,有些無法實現,需要隔離.

V2.9.8 Normandie

修復流程優化引入的一個內存問題.

V2.9.10 Normandie

【快省穩】需要的時候再開啓subtitlerender線程.

V3.0 Normandie

實現在線播放緩存功能.
接口如下:
//在setDataSource之後,prepare或prepareAsync之前調用.
public void setMusicCacheFileInfo( String path, OnMusicCacheFileListener listener, int bufferSizeLevel) public interface OnMusicCacheFileListener { public void onMusicCacheFileComplete(MediaPlayer mp); public void onMusicCacheFileIOError(MediaPlayer mp); }
【快省穩】優化IO出錯後的打印,減少打印輸出.
優化內存使用,更合理.
修復ffmpeg flac mux問題.
修復ffmpeg muxer某種情況下會處以0造成崩潰的問題.

V3.0.1 Normandie

強制不信任不支持得分小於等於2的文件播放.

V3.0.2 Normandie

【優化】優化mp3 seek到0位置的處理
1.Faster
2.skip dirty data

V3.1.0 Normandie

[optimze] change android ndk version from 9 to 21 to compile ffmpeg 32bit so
fix issue pthread_cond_wait_timeout of libc hit not 100%
a better solution for 10s chorus of Music faster and save more data flow review 9 songs at the same time

V3.2.0 Normandie

滿足aar新的發佈要求,keep不需要混淆的class
【需求】音樂DRM(存儲加密,解密播放,機器imei,過期時間等drm數據管理)

V3.2.1 Normandie

Fix 穩定性[6.7.00]執行Monkey時出現錯誤 unknown exception: the drm manager object pointer is not innitialized at the beginning

V3.2.6 Normandie

爲資訊的視頻,短視頻居多,裁剪,根據需求提供合適的庫,裁剪掉dlna,drm,以及ffmpeg部分模塊,和相應的類
解決快速滑動視頻播放列表(快速切換短視頻)過程出現的崩潰問題: handle the process after abort by itself
動態編譯是否支持hls EXT-X-DISCONTINUITY標籤,併爲video of news打開,only for video of news now
【優化】音樂試聽9首副歌流量優化, tcp socket cache is too big

V3.2.11 Normandie

【資訊客戶端】【3.14.0】【Android4.4.4】流內播放:點擊播放按鈕必現閃退
【音頻視頻SDK】【優化】android mediaplayer異步接口的使用, add libmessagehelper.so
資訊短視頻“秒播”優,UC, kuaishou, 360

V3.2.16 Normandie

support the dirty flac,支持一些頭部損壞的flac

V3.2.20 Normandie

重構setNextPlayer接口爲異步接口,fix AAF crash
expose exception to the up layer in MidiPlayer

V3.2.26 Normandie

[short video]優化seek後的視頻出幀策,let first frame render directly and the second frame wait for the first audio frame

V3.2.28 Normandie

用戶反饋[1.0.0]偶現首頁多次播放,視頻界面出現花
update dlna, fix some issues
[short video]fix AAF ANR, add getVideoHeight() in MediaPlayer java state machine

V3.2.29 Normandie

fix memory leak of decoder object which was introduced by a patch

V3.2.32 Normandie

兼容flyme5/android5.1的一個固件的音頻框架的audiotrack的writefloat接口工作異常導致的大面積破音問題
完善gltexture生命週期
【海外音樂】優化接口魯棒性,保證resetAsync/pauseAsync先後同時調用時pause無效
【demo】simulate the short video user operations: repeating “create player, play, release player” for object/normal memory/graphic memory check under user mode

v3.2.38 Normandie

pause時候增加audiotrack pause接口調用,影響藍牙耳機狀態,有一款藍牙耳機只能發出media pause沒有media play
fix視頻詳情頁,播放完畢後,鎖屏,再解鎖,重新點播放按鈕不起作用
new hifi rules on android p

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章