最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android音視頻開發(fā)之MediaExtactor使用教程

 更新時間:2022年04月26日 16:35:21   作者:JulyYu  
MediaExtactor在Android音視頻開發(fā)中負責提取音視頻信息和數(shù)據(jù)流的功能,可以通過該類實現(xiàn)從多媒體文件中剝離得到音頻和視頻的能力。本文將詳細為大家介紹一下它的使用,感興趣的可以了解一下

前言

在之前學習如何使用MediaPlayer后,了解到Android系統(tǒng)提供開發(fā)者播放多媒體全家桶能力,但對于開發(fā)者希望DIY自由度更高的播放器能力也是可以利用Android內(nèi)部提供組件包自行實現(xiàn)一個播放器的。舉例實現(xiàn)一個視頻播放這個流程,它大致流程是【多媒體文件解析提取視頻文件】-> 【視頻流解碼】-> 【解碼數(shù)據(jù)播放渲染到Render】。首要需要實現(xiàn)的是多媒體中需要文件提取工作,這就需要使用到Android提供MediaExtactor類來實現(xiàn)提取媒體信息能力。

MediaExtactor

MediaExtactorAndroid音視頻開發(fā)中負責提取音視頻信息和數(shù)據(jù)流的功能,可以通過該類實現(xiàn)從多媒體文件中剝離得到音頻和視頻的能力。

使用MediaExtactor

在一個音視頻文件多可能會包含多個數(shù)據(jù)流(音頻數(shù)據(jù)、視頻數(shù)據(jù)等一般情況是一個視頻組合多個音頻)

  • 因此需要MediaExtactor加載音視頻文件獲取到所有數(shù)據(jù)軌道
  • 通過遍歷獲取到想要操作的軌道
  • 然后指定該軌道是MediaExtactor所有解析的數(shù)據(jù)流
  • 通過MediaExtactor獲取到該軌道MediaFormat

加載音視頻文件代碼

加載音視頻文件過程可傳遞Uri、path、URL等。在確認希望需要解析的數(shù)據(jù)軌道后調(diào)用selectTrack就能鎖定當前MediaExtactor要使用的軌道在之后數(shù)據(jù)解碼中去使用。

// 加載資源
MediaExtractor extractor = new MediaExtractor();
extractor.setDataSource(path);
// 遍歷獲取視頻軌道
int trackIndex = getTrackIndex(extractor, "audio/");
// 選定軌道
extractor.selectTrack(trackIndex);

獲取軌道代碼

加載文件之后可以通過MediaExtactorgetTrackCount方法獲取到所有數(shù)據(jù)軌道。然后可以通過getTrackFormat獲取到軌道信息,通過MediaFormat.KEY_MIME得到軌道格式比對期望所有獲取到的軌道,比如比對"audio/"就是希望獲取到音頻軌道數(shù)據(jù)。

// 獲取指定軌道的方法
private static int getTrackIndex(MediaExtractor extractor, String mediaType) {
    int trackIndex = -1;
    for (int i = 0; i < extractor.getTrackCount(); i++) {
        MediaFormat mediaFormat = extractor.getTrackFormat(i);
        String mime = mediaFormat.getString(MediaFormat.KEY_MIME);
        if (mime.startsWith(mediaType)) {
            trackIndex = i;
            break;
        }
    }
    return trackIndex;
}

提取軌道數(shù)據(jù)信息

在選定希望獲取到的軌道后就可以獲取到當前選擇軌道的基本信息,例如視頻尺寸大小、格式、時長、碼率等一些音視頻相關(guān)基礎(chǔ)信息方便只有做解碼時選用合適的解碼器以及其他必要信息確認。

音頻軌道基礎(chǔ)信息獲取

MediaFormatInfo mediaFormatInfo = new MediaFormatInfo();
mediaFormatInfo.mediaFormat = mediaFormat;
mediaFormatInfo.audioChannels = mediaFormat.getInteger(MediaFormat.KEY_CHANNEL_COUNT);
mediaFormatInfo.audioSampleRate = mediaFormat.getInteger(MediaFormat.KEY_SAMPLE_RATE);
mediaFormatInfo.maxInputSize = mediaFormat.getInteger(MediaFormat.KEY_MAX_INPUT_SIZE);
mediaFormatInfo.mime = mediaFormat.getString(MediaFormat.KEY_MIME);

視頻軌道基礎(chǔ)信息獲取

MediaFormatInfo mediaFormatInfo = new MediaFormatInfo();
mediaFormatInfo.mediaFormat = mediaFormat;
mediaFormatInfo.videoHeight = mediaFormat.getInteger(MediaFormat.KEY_HEIGHT);
mediaFormatInfo.videoWidth = mediaFormat.getInteger(MediaFormat.KEY_WIDTH);
mediaFormatInfo.timeDuration = mediaFormat.getLong(MediaFormat.KEY_DURATION);
mediaFormatInfo.mime = mediaFormat.getString(MediaFormat.KEY_MIME);

