Android音视频开发之MediaExtactor使用教程

2022-05-05 08:24:05
目录
前言
MediaExtactor
使用MediaExtactor
加载音视频文件代码
获取轨道代码
提取轨道数据信息
一些源码细节分析

前言

在之前学习如何使用MediaPlayer后,了解到android系统提供开发者播放多媒体全家桶能力,但对于开发者希望DIY自由度更高的播放器能力也是可以利用Android内部提供组件包自行实现一个播放器的。举例实现一个视频播放这个流程,它大致流程是【多媒体文件解析提取视频文件】->>

MediaExtactor

MediaExtactor在Android音视频开发中负责提取音视频信息和数据流的功能,可以通过该类实现从多媒体文件中剥离得到音频和视频的能力。

使用MediaExtactor

在一个音视频文件多可能会包含多个数据流(音频数据、视频数据等一般情况是一个视频组合多个音频)

因此需要MediaExtactor加载音视频文件获取到所有数据轨道
通过遍历获取到想要操作的轨道
然后指定该轨道是MediaExtactor所有解析的数据流
通过MediaExtactor获取到该轨道MediaFormat

加载音视频文件代码

加载音视频文件过程可传递Uri、path、URL等。在确认希望需要解析的数据轨道后调用selectTrack就能锁定当前MediaExtactor要使用的轨道在之后数据解码中去使用。

//>

获取轨道代码

加载文件之后可以通过MediaExtactor的getTrackCount方法获取到所有数据轨道。然后可以通过getTrackFormat获取到轨道信息,通过MediaFormat.KEY_MIME得到轨道格式比对期望所有获取到的轨道,比如比对"audio/"就是希望获取到音频轨道数据。

//>mime = mediaFormat.getString(MediaFormat.KEY_MIME); if (mime.startsWith(mediaType)) { trackIndex = i; break; } } return trackIndex; }

提取轨道数据信息

在选定希望获取到的轨道后就可以获取到当前选择轨道的基本信息,例如视频尺寸大小、格式、时长、码率等一些音视频相关基础信息方便只有做解码时选用合适的解码器以及其他必要信息确认。

音频轨道基础信息获取

MediaFormatInfo>ze = mediaFormat.getInteger(MediaFormat.KEY_MAX_INPUT_SIZE); mediaFormatInfo.mime = mediaFormat.getString(MediaFormat.KEY_MIME);

视频轨道基础信息获取

MediaFormatInfo mediaFormatInfo = new MediaFormatInfo(); mediaFormatInfo.mediaFormat = mediaFormat; mediaForhttp://www.easck.commatInfo.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);

但如果你选取的轨道是视频轨道但操作错误提取了音频相关信息可能会出现错误崩溃的情况(例如KEY_IS_ADTS 只有音频轨道才能提取),因此尽量保证提取参数是否正确做好代码保护机制。

一些源码细节分析

MediaExtactor作为提取器,其底层代码逻辑也是调用JNI来实现的,它只是上层API提供出能力而已。> public MediaExtractor() { native_setup(); } private native final void native_setup(); static { System.loadLibrary("media_jni"); native_init(); }

同时setDataSoure方法调用底层native接口和MediaPlayer也是同样的方法名和入参。

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

这基本也能够了解MediaExtactor和MediaPlayer在底层实现上应该属于同一套逻辑和功能。只不过MediaExtactor可以理解为MediaPlayer其中一小部分功能提供提取能力而MediaPlayer是封装成型的工具类只需要加载音视频资源文件播放即可,中间提取轨道和解析过程直接就在底层帮开发者实现了。

到此这篇关于Android音视频开发之MediaExtactor使用教程的文章就介绍到这了,更多相关Android MediaExtactor内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!