国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【學(xué)習(xí)】從零開始的Android音視頻開發(fā)(3)——MediaPlayer的prepare/prepareAsync流程和start流程

這篇具有很好參考價值的文章主要介紹了【學(xué)習(xí)】從零開始的Android音視頻開發(fā)(3)——MediaPlayer的prepare/prepareAsync流程和start流程。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

開始prepare后的流程

在之前的流程中我們沒有從MediaPlayer生態(tài)上認(rèn)識各類庫之間的依賴調(diào)用關(guān)系

MediaPlayer部分頭文件在frameworks/base/include/media/目錄中,這個目錄和libmedia.so庫源文件的目錄frameworks/av/media/libmedia/相對應(yīng)。主要頭文件有IMediaPlayerClient.h、mediaplayer.h、IMediaPlayer.h、IMediaPlayerService.h、MediaPlayerInterface.h。在這些頭文件中,mediaplayer.h提供了對上層的接口,而其他的幾個頭文件提供的是一些接口類(包含了純虛函數(shù)的類),這些接口必須被實現(xiàn)類繼承才能夠使用

【學(xué)習(xí)】從零開始的Android音視頻開發(fā)(3)——MediaPlayer的prepare/prepareAsync流程和start流程

在運行的時候整個MediaPlayer可以大致上分成Client和Server兩個部分,它們分別在兩個進程中運行,它們之間使用Binder機制實現(xiàn)IPC通信。從框架結(jié)構(gòu)看,IMediaPlayerService.h、IMediaPlayerClient.h和mediaplayer.h這3個頭文件中定義了MediaPlayer的接口和架構(gòu),在目錄中有專門的MediaPlayerService.cpp和mediaplayer.cpp文件對應(yīng)上面三個頭文件,用于MediaPlayer架構(gòu)的實現(xiàn)

在給播放器設(shè)置數(shù)據(jù)源且展現(xiàn)了Surface后,你應(yīng)開始調(diào)用prepare或prepareAsync函數(shù)。對于文件類型,調(diào)用prepare函數(shù)將暫時阻塞,因為prepare是一個同步函數(shù),直到MediaPlayer已經(jīng)準(zhǔn)備好數(shù)據(jù)即將播放,也就是播放器回調(diào)了onPrepared函數(shù),進入Prepared狀態(tài)

prepare的執(zhí)行過程

【學(xué)習(xí)】從零開始的Android音視頻開發(fā)(3)——MediaPlayer的prepare/prepareAsync流程和start流程

我們可以看到它調(diào)用了_prepare,也就是native函數(shù)

【學(xué)習(xí)】從零開始的Android音視頻開發(fā)(3)——MediaPlayer的prepare/prepareAsync流程和start流程

在網(wǎng)絡(luò)流數(shù)據(jù)傳入MediaPlayer時我們就要用prepareAsync函數(shù)了

【學(xué)習(xí)】從零開始的Android音視頻開發(fā)(3)——MediaPlayer的prepare/prepareAsync流程和start流程

除了最后一句 process_media_player_call中的mp->prepareAsync()在判斷狀態(tài)時不一樣,其它和prepare函數(shù)一樣,它的操作結(jié)果經(jīng)過回調(diào)通知Java層

查看prepareAsync()

【學(xué)習(xí)】從零開始的Android音視頻開發(fā)(3)——MediaPlayer的prepare/prepareAsync流程和start流程

再查看prepareAsync_l()

【學(xué)習(xí)】從零開始的Android音視頻開發(fā)(3)——MediaPlayer的prepare/prepareAsync流程和start流程

再分析prepareAsync(),mp->prepareAsync對應(yīng)的BnMediaPlayer操作如下

【學(xué)習(xí)】從零開始的Android音視頻開發(fā)(3)——MediaPlayer的prepare/prepareAsync流程和start流程

【學(xué)習(xí)】從零開始的Android音視頻開發(fā)(3)——MediaPlayer的prepare/prepareAsync流程和start流程

接著分析MediaPlayerService::Client::prepareAsync

【學(xué)習(xí)】從零開始的Android音視頻開發(fā)(3)——MediaPlayer的prepare/prepareAsync流程和start流程