但如果你選取的軌道是視頻軌道但操作錯誤提取了音頻相關(guān)信息可能會出現(xiàn)錯誤崩潰的情況(例如KEY_IS_ADTS 只有音頻軌道才能提?。虼吮M量保證提取參數(shù)是否正確做好代碼保護機制。

一些源碼細節(jié)分析

MediaExtactor作為提取器,其底層代碼邏輯也是調(diào)用JNI來實現(xiàn)的,它只是上層API提供出能力而已。 在源碼細節(jié)中可以看到MediaExtactor同樣是加載media_jniso庫,這和MediaPlayer是一樣的邏輯。

public MediaExtractor() {
    native_setup();
}
private native final void native_setup();
static {
    System.loadLibrary("media_jni");
    native_init();
}

同時setDataSoure方法調(diào)用底層native接口和MediaPlayer也是同樣的方法名和入?yún)ⅰ?/p>

private native final void nativeSetDataSource(
        @NonNull IBinder httpServiceBinder,
        @NonNull String path,
        @Nullable String[] keys,
        @Nullable String[] values) throws IOException;

這基本也能夠了解MediaExtactorMediaPlayer在底層實現(xiàn)上應該屬于同一套邏輯和功能。只不過MediaExtactor可以理解為MediaPlayer其中一小部分功能提供提取能力而MediaPlayer是封裝成型的工具類只需要加載音視頻資源文件播放即可,中間提取軌道和解析過程直接就在底層幫開發(fā)者實現(xiàn)了。

到此這篇關(guān)于Android音視頻開發(fā)之MediaExtactor使用教程的文章就介紹到這了,更多相關(guān)Android MediaExtactor內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用Android studio查看Kotlin的字節(jié)碼教程

    使用Android studio查看Kotlin的字節(jié)碼教程

    這篇文章主要介紹了使用Android studio查看Kotlin的字節(jié)碼教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • Android Notification通知使用詳解

    Android Notification通知使用詳解

    消息通知(Notification)是Android系統(tǒng)中比較有特色的一個功能,當某個應用程序希望用戶發(fā)出一些提示信息,而該應用又不在前臺運行時,就可以借助通知來實現(xiàn)
    2022-09-09
  • Android 個人理財工具一:項目概述與啟動界面的實現(xiàn)

    Android 個人理財工具一:項目概述與啟動界面的實現(xiàn)

    本文主要介紹Android 開發(fā)個人理財工具項目概述與啟動界面的實現(xiàn),這里主要對實現(xiàn)項目的流程做了詳細概述,并對啟動界面簡單實現(xiàn),有需要的小伙伴可以參考下
    2016-08-08
  • Android 屏幕截屏方法匯總

    Android 屏幕截屏方法匯總

    這篇文章主要介紹了Android 屏幕截屏方法匯總的相關(guān)資料,需要的朋友可以參考下
    2016-02-02
  • Flutter Android應用啟動白屏的解決方案

    Flutter Android應用啟動白屏的解決方案

    任何一個app基本都會設(shè)計一個啟動頁,今天我們就來看看怎么在flutter項目中設(shè)置啟動頁,這篇文章主要給大家介紹了關(guān)于Flutter Android應用啟動白屏解決的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • Android框架組件Lifecycle的使用詳解

    Android框架組件Lifecycle的使用詳解

    這篇文章主要介紹了Android框架組件Lifecycle的使用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • Android實現(xiàn)底部切換標簽

    Android實現(xiàn)底部切換標簽

    這篇文章主要為大家詳細介紹了Android實現(xiàn)底部切換標簽,嵌套Fragment,方便自定義布局,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Android開發(fā)實現(xiàn)的電話竊聽和攔截應用

    Android開發(fā)實現(xiàn)的電話竊聽和攔截應用

    這篇文章主要介紹了Android開發(fā)實現(xiàn)的電話竊聽和攔截應用,結(jié)合實例形式分析了Android針對電話的監(jiān)聽與攔截的相關(guān)技巧,需要的朋友可以參考下
    2016-08-08
  • Android異步回調(diào)中的UI同步性問題分析

    Android異步回調(diào)中的UI同步性問題分析

    這篇文章主要為大家詳細分析了Android異步回調(diào)中的UI同步性問題,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Flutter?App開發(fā)實現(xiàn)循環(huán)語句的方式實例

    Flutter?App開發(fā)實現(xiàn)循環(huán)語句的方式實例

    這篇文章主要為大家介紹了Flutter?App開發(fā)實現(xiàn)循環(huán)語句的方式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05

最新評論

巨野县| 贺州市| 龙岩市| 阳谷县| 玉门市| 凤庆县| 虞城县| 内丘县| 定边县| 东乌珠穆沁旗| 闻喜县| 榕江县| 丽江市| 广河县| 西青区| 芷江| 托里县| 吴川市| 洪湖市| 沧源| 屯留县| 井冈山市| 西充县| 五华县| 孝感市| 稻城县| 雅江县| 江源县| 和静县| 延安市| 新兴县| 合山市| 康保县| 和顺县| 邛崃市| 华安县| 云浮市| 靖安县| 大田县| 宿迁市| 武义县|