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