這里調(diào)用了AwesomePlayer的prepareAsync函數(shù)(注意:AwesomePlayer只在老版本中存在。較新的版本中已不再使用它)

【學(xué)習(xí)】從零開始的Android音視頻開發(fā)(3)——MediaPlayer的prepare/prepareAsync流程和start流程

查看prepareAsync_l

【學(xué)習(xí)】從零開始的Android音視頻開發(fā)(3)——MediaPlayer的prepare/prepareAsync流程和start流程

首先判斷mFlags,此時不是PREPARING。接著啟動mQueue(類TimedEventQueue)。之后修改mFlags的狀態(tài)為PREPARING,表示現(xiàn)在正在準(zhǔn)備處理文件的音視頻流。然后實例化一個AwesomeEvent,放到之前啟動的mQueue中進行通知。隊列中處理的結(jié)果就是調(diào)用AwesomePlayer::onPrepareAsyncEvent函數(shù)。后面的過程就是初始化解碼器,將流解碼出來,也能知道視頻流的寬高等屬性,然后處于Prepared狀態(tài),不再向下跟蹤,prepare的流程就完成了

我們再回到j(luò)ava層中之前的prepare函數(shù)中的scanInternalSubtitleTracks函數(shù)

【學(xué)習(xí)】從零開始的Android音視頻開發(fā)(3)——MediaPlayer的prepare/prepareAsync流程和start流程

它用于掃描內(nèi)嵌字幕并進行跟蹤,接下來看看MediaPlayer的start函數(shù)

【學(xué)習(xí)】從零開始的Android音視頻開發(fā)(3)——MediaPlayer的prepare/prepareAsync流程和start流程

從Paused狀態(tài)變?yōu)镾tarted狀態(tài),如果playback已經(jīng)處于Stopped狀態(tài),或之前從來沒有處于過Started狀態(tài),playback將會開始start

以上的stayAwake用于對屏幕進行操作

【學(xué)習(xí)】從零開始的Android音視頻開發(fā)(3)——MediaPlayer的prepare/prepareAsync流程和start流程

首先執(zhí)行PowerManager pm=(PowerManager)getSystemService(Context.POWER_SERVICE);,通過Context.getSystemService函數(shù)獲取PowerManager實例。然后通過PowerManager的newWakeLock(int flags,String tag)來生成WakeLock實例。int flags指示要獲取哪種WakeLock,不同的鎖對CPU、屏幕、鍵盤燈有不同的影響。獲取WakeLock實例后通過acquire獲取相應(yīng)的鎖,然后進行其他業(yè)務(wù)邏輯的操作,最后使用release釋放(必需的)

flags類型

1.PARTIAL_WAKE_LOCK

保持CPU運轉(zhuǎn),屏幕和鍵盤燈有可能是關(guān)閉的

2.SCREEN_DIM_WAKE_LOCK

保持CPU運轉(zhuǎn),允許保持屏幕顯示但有可能是灰的,允許關(guān)閉鍵盤燈

3.SCREEN_BRIGHT_WAKE_LOCK

保持CPU運轉(zhuǎn),允許保持屏幕高亮顯示,允許關(guān)閉鍵盤燈

4.FULL_WAKE_LOCK

保持CPU運轉(zhuǎn),保持屏幕高亮顯示,鍵盤燈保持亮度

5.ACQUIRE_CAUSES_WAKEUP

正常喚醒鎖實際上并不打開照明,相反,一旦打開它們會一直保持。當(dāng)獲得WakeLock時,這個標(biāo)志會使屏幕或/和鍵盤立即打開。一個典型應(yīng)用是可以立即看到對用戶來說重要的通知

最后通過updateSurfaceScreenOn函數(shù)更新屏幕上的Surface

回到最上面的start函數(shù)中,再JNI中對應(yīng)android_media_MediaPlayer_start函數(shù)

【學(xué)習(xí)】從零開始的Android音視頻開發(fā)(3)——MediaPlayer的prepare/prepareAsync流程和start流程

