MediaFormat 是 Android 平臺(tái)中用于描述音視頻格式的類,它提供了許多 API 用于設(shè)置和獲取音視頻的格式信息。以下是 MediaFormat 類的主要 API:
createAudioFormat 和 createVideoFormat
用于創(chuàng)建音頻和視頻格式的 MediaFormat 對(duì)象。需要指定媒體類型(例如 audio/mp4a-latm 或 video/avc)、媒體的采樣率、通道數(shù)、碼率、幀率等信息。
MediaFormat audioFormat = MediaFormat.createAudioFormat("audio/mp4a-latm", 44100, 2);
MediaFormat videoFormat = MediaFormat.createVideoFormat("video/avc", 1920, 1080);
setInteger 和 getInteger
用于設(shè)置和獲取整數(shù)類型的屬性值,例如音頻的比特率、視頻的幀率等。其中 setInteger 方法接收兩個(gè)參數(shù),第一個(gè)參數(shù)為屬性名稱(例如 MediaFormat.KEY_BIT_RATE),第二個(gè)參數(shù)為屬性值。getInteger 方法接收一個(gè)參數(shù),即要獲取的屬性名稱,返回對(duì)應(yīng)的整數(shù)值。
getInteger常見的屬性如下:
KEY_BIT_RATE:音頻或視頻的比特率,單位為比特每秒(bps)。
KEY_SAMPLE_RATE:音頻的采樣率,單位為赫茲(Hz)。
KEY_CHANNEL_COUNT:音頻的通道數(shù)。
KEY_WIDTH:視頻的寬度,單位為像素。
KEY_HEIGHT:視頻的高度,單位為像素。
KEY_FRAME_RATE:視頻的幀率,單位為幀每秒(fps)。
KEY_I_FRAME_INTERVAL:視頻的 I 幀間隔,單位為秒。通常情況下,視頻編碼器會(huì)在視頻中周期性地插入一個(gè) I 幀,以便于視頻的隨機(jī)訪問(wèn)。該屬性指定 I 幀之間的時(shí)間間隔,如果值為 1,則表示每一幀都是 I 幀,如果值為 2,則表示每?jī)蓭瑸橐粋€(gè) GOP(Group Of Pictures),第一幀為 I 幀,后續(xù)幀為 P 幀或 B 幀。
如果MediaFormat.KEY_I_FRAME_INTERVAL的返回值是-1,則表示編碼器使用了默認(rèn)值。
在Android中,如果使用MediaCodec進(jìn)行視頻編碼,可以設(shè)置MediaFormat.KEY_I_FRAME_INTERVAL參數(shù)來(lái)控制生成關(guān)鍵幀的頻率。如果您沒(méi)有顯式地設(shè)置此參數(shù)或設(shè)置為-1,則編碼器將使用默認(rèn)值,這通常是10秒左右的時(shí)間間隔。
需要注意的是,不同的視頻編碼器可能會(huì)對(duì)默認(rèn)值進(jìn)行不同的設(shè)置。因此,如果您需要更精細(xì)地控制關(guān)鍵幀的生成頻率,最好顯式地設(shè)置MediaFormat.KEY_I_FRAME_INTERVAL參數(shù),而不是依賴默認(rèn)值。
KEY_MAX_INPUT_SIZE:媒體輸入數(shù)據(jù)的最大大小,單位為字節(jié)。通常情況下,編碼器需要知道輸入數(shù)據(jù)的最大大小,以便于為輸入數(shù)據(jù)分配足夠的緩沖區(qū)。
int bitRate = mediaFormat.getInteger(MediaFormat.KEY_BIT_RATE);
int sampleRate = mediaFormat.getInteger(MediaFormat.KEY_SAMPLE_RATE);
int channelCount = mediaFormat.getInteger(MediaFormat.KEY_CHANNEL_COUNT);
int width = mediaFormat.getInteger(MediaFormat.KEY_WIDTH);
int height = mediaFormat.getInteger(MediaFormat.KEY_HEIGHT);
float frameRate = mediaFormat.getInteger(MediaFormat.KEY_FRAME_RATE);
float iFrameInterval = mediaFormat.getInteger(MediaFormat.KEY_I_FRAME_INTERVAL);
int maxInputSize = mediaFormat.getInteger(MediaFormat.KEY_MAX_INPUT_SIZE);
setString 和 getString
用于設(shè)置和獲取字符串類型的屬性值,例如音頻的 MIME 類型、視頻的顏色空間等。其中 setString 方法接收兩個(gè)參數(shù),第一個(gè)參數(shù)為屬性名稱,第二個(gè)參數(shù)為屬性值。getString 方法接收一個(gè)參數(shù),即要獲取的屬性名稱,返回對(duì)應(yīng)的字符串值。
audioFormat.setString(MediaFormat.KEY_MIME, "audio/mp4a-latm");
videoFormat.setString(MediaFormat.KEY_COLOR_SPACE, "bt709");
String mimeType = audioFormat.getString(MediaFormat.KEY_MIME);
getString常見的屬性如下:
KEY_MIME:媒體格式的 MIME 類型。MIME(Multipurpose Internet Mail Extensions)類型是一種標(biāo)準(zhǔn)化的方式,用于表示不同類型的數(shù)據(jù)格式。例如,視頻格式的 MIME 類型可能為 video/mp4,音頻格式的 MIME 類型可能為 audio/mpeg。
KEY_LANGUAGE:媒體的語(yǔ)言。
KEY_TITLE:媒體的標(biāo)題。
KEY_ALBUM:媒體所屬的專輯。
KEY_AUTHOR:媒體的作者。
KEY_GENRE:媒體的流派或類型。
KEY_MIME_TYPE:同 KEY_MIME。
String mime = mediaFormat.getString(MediaFormat.KEY_MIME);
String language = mediaFormat.getString(MediaFormat.KEY_LANGUAGE);
String title = mediaFormat.getString(MediaFormat.KEY_TITLE);
String album = mediaFormat.getString(MediaFormat.KEY_ALBUM);
String author = mediaFormat.getString(MediaFormat.KEY_AUTHOR);
String genre = mediaFormat.getString(MediaFormat.KEY_GENRE);
setByteBuffer和getByteBuffer
用于設(shè)置和獲取ByteBuffer類型的數(shù)據(jù)。具體介紹如下:
setByteBuffer(String key, ByteBuffer bytes)
setByteBuffer方法用于設(shè)置指定鍵值對(duì)應(yīng)的ByteBuffer類型數(shù)據(jù)。其中,key表示鍵名,bytes表示要設(shè)置的ByteBuffer類型數(shù)據(jù)。該方法可以用于設(shè)置音頻或視頻數(shù)據(jù)的具體內(nèi)容。例如,可以使用該方法將PCM音頻數(shù)據(jù)或H.264視頻數(shù)據(jù)設(shè)置到MediaFormat對(duì)象中。
getByteBuffer(String key)
getByteBuffer方法用于獲取指定鍵值對(duì)應(yīng)的ByteBuffer類型數(shù)據(jù)。其中,key表示鍵名。該方法可以用于獲取音頻或視頻數(shù)據(jù)的具體內(nèi)容。例如,可以使用該方法獲取AAC音頻數(shù)據(jù)或H.264視頻數(shù)據(jù)。
需要注意的是,使用setByteBuffer和getByteBuffer方法時(shí)需要保證媒體格式已經(jīng)被正確設(shè)置,否則可能會(huì)導(dǎo)致數(shù)據(jù)無(wú)法被正確解析。此外,對(duì)于視頻數(shù)據(jù),由于H.264和HEVC等視頻編碼格式采用了一些特殊的編碼方式,因此需要通過(guò)特定的方式將視頻數(shù)據(jù)封裝成封裝格式,例如MP4或MKV等格式。
MediaFormat中的csd-0和csd-1分別是什么意思
在 Android 的 MediaFormat 類中,csd-0 和 csd-1 分別代表 H.264 和 H.265 編碼器中的 SPS(Sequence Parameter Set)和 PPS(Picture Parameter Set)數(shù)據(jù)。
具體來(lái)說(shuō),H.264 和 H.265 編碼器在編碼視頻數(shù)據(jù)時(shí),會(huì)將視頻幀數(shù)據(jù)分為多個(gè) NAL(Network Abstraction Layer)單元,并在每個(gè) NAL 前面添加特定的起始碼(start code)或者長(zhǎng)度信息(length information)。SPS 和 PPS 分別是 H.264 和 H.265 編碼器中的兩個(gè)關(guān)鍵信息單元,包含了視頻的基本參數(shù)信息(如分辨率、幀率、碼率等)以及編碼參數(shù)(如編碼方式、壓縮比等),是解碼器解碼視頻時(shí)必須用到的信息。
在 MediaFormat 中,csd-0 和 csd-1 分別對(duì)應(yīng) H.264 和 H.265 編碼器中的 SPS 和 PPS 數(shù)據(jù),是作為 MediaFormat 對(duì)象中的附加參數(shù)來(lái)描述視頻流的。當(dāng)使用 MediaCodec 對(duì)象進(jìn)行編碼或解碼時(shí),需要將這些附加參數(shù)設(shè)置到 MediaFormat 對(duì)象中,以便編碼器或解碼器使用。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-429848.html
需要注意的是,由于不同的編碼器可能使用不同的起始碼或長(zhǎng)度信息格式,因此在解析 SPS 和 PPS 數(shù)據(jù)時(shí)需要根據(jù)編碼器的具體實(shí)現(xiàn)來(lái)進(jìn)行解析。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-429848.html
到了這里,關(guān)于音視頻開發(fā)系列(6)——全面了解Android MediaFormat的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!