編者按:隨著手機相機功能日益強大,4k,8k,各類特色短視頻的拍攝,編輯、播放需求日益增長,短視頻應(yīng)用的火爆也對當(dāng)前的手機音視頻技術(shù)提出了更高的要求,如何更好地提高用戶體驗成為了行業(yè)共同的命題。LiveVideoStackCon 2023 上海站邀請了小米的吳昊,從一名開發(fā)者的角度為大家分享他關(guān)于手機端音視頻技術(shù)的一些思考與經(jīng)驗。
大家好,本次我將從手機廠商音視頻SDK開發(fā)的角度和大家分享工作中我總結(jié)的一些經(jīng)驗,也虛心接收更好的建議。
目前我們的主要工作是開發(fā)小米內(nèi)部自用的多媒體組件,它支持小米天氣、相冊、文管、短信、視頻的業(yè)務(wù)領(lǐng)域涉及的本地播放、網(wǎng)絡(luò)播放、音樂播放、圖片瀏覽、視頻編輯和新場景探索等功能。
本次分享將分為五部分:一是從廠商角度介紹對手機音視頻現(xiàn)狀的理解;二是分享對平衡體驗和資源占用的一些工作經(jīng)驗;三是基于網(wǎng)絡(luò)播放場景列舉具體的優(yōu)化實例;四是介紹我日常使用的開源資源;最后進行一些未來展望。
-01-
手機音視頻現(xiàn)狀
?
提起手機音視頻,大家的第一印象可能是上面列舉的抖音、快手、愛奇藝和小米視頻等在線視頻平臺,其中我們的小米視頻是一個聚合平臺,用戶可以通過它觀看各大流媒體平臺的視頻資源。
?
而手機廠商在此基礎(chǔ)上還需重點關(guān)注本地視頻播放應(yīng)用的開發(fā)和優(yōu)化。如上圖所示,我們對小米手機的相冊應(yīng)用豐富了各種各樣的功能,如視頻變速播放、編輯、圖片Seekbar瀏覽等。
此外,近年來各大廠商對手機影像的內(nèi)卷之勢也愈演愈烈,為了充分發(fā)揮硬件實力也在不斷加強相機應(yīng)用的各種功能。
我個人認為,當(dāng)前的手機音視頻應(yīng)用具備以上幾個特點:第一是便攜性,這有助于提高用戶粘度;第二是多功能性,除了單純的播放功能外還要具備各種剪輯編輯相關(guān)的能力;第三是高清晰度,這是當(dāng)今用戶的基本需求;第四是實時性,保證用戶可以隨時隨地使用;社交性和互動性可以為微信等社交應(yīng)用提供服務(wù)。
-02-
性能與體驗
接下來分享我個人對平衡體驗和資源占用的一些優(yōu)化經(jīng)驗。在此之前首先向大家推薦小米公司的官方應(yīng)用小米社區(qū)。我們的產(chǎn)品經(jīng)理和研發(fā)會不時參與社區(qū)討論,并從社區(qū)話題中選取大家感興趣的新功能進行立項研發(fā),歡迎小米用戶們積極發(fā)表自己的想法和建議。
依據(jù)自網(wǎng)絡(luò)和小米社區(qū)的調(diào)研結(jié)論,我們發(fā)現(xiàn)對于音視頻應(yīng)用。用戶主要關(guān)注以上幾點特性:一是滿足用戶的畫質(zhì)需求;二是需要支持各種不同的視頻格式;三是除播放外應(yīng)具備更多的功能(如視頻編輯等);四是要保證播放的流暢度;五是要提高應(yīng)用穩(wěn)定性;六是要盡可能節(jié)約設(shè)備電量。
通過分析提煉用戶需求,我們在技術(shù)上將其轉(zhuǎn)換為具體的優(yōu)化方案。
我們認為可以從以上六個方面來展開優(yōu)化。
首先,控制包體積有效縮短了APK的下載時間,使用戶可以更快地安裝應(yīng)用程序;其次是有利于節(jié)約手機設(shè)備的存儲空間;第三是更小的APK啟動速度更快,應(yīng)用程序響應(yīng)更迅速,提高了用戶體驗;最后,壓縮APK體積減輕了傳輸時占用的網(wǎng)絡(luò)帶寬,節(jié)約了廠商的網(wǎng)絡(luò)和存儲成本。
以上是我總結(jié)的幾項優(yōu)化方案:一是精簡動態(tài)庫符號表;二是去除無用代碼,依據(jù)場景需求優(yōu)化調(diào)用邏輯,減少代碼調(diào)用層級;三是對FFmpeg進行定制化編譯。
內(nèi)存占用優(yōu)化一是可以有效控制因應(yīng)用占用內(nèi)存大,內(nèi)存堆積溢出導(dǎo)致的OOM,或是容易被系統(tǒng)清理的問題;二是減少頻繁GarbageCollection (GC)導(dǎo)致的應(yīng)用卡頓、掉幀現(xiàn)象;三是從手機廠商角度需盡量避免原生應(yīng)用內(nèi)存占用大,變相擠壓第三方應(yīng)用運行環(huán)境。
針對安卓平臺,首先可以使用Android studio、dumpsys或meminfo等工具對應(yīng)用進行內(nèi)存占用分析,明確大內(nèi)存分配的代碼并評估必要性,為后續(xù)優(yōu)化提供決策依據(jù);
二是減少頻繁內(nèi)存創(chuàng)建銷毀,借助jemalloc等內(nèi)存分配器,可以實現(xiàn)對一些重復(fù)對象的復(fù)用;
三是減少數(shù)據(jù)的拷貝流轉(zhuǎn)。
作為手機廠商,應(yīng)用功耗是我們高度關(guān)注的一項指標(biāo),控制功耗首先有利于減少手機的充電次數(shù),延長電池壽命;其次可以減少手機發(fā)熱,降低硬件損耗;三是發(fā)熱更少可以避免手機CPU頻繁降頻,有利于提高設(shè)備的整體性能和相應(yīng)速度。
控制功耗首先可以在不影響應(yīng)用運行的前提下盡量降低網(wǎng)絡(luò)訪問頻率;第二要充分考慮VPU、CPU和GPU的特性,合理分配硬件資源;第三要做好無用線程的排查;第四是可以依據(jù)實際情況將顯示模式切換為surfaceview。
從優(yōu)化SDK網(wǎng)絡(luò)播放的角度,提升流暢性可以采取以下措施:
一是做好視頻文件的數(shù)據(jù)調(diào)整,如注意mp4文件moov box的排列順序等;
二是可以采用數(shù)據(jù)預(yù)緩存;三是采用視頻預(yù)渲染;四是優(yōu)先考慮硬解。
提升應(yīng)用穩(wěn)定性首先可以在平時的工作中保證隨時自動化測試的條件,提高效率;二是要重視預(yù)防和監(jiān)控,可以成立一些代碼評審監(jiān)控機制;三是針對發(fā)現(xiàn)的問題要做好舉一反三。
豐富應(yīng)用的特色功能是維持用戶粘度的關(guān)鍵。做好這點首先要注意多和業(yè)務(wù)相關(guān)的各方交流討論,廣開思路;二是要及時關(guān)注其他平臺的特色功能,并考慮手機應(yīng)用場景及實現(xiàn)技術(shù),研究移植的可行性;三是從自身角度努力提升技術(shù)實力,多關(guān)注新興技術(shù),與時俱進。
-03-
場景案例
接下來介紹一個基于網(wǎng)絡(luò)播放場景的優(yōu)化案例。在該案例中,業(yè)務(wù)方對網(wǎng)絡(luò)播放的起播速度提出了更高要求。
由于向業(yè)務(wù)方最初提供的SDK集成了在線、本地視頻播放和視頻編輯等功能,本身體積過重,優(yōu)化空間有限,因而我們決定基于純網(wǎng)絡(luò)播放推出專門的播放器內(nèi)核,提高起播速度。
各位開發(fā)者在規(guī)劃優(yōu)化方案前要注意做好調(diào)研,與產(chǎn)品方做好溝通,明確具體優(yōu)化需求,本次該案例從業(yè)務(wù)方角度提出的需求包括起播速度快、SDK體積小、快速切換和內(nèi)存小四項。
從開發(fā)者角度,為了便于后續(xù)成果復(fù)用,響應(yīng)用戶可能提出的額外需求,有必要對SDK接口的簡單化和可拓展性做出考慮。
基于以上需求我們進行了架構(gòu)選型調(diào)研。綜合考慮開發(fā)時間,適配難度,后期維護以及成果復(fù)用的最大化,最終決定基于原有播放器框架進行精簡及模塊化,并就穩(wěn)定性及起播耗時等核心指標(biāo)進行專項開發(fā)。
我們從以上幾方面著手壓縮SDK體積。首先是分離原播放器中與網(wǎng)絡(luò)播放場景無關(guān)的功能;其次是有針對性的選取滿足用戶需求的網(wǎng)絡(luò)協(xié)議、封裝格式和編碼格式;最后是針對網(wǎng)絡(luò)播放場景簡化原有判斷邏輯。
播放器架構(gòu)優(yōu)化前后的對比如上所示。
在該案例基礎(chǔ)上,我們正在考慮將原有體積重,集成各種功能的播放器SDK解耦為功能池,后續(xù)依據(jù)不同用戶的場景需求進行針對性的架構(gòu)定制。
對優(yōu)化內(nèi)存占用我們采取了以上措施:一是通過內(nèi)存分析找到高占用的代碼,進行針對性優(yōu)化;二是進行緩存區(qū)優(yōu)化,如自定義內(nèi)存管理、進行緩存區(qū)調(diào)優(yōu)等;三是針對Android平臺采用MediaCodec直接送顯;最后是將顯示模式切換為surfaceview。
在該案例中,縮短起播時間是業(yè)務(wù)方的核心需求。我們對不同起播時間給用戶帶來的感受進行了分析,結(jié)論如上表所示。
視頻起播從SDK開始到顯示播放需經(jīng)歷以上五個階段,我們在各個階段采用了一些相對簡單的優(yōu)化策略。
首先在申請url地址階段,可以在部分場景下提前獲取視頻url;在DNS解析階段,可以酌情考慮采用host緩存,縮短解析時間;在連接服務(wù)器階段,可以考慮進行服務(wù)端調(diào)優(yōu);在數(shù)據(jù)緩存階段,可以提前緩存部分數(shù)據(jù);在解碼顯示階段可以選用支持快速解碼的解碼器。
針對手機側(cè)優(yōu)化我們采用了以上方案。
經(jīng)過測試,我們在該案例中選擇預(yù)緩存待播視頻的開頭1到2秒,大家在實際工作中可以結(jié)合場景需求自行調(diào)整需要緩存的時長。
通過復(fù)用提前緩存時分配的緩沖區(qū)buffer,可以有效降低起播緩存區(qū)的水位線,提高抗網(wǎng)絡(luò)抖動能力。
針對快速切換播放多個視頻的場景可以采用播放器多實例方案。在前一個視頻播放時,提前創(chuàng)建另一個播放器加載下一個視頻,后續(xù)以此類推。
鑒于精確seek受網(wǎng)絡(luò)條件影響可能會拖慢畫面送顯,我們會基于用戶主觀體驗設(shè)置時間閾值(該案例下為900ms),如果精確seek所需時間超出該值則先送顯該時點下能夠解碼的畫面,避免長時間黑屏等待。
換個角度考慮,針對相同問題,從資源側(cè)進行優(yōu)化有時效果要勝于SDK側(cè)方案。
在驗證優(yōu)化可行性時,我使用apache2搭設(shè)了自有服務(wù)器輔助測試,其中上圖右側(cè)展示了設(shè)置網(wǎng)速限制的過程。
我發(fā)現(xiàn)在預(yù)緩存請求網(wǎng)絡(luò)MP4時,會出現(xiàn)MP4文件頭和文件尾來回請求的情況,這增加了播放耗時。
這實際上是包含視頻索引信息的moov在MP4文件中后置導(dǎo)致的。
在使用FFmpeg將其改為前置后,緩存機制可正常生效,短視頻起播明顯加快。
調(diào)整moov位置后的MP4文件box tree如上圖所示。
moov會隨著視頻時長的增加而變大,例如上圖中兩小時左右的視頻moov體量達到了約4MB。由于播放前需全部下載,導(dǎo)致起播速度仍然較慢。
為了縮短長視頻起播時間,我考慮將mp4改為ts流,使播放器可以從視頻流的任一片段獨立解碼,但導(dǎo)致seek的速度較慢。
通過改為使用HLS流,使起播和seek速度都獲得了大幅提升。
綜上,代碼優(yōu)化需要我們明確需求、逐項拆解從而精準(zhǔn)施策。
同時要注意與各方形成合力,從多角度進行分析,還要考慮代碼的模塊化。
-04-
開源資源
接下來介紹幾個我日常較多使用的音視頻開源軟件。
Mp4box是一個可以在線解析、查看MP4 box結(jié)構(gòu)的工具。
?
Bento4是一款用于讀寫MP4文件的專業(yè)開源庫。
?
YUView是我個人強烈推薦的一款碼流分析軟件,它支持帶封裝視頻解析和顯示、支持H.264/H.265/H.266/AV1裸碼流解析和顯示。
它支持查看H.265流的詳細碼流分析信息,包括Slice個數(shù)、CU劃分、CU模式類別、參考幀索引、運動矢量等等。
它支持對比兩段視頻。
它支持類似mediainfo的媒體信息顯示。
它支持各種媒體編碼信息查詢。
它支持查看碼流變化曲線。
biTStream由一系列C語言的頭文件組成,它是在MIT許可證下發(fā)布的,可以輔助進行代碼字節(jié)和結(jié)構(gòu)解析。
-05-
未來展望
ARVR技術(shù)的應(yīng)用:隨著ARNR技術(shù)的不斷發(fā)展,未來音視頻可能會更加注重增強現(xiàn)實和虛擬現(xiàn)實的體驗,例如通過AR技術(shù)將虛擬物品融入到現(xiàn)實場景中,或者通過VR技術(shù)讓用戶身臨其境地體驗音視頻內(nèi)容。
5G技術(shù)的應(yīng)用: 5G技術(shù)的到來將會使得音視頻的傳輸速度更快、延遲更低,這將為用戶提供更加流暢的音視頻體驗,同時也將為音視頻應(yīng)用的創(chuàng)新帶來更多的可能性。
AI技術(shù)的應(yīng)用: AI技術(shù)的發(fā)展將會為音視頻應(yīng)用帶來更多的可能性,例如通過語音識別技術(shù)實現(xiàn)智能語音交互,或者通過圖像識別技術(shù)實現(xiàn)智能視頻分析等。
最后從個人角度分享一些未來展望。一是隨著AR/VR技術(shù)的不斷發(fā)展,未來音視頻可能會更加注重增強現(xiàn)實和虛擬現(xiàn)實的體驗;二是5G技術(shù)的到來會加快音視頻的傳輸速度,為應(yīng)用創(chuàng)新帶來更多可能性;三是AI技術(shù)的發(fā)展將為音視頻應(yīng)用帶來更多可能。 我今天的分享就到這里,謝謝大家!
編輯:黃飛
評論
查看更多