從MediaPlayer調(diào)用start函數(shù)開始,就進入了視頻播放環(huán)節(jié),最終到C++的mediaplayer.cpp中實現(xiàn),我們先分析下mediaplayer.h。在其中實現(xiàn)了MediaPlayer的基本播放控制操作。另外一個類DeathNotifier是在MediaPlayer類中定義的,它繼承了IBinder類中的DeathRecipient類,這些類都是為進程間通信做準(zhǔn)備的

【學(xué)習(xí)】從零開始的Android音視頻開發(fā)(3)——MediaPlayer的prepare/prepareAsync流程和start流程

可以發(fā)現(xiàn)調(diào)用start函數(shù)后底層返回了一個狀態(tài)以便我們知道是否處于Started狀態(tài),這是需要用process_media_player_call判定這個返回的狀態(tài),然后通知java層中的回調(diào)事件

接下來看看pause函數(shù)

【學(xué)習(xí)】從零開始的Android音視頻開發(fā)(3)——MediaPlayer的prepare/prepareAsync流程和start流程

【學(xué)習(xí)】從零開始的Android音視頻開發(fā)(3)——MediaPlayer的prepare/prepareAsync流程和start流程

pause函數(shù)其實和start函數(shù)流程類似,也是通過mp->pause()返回對應(yīng)的狀態(tài),然后通知上層來暫停的文章來源地址http://www.zghlxwxcb.cn/news/detail-435231.html

