音视频开发系列(6)——全面了解Android MediaFormat
创始人
2024-05-30 15:06:04
0

MediaFormat 是 Android 平台中用于描述音视频格式的类,它提供了许多 API 用于设置和获取音视频的格式信息。以下是 MediaFormat 类的主要 API:

createAudioFormat 和 createVideoFormat

用于创建音频和视频格式的 MediaFormat 对象。需要指定媒体类型(例如 audio/mp4a-latm 或 video/avc)、媒体的采样率、通道数、码率、帧率等信息。

MediaFormat audioFormat = MediaFormat.createAudioFormat("audio/mp4a-latm", 44100, 2);
MediaFormat videoFormat = MediaFormat.createVideoFormat("video/avc", 1920, 1080);

setInteger 和 getInteger

用于设置和获取整数类型的属性值,例如音频的比特率、视频的帧率等。其中 setInteger 方法接收两个参数,第一个参数为属性名称(例如 MediaFormat.KEY_BIT_RATE),第二个参数为属性值。getInteger 方法接收一个参数,即要获取的属性名称,返回对应的整数值。

getInteger常见的属性如下:

KEY_BIT_RATE:音频或视频的比特率,单位为比特每秒(bps)。

KEY_SAMPLE_RATE:音频的采样率,单位为赫兹(Hz)。

KEY_CHANNEL_COUNT:音频的通道数。

KEY_WIDTH:视频的宽度,单位为像素。

KEY_HEIGHT:视频的高度,单位为像素。

KEY_FRAME_RATE:视频的帧率,单位为帧每秒(fps)。

KEY_I_FRAME_INTERVAL:视频的 I 帧间隔,单位为秒。通常情况下,视频编码器会在视频中周期性地插入一个 I 帧,以便于视频的随机访问。该属性指定 I 帧之间的时间间隔,如果值为 1,则表示每一帧都是 I 帧,如果值为 2,则表示每两帧为一个 GOP(Group Of Pictures),第一帧为 I 帧,后续帧为 P 帧或 B 帧。

如果MediaFormat.KEY_I_FRAME_INTERVAL的返回值是-1,则表示编码器使用了默认值。

在Android中,如果使用MediaCodec进行视频编码,可以设置MediaFormat.KEY_I_FRAME_INTERVAL参数来控制生成关键帧的频率。如果您没有显式地设置此参数或设置为-1,则编码器将使用默认值,这通常是10秒左右的时间间隔。

需要注意的是,不同的视频编码器可能会对默认值进行不同的设置。因此,如果您需要更精细地控制关键帧的生成频率,最好显式地设置MediaFormat.KEY_I_FRAME_INTERVAL参数,而不是依赖默认值。

KEY_MAX_INPUT_SIZE:媒体输入数据的最大大小,单位为字节。通常情况下,编码器需要知道输入数据的最大大小,以便于为输入数据分配足够的缓冲区。

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

用于设置和获取字符串类型的属性值,例如音频的 MIME 类型、视频的颜色空间等。其中 setString 方法接收两个参数,第一个参数为属性名称,第二个参数为属性值。getString 方法接收一个参数,即要获取的属性名称,返回对应的字符串值。

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)类型是一种标准化的方式,用于表示不同类型的数据格式。例如,视频格式的 MIME 类型可能为 video/mp4,音频格式的 MIME 类型可能为 audio/mpeg。

KEY_LANGUAGE:媒体的语言。

KEY_TITLE:媒体的标题。

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

用于设置和获取ByteBuffer类型的数据。具体介绍如下:

setByteBuffer(String key, ByteBuffer bytes)
setByteBuffer方法用于设置指定键值对应的ByteBuffer类型数据。其中,key表示键名,bytes表示要设置的ByteBuffer类型数据。该方法可以用于设置音频或视频数据的具体内容。例如,可以使用该方法将PCM音频数据或H.264视频数据设置到MediaFormat对象中。

getByteBuffer(String key)
getByteBuffer方法用于获取指定键值对应的ByteBuffer类型数据。其中,key表示键名。该方法可以用于获取音频或视频数据的具体内容。例如,可以使用该方法获取AAC音频数据或H.264视频数据。

需要注意的是,使用setByteBuffer和getByteBuffer方法时需要保证媒体格式已经被正确设置,否则可能会导致数据无法被正确解析。此外,对于视频数据,由于H.264和HEVC等视频编码格式采用了一些特殊的编码方式,因此需要通过特定的方式将视频数据封装成封装格式,例如MP4或MKV等格式。

相关内容

热门资讯

求经典台词和经典旁白 求经典台词和经典旁白谁有霹雳布袋戏里的经典对白和经典旁白啊?朋友,你尝过失去的滋味吗? 很多人在即将...
小王子第二章主要内容概括 小王子第二章主要内容概括小王子第二章主要内容概括小王子第二章主要内容概括
爱情睡醒了第15集里刘小贝和项... 爱情睡醒了第15集里刘小贝和项天骐跳舞时唱的那首歌是什么谢谢开始找舞伴的时候是林俊杰的《背对背拥抱》...
世界是什么?世界是什么概念?可... 世界是什么?世界是什么概念?可以干什么?物质的和意识的 除了我们生活的地方 比方说山 河 公路 ...
全职猎人中小杰和奇牙拿一集被抓 全职猎人中小杰和奇牙拿一集被抓动画片是第五十九集,五十八集被发现,五十九被带回基地,六十逃走
“不周山”意思是什么 “不周山”意思是什么快快快快......一座山,神话里被共工撞倒了。
《揭秘》一元一分15张跑得快群... 一元一分麻将群加群主微【ab120590】【tj525555】 【mj120590】等风也等你。喜欢...
玩家必看手机正规红中麻将群@2... 好运连连,全网推荐:(ab120590)(mj120590)【tj525555】-Q号:(QQ443...
始作俑者15张跑的快群@24小... 微信一元麻将群群主微【ab120590】 【tj525555】【mj120590】一元一分群内结算,...
《重大通知》24小时一元红中麻... 加V【ab120590】【tj525555】【mj120590】红中癞子、跑得快,等等,加不上微信就...
盘点一下正规一块红中麻将群@2... 一元一分麻将群加群主微:微【ab120590】 【mj120590】【tj525555】喜欢手机上打...
(免押金)上下分一元一分麻将群... 微【ab120590】 【mj120590】【tj525555】专业麻将群三年房费全网最低,APP苹...
[解读]正规红中麻将跑的快@群... 微信一元麻将群群主微【ab120590】 【tj525555】【mj120590】一元一分群内结算,...
《普及一下》全天24小时红中... 微【ab120590】 【mj120590】【tj525555】专业麻将群三年房费全网最低,APP苹...
优酷视频一元一分正规红中麻将... 好运连连,全网推荐:(ab120590)(mj120590)【tj525555】-Q号:(QQ443...
《火爆》加入附近红中麻将群@(... 群主微【ab120590】 【mj120590】【tj525555】免带押进群,群内跑包包赔支持验证...
《字节跳动》哪里有一元一分红中... 1.进群方式-[ab120590]或者《mj120590》【tj525555】--QQ(QQ4434...
全网普及红中癞子麻将群@202... 好运连连,全网推荐:(ab120590)(mj120590)【tj525555】-Q号:(QQ443...
「独家解读」一元一分麻将群哪里... 1.进群方式《ab120590》或者《mj120590》《tj525555》--QQ(4434063...
通知24小时不熄火跑的快群@2... 1.进群方式《ab120590》或者《mj120590》《tj525555》--QQ(4434063...