音视频开发系列(6)——全面了解Android MediaFormat

这篇具有很好参考价值的文章主要介绍了音视频开发系列(6)——全面了解Android MediaFormat。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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等格式。

MediaFormat中的csd-0和csd-1分别是什么意思

在 Android 的 MediaFormat 类中,csd-0 和 csd-1 分别代表 H.264 和 H.265 编码器中的 SPS(Sequence Parameter Set)和 PPS(Picture Parameter Set)数据。

具体来说,H.264 和 H.265 编码器在编码视频数据时,会将视频帧数据分为多个 NAL(Network Abstraction Layer)单元,并在每个 NAL 前面添加特定的起始码(start code)或者长度信息(length information)。SPS 和 PPS 分别是 H.264 和 H.265 编码器中的两个关键信息单元,包含了视频的基本参数信息(如分辨率、帧率、码率等)以及编码参数(如编码方式、压缩比等),是解码器解码视频时必须用到的信息。

在 MediaFormat 中,csd-0 和 csd-1 分别对应 H.264 和 H.265 编码器中的 SPS 和 PPS 数据,是作为 MediaFormat 对象中的附加参数来描述视频流的。当使用 MediaCodec 对象进行编码或解码时,需要将这些附加参数设置到 MediaFormat 对象中,以便编码器或解码器使用。

需要注意的是,由于不同的编码器可能使用不同的起始码或长度信息格式,因此在解析 SPS 和 PPS 数据时需要根据编码器的具体实现来进行解析。文章来源地址https://www.toymoban.com/news/detail-429848.html

到了这里,关于音视频开发系列(6)——全面了解Android MediaFormat的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android 音视频开发 - VideoView

    本篇文章主要介绍下Android 中的VideoView. VideoView是一个用于播放视频的视图组件,可以方便地在应用程序中播放本地或网络上的视频文件。 VideoView可以直接在布局文件中使用,也可以在代码中动态创建。 它封装了MediaPlayer和SurfaceView,提供了简单的接口来控制视频的播放和显示

    2024年04月08日
    浏览(95)
  • 音视频开发-ffmpeg介绍-系列一

    目录 一.简介 FFmpeg框架的基本组成包含: 二. FFmpeg框架梳理音视频的流程​编辑 基本概念: 三.ffmpeg、ffplay、ffprobe区别      4.1 ffmpeg是用于转码的应用程序  4.2 fffplay是用于播放的应用程序       4.3 ffprobe是用于查看文件格式的应用程序      4.4 ffmpeg是用于转码的应用程

    2024年02月16日
    浏览(47)
  • Android音视频开发 - MediaMetadataRetriever 相关

    MediaMetadataRetriever 是android中用于从媒体文件中提取元数据新的类. 可以获取音频,视频和图像文件的各种信息,如时长,标题,封面等. 需要申请 读写权限 . 这里我使用的是本地路径, 需要注意的是如果路径文件不存在,会抛出 IllegalArgumentException,具体的源码如下: 根据keyCode返回keyC

    2024年04月08日
    浏览(54)
  • Android修行手册-基础优化系列图片篇,ios音视频面试内容

    图片款=(480/480)*400=400 占用内存为300*400*4=480000 那么它占用内存为什么是变化的? Android会先解析图片文件本身的数据格式,然后还原成Bitmap对象,Bitmap的大小就跟上面的计算方式相关联。 再举例1080*452的png图片,图片占用存储空间大小为56kb,内存如图: 上图一目了然,不

    2024年04月27日
    浏览(65)
  • Android音视频开发实战01-环境搭建

    FFmpeg 是一款流行的开源多媒体处理工具,它可以用于转换、编辑、录制和流式传输音视频文件。FFmpeg 具有广泛的应用场景,包括视频编解码、格式转换、裁剪、合并、滤镜等等。官网:https://ffmpeg.org/ FFmpeg 支持各种常见的音视频格式,例如 MP4、AVI、FLV、MOV、AAC、MP3、M4A 等等

    2024年02月10日
    浏览(56)
  • Android音视频开发实战02-Jni

    JNI是Java Native Interface的缩写,是Java提供的一种机制,用于在Java代码中调用本地(C/C++)代码。它允许Java代码与本地代码进行交互,通过JNI,Java应用程序可以调用一些原生库或者操作系统API,以获取更好的性能和更强的功能支持。 使用JNI需要编写一些Native方法,并将其实现在

    2024年02月11日
    浏览(55)
  • Android 音视频开发—MediaPlayer音频与视频的播放介绍

    Android多媒体中的——MediaPlayer,我们可以通过这个API来播放音频和视频该类是Androd多媒体框架中的一个重要组件,通过该类,我们可以以最小的步骤来获取,解码和播放音视频。 它支持三种不同的媒体来源: 本地资源 内部的URI,比如你可以通过ContentResolver来获取 外部URL(流

    2024年02月10日
    浏览(61)
  • Android-音视频学习系列-(二)-交叉编译动态库、静态库的入门学习

    gcc -S test.i -o test.s//-S 的作用是编译结束生成汇编文件。 汇编阶段 汇编阶段把 .S 文件翻译成二进制机器指令文件 .o ,这个阶段接收.c ,.i ,.s 的文件都没有问题。 下面我们通过以下命令生成二进制机器指令文件 .o 文件: gcc -c test.s -o test.o 链接阶段 链接阶段,链接的是函数库。

    2024年04月09日
    浏览(104)
  • 音视频开发系列(10):基于qt的音频推流

    今天分享一下利用qt录制音频,然后再利用ffmpeg推流到nginx服务器,最后再利用vlc进行拉流的demo。 首先介绍一下如何利用qt来进行音频的录制,qt的音频录制主要利用qt的QAudioFormat先进行音频信息的配置。主要需要配置以下的信息: 然后使用QAudioDeviceInfo来获取是否支持改设置

    2024年02月02日
    浏览(60)
  • Android开源计划-一周开发app,webrtc音视频开发

    题目 – 一周开发app计划 首批参与成员 -小巫 -墨香 -梦痕 -边城刀客 -徐cc 要求 – -每位认领者按照开源规范来做,代码规范和Android开发规范 -每位认领者必须拥有github账号,熟练使用git对代码进来管理 -每个人认领一个功能点或模块 -提出完善的解决方案并提供封装良好的库

    2024年04月08日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包