到了這里,關(guān)于【學(xué)習(xí)】從零開始的Android音視頻開發(fā)(3)——MediaPlayer的prepare/prepareAsync流程和start流程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Android音視頻開發(fā) - MediaMetadataRetriever 相關(guān)

    MediaMetadataRetriever 是android中用于從媒體文件中提取元數(shù)據(jù)新的類. 可以獲取音頻,視頻和圖像文件的各種信息,如時長,標(biāo)題,封面等. 需要申請 讀寫權(quán)限 . 這里我使用的是本地路徑, 需要注意的是如果路徑文件不存在,會拋出 IllegalArgumentException,具體的源碼如下: 根據(jù)keyCode返回keyC

    2024年04月08日
    瀏覽(31)
  • Android音視頻開發(fā)實戰(zhàn)02-Jni

    Android音視頻開發(fā)實戰(zhàn)02-Jni

    JNI是Java Native Interface的縮寫,是Java提供的一種機制,用于在Java代碼中調(diào)用本地(C/C++)代碼。它允許Java代碼與本地代碼進行交互,通過JNI,Java應(yīng)用程序可以調(diào)用一些原生庫或者操作系統(tǒng)API,以獲取更好的性能和更強的功能支持。 使用JNI需要編寫一些Native方法,并將其實現(xiàn)在

    2024年02月11日
    瀏覽(30)
  • Android音視頻開發(fā)實戰(zhàn)01-環(huán)境搭建

    Android音視頻開發(fā)實戰(zhàn)01-環(huán)境搭建

    FFmpeg 是一款流行的開源多媒體處理工具,它可以用于轉(zhuǎn)換、編輯、錄制和流式傳輸音視頻文件。FFmpeg 具有廣泛的應(yīng)用場景,包括視頻編解碼、格式轉(zhuǎn)換、裁剪、合并、濾鏡等等。官網(wǎng):https://ffmpeg.org/ FFmpeg 支持各種常見的音視頻格式,例如 MP4、AVI、FLV、MOV、AAC、MP3、M4A 等等

    2024年02月10日
    瀏覽(22)
  • Android 音視頻開發(fā)—MediaPlayer音頻與視頻的播放介紹

    Android 音視頻開發(fā)—MediaPlayer音頻與視頻的播放介紹

    Android多媒體中的——MediaPlayer,我們可以通過這個API來播放音頻和視頻該類是Androd多媒體框架中的一個重要組件,通過該類,我們可以以最小的步驟來獲取,解碼和播放音視頻。 它支持三種不同的媒體來源: 本地資源 內(nèi)部的URI,比如你可以通過ContentResolver來獲取 外部URL(流

    2024年02月10日
    瀏覽(27)
  • 音視頻開發(fā)系列(6)——全面了解Android MediaFormat

    MediaFormat 是 Android 平臺中用于描述音視頻格式的類,它提供了許多 API 用于設(shè)置和獲取音視頻的格式信息。以下是 MediaFormat 類的主要 API: 用于創(chuàng)建音頻和視頻格式的 MediaFormat 對象。需要指定媒體類型(例如 audio/mp4a-latm 或 video/avc)、媒體的采樣率、通道數(shù)、碼率、幀率等信

    2024年02月01日
    瀏覽(28)
  • Android開源計劃-一周開發(fā)app,webrtc音視頻開發(fā)

    Android開源計劃-一周開發(fā)app,webrtc音視頻開發(fā)

    題目 – 一周開發(fā)app計劃 首批參與成員 -小巫 -墨香 -夢痕 -邊城刀客 -徐cc 要求 – -每位認(rèn)領(lǐng)者按照開源規(guī)范來做,代碼規(guī)范和Android開發(fā)規(guī)范 -每位認(rèn)領(lǐng)者必須擁有g(shù)ithub賬號,熟練使用git對代碼進來管理 -每個人認(rèn)領(lǐng)一個功能點或模塊 -提出完善的解決方案并提供封裝良好的庫

    2024年04月08日
    瀏覽(90)
  • Android音視頻開發(fā)(三)——MediaExtractor和MediaMuxer的使用

    Android音視頻開發(fā)(三)——MediaExtractor和MediaMuxer的使用

    了解了音視頻的編解碼過程,我們接下來使用一下經(jīng)常跟MediaCodec一起搭配的MediaExtractor和MediaMuxer。最后會使用一個簡單的demo來了解具體了解這兩個工具類的使用過程。這一節(jié)我們就先不講MediaCodec了,放到下節(jié)的demo。 Android提供了一個MediaExtractor類,可以用來 分離容器中的

    2024年02月01日
    瀏覽(44)
  • Android-音視頻學(xué)習(xí)系列-(九)Android-端實現(xiàn)-rtmp-推流

    Android-音視頻學(xué)習(xí)系列-(九)Android-端實現(xiàn)-rtmp-推流

    視頻畫面的采集主要是使用各個平臺提供的攝像頭 API 來實現(xiàn)的,在為攝像頭設(shè)置了合適的參數(shù)之后,將攝像頭實時采集的視頻幀渲染到屏幕上提供給用戶預(yù)覽,然后將該視頻幀傳遞給編碼通道,進行編碼。 1. 權(quán)限配置 2. 打開攝像頭 2.1 檢查攝像頭 public static void checkCameraSe

    2024年04月12日
    瀏覽(27)
  • Android音視頻學(xué)習(xí)系列(九) — Android端實現(xiàn)rtmp推流

    Android音視頻學(xué)習(xí)系列(九) — Android端實現(xiàn)rtmp推流

    Android音視頻學(xué)習(xí)系列(一) — JNI從入門到精通 Android音視頻學(xué)習(xí)系列(二) — 交叉編譯動態(tài)庫、靜態(tài)庫的入門 Android音視頻學(xué)習(xí)系列(三) — Shell腳本入門 Android音視頻學(xué)習(xí)系列(四) — 一鍵編譯32/64位FFmpeg4.2.2 Android音視頻學(xué)習(xí)系列(五) — 掌握音頻基礎(chǔ)知識并使用AudioTrack、OpenSL ES渲

    2024年02月09日
    瀏覽(24)
  • Android-音視頻學(xué)習(xí)系列-(九)Android-端實現(xiàn)-rtmp-推流(2)

    Android-音視頻學(xué)習(xí)系列-(九)Android-端實現(xiàn)-rtmp-推流(2)

    配置好之后,檢查一下 AudioRecord 當(dāng)前的狀態(tài)是否可以進行錄制,可以通過 AudioRecord##getState 來獲取當(dāng)前的狀態(tài): STATE_UNINITIALIZED 還沒有初始化,或者初始化失敗了 STATE_INITIALIZED 已經(jīng)初始化成功了。 2. 開啟采集 創(chuàng)建好 AudioRecord 之后,就可以開啟音頻數(shù)據(jù)的采集了,可以通過調(diào)

    2024年04月12日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包