音視頻學(xué)習(xí)1-使用ImageView,SurfaceView,自定義 View,繪制圖片

音視頻這塊,目前的確沒(méi)有比較系統(tǒng)的教程或者書籍,網(wǎng)上的博客文章也都是比較零散的,希望我后面能擠出時(shí)間整一個(gè)專題詳細(xì)講一講~~目前的話,我先給出一個(gè)大的方向性的學(xué)習(xí)指南,希望對(duì)初學(xué)者有所幫助。

? ? 我一直相信帶著 “任務(wù)” 去學(xué)習(xí)和實(shí)踐,效率會(huì)高很多,因此我列出了一系列音視頻相關(guān)的 “開發(fā)任務(wù)”,從簡(jiǎn)單到困難(當(dāng)然,不一定非常嚴(yán)格和完美,部分任務(wù)先后可調(diào)整),大家在完成任務(wù)的過(guò)程中,遇到任何不懂的地方都要及時(shí)去 google,或者去請(qǐng)教身邊的大牛,不放過(guò)任何一個(gè)疑點(diǎn),相信大家會(huì)很快就能把音視頻周邊相關(guān)知識(shí)積累起來(lái)。

1. 在 Android 平臺(tái)繪制一張圖片,使用至少 3 種不同的 API,ImageView,SurfaceView,自定義 View

2. 在 Android 平臺(tái)使用 AudioRecord 和 AudioTrack API 完成音頻 PCM 數(shù)據(jù)的采集和播放,并實(shí)現(xiàn)讀寫音頻 wav 文件

3. 在 Android 平臺(tái)使用 Camera API 進(jìn)行視頻的采集,分別使用 SurfaceView、TextureView 來(lái)預(yù)覽 Camera 數(shù)據(jù),取到 NV21 的數(shù)據(jù)回調(diào)

4. 學(xué)習(xí) Android 平臺(tái)的 MediaExtractor 和 MediaMuxer API,知道如何解析和封裝 mp4 文件

5. 學(xué)習(xí) Android 平臺(tái) OpenGL ES API,了解 OpenGL 開發(fā)的基本流程,使用 OpenGL 繪制一個(gè)三角形

6. 學(xué)習(xí) Android 平臺(tái) OpenGL ES API,學(xué)習(xí)紋理繪制,能夠使用 OpenGL 顯示一張圖片

7. 學(xué)習(xí) MediaCodec API,完成音頻 AAC 硬編、硬解

8. 學(xué)習(xí) MediaCodec API,完成視頻 H.264 的硬編、硬解

9. 串聯(lián)整個(gè)音視頻錄制流程,完成音視頻的采集、編碼、封包成 mp4 輸出

10. 串聯(lián)整個(gè)音視頻播放流程,完成 mp4 的解析、音視頻的解碼、播放和渲染

11. 進(jìn)一步學(xué)習(xí) OpenGL,了解如何實(shí)現(xiàn)視頻的剪裁、旋轉(zhuǎn)、水印、濾鏡,并學(xué)習(xí) OpenGL 高級(jí)特性,如:VBO,VAO,F(xiàn)BO 等等

12. 學(xué)習(xí) Android 圖形圖像架構(gòu),能夠使用 GLSurfaceviw 繪制 Camera 預(yù)覽畫面

13. 深入研究音視頻相關(guān)的網(wǎng)絡(luò)協(xié)議,如 rtmp,hls,以及封包格式,如:flv,mp4

14. 深入學(xué)習(xí)一些音視頻領(lǐng)域的開源項(xiàng)目,如 webrtc,ffmpeg,ijkplayer,librtmp 等等

15. 將 ffmpeg 庫(kù)移植到 Android 平臺(tái),結(jié)合上面積累的經(jīng)驗(yàn),編寫一款簡(jiǎn)易的音視頻播放器

16. 將 x264 庫(kù)移植到 Android 平臺(tái),結(jié)合上面積累的經(jīng)驗(yàn),完成視頻數(shù)據(jù) H264 軟編功能

17. 將 librtmp 庫(kù)移植到 Android 平臺(tái),結(jié)合上面積累的經(jīng)驗(yàn),完成 Android RTMP 推流功能

18. 上面積累的經(jīng)驗(yàn),做一款短視頻 APP,完成如:斷點(diǎn)拍攝、添加水印、本地轉(zhuǎn)碼、視頻剪輯、視頻拼接、MV 特效等功能

? ? 相信我,如果你認(rèn)真把所有任務(wù)都完成了,你一定會(huì)成為音視頻人才招聘市場(chǎng)的香餑餑~~


BB這么多,開始干了。

在 Android 平臺(tái)繪制一張圖片,使用至少 3 種不同的 API,ImageView,SurfaceView,自定義 View

第一種ImageView加載圖片直接src加載這里不多BB,直接上代碼

<ImageView

?android:layout_width="wrap_content"

? ? android:layout_height="wrap_content"

? ? android:src="@mipmap/ic_launcher" />


我們重點(diǎn)講下第二種SurfaceView。

1:SurfaceView這個(gè)類實(shí)現(xiàn)了SurfaceHolder.Callback接口 接口中主要有三個(gè)回調(diào)函數(shù)SurfaceChanged,Surfacecreated,Surfaceondestoryed分別對(duì)應(yīng)Surface更改,創(chuàng)建,銷毀

2.對(duì)Surface對(duì)象的操作是通過(guò)SurfaceHolder來(lái)進(jìn)行的。所以,在你的SurfaceView類初始化的時(shí)候,你需要調(diào)用getHolder()?來(lái)獲得SurfaceHolder對(duì)象,然后用addCallback()加上回調(diào)接口(因?yàn)槟愕念悓?shí)現(xiàn)了相應(yīng)的接口,所以此處傳入this即可)。

3.在你的SurfaceView類中應(yīng)該建立一個(gè)線程類,處理繪制操作。為此,要向這個(gè)線程類傳遞上面獲得的SurfaceHolder對(duì)象。

4.繪制:在線程類的run()方法中進(jìn)行繪制操作,通過(guò)lockCanvas()方法獲得Canvas對(duì)象,然后就可以用這個(gè)對(duì)象進(jìn)行繪制,繪制完成后調(diào)用unlockCanvasAndPost(),傳入Canvas對(duì)象,這時(shí)Surface將會(huì)按Canvas進(jìn)行繪制。

注意:每次利用SurfaceHolder獲得畫布時(shí),前一次的內(nèi)容將會(huì)保留。

第三種種自定義 View加載圖片,重寫onMeasure?onDraw onLayout 在onDraw中加載圖片


萬(wàn)丈高樓平地起,基礎(chǔ)很重要,每天進(jìn)步一點(diǎn),成功一大步。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容