1.解析视频可以使用android 提供的api MediaPlayer,实现简单的播放暂停,提取视频中的一帧或者编辑视频,需要另一个api MediaCodec(硬解,控制DSP芯片)或者 ffmpeg(软解,耗时),选择的优先级一定要硬解大于软解。
MediaPlayer可以用来播放多媒体文件,但是它却无法操作视频解码的细节,比如采用哪种解码器,软解还是硬解,我们无法进行控制。只能按照平台上的实现来进行播放。MediaRecorder的局限性就更大了,如果想要调用编码器编码一段原始的yuv420格式的视频源,就不能使用该接口。
由此MediaCodec类应运而生,它是android平台上操作编解码器的一个类,同样实现了java层和C++层。在C++层的实现中,是通过一个OMXClinet来与Bn端的OMX来进行通信的,OMX服务也是在MediaPlayerService中实现的。OMX是对OMXMaster类的一个封装,它是负责对平台上的所有编解码器进行管理的一个类,包括软解和硬解等。
通过MediaCodec类,我们就可以直接操作android上的软硬件编解码器。
2.使用MediaCodec硬解码
2.1 MediaCodec介绍
MediaCodec类Android提供的用于访问低层多媒体编/解码器接口,它是Android低层多媒体架构的一部分,通常与AudioTrack结合使用,能够编解码诸如H.264、H.265等常见的音视频格式。
Android 应用层统一由 MediaCodec API 来提供各种音视频编解码功能,由参数配置来决定采用何种编解码算法、是否采用硬件编解码加速等。Android 底层多媒体模块采用的是 OpenMax 框架,任何 Android 底层编解码模块的实现,都必须遵循 OpenMax 标准。Google 官方默认提供了一系列的软件编解码器:包括:OMX.google.h264.encoder,omx.google.h264.decoder 等等,而硬件编解码功能,则需要由芯片厂商依照 OpenMax 框架标准来完成,所以,一般采用不同芯片型号的手机,硬件编解码的实现和性能是不同的。
2.2 MediaCodec 工作流程
编解码器处理输入数据并产生输出数据,MediaCodec 使用输入输出缓存,异步处理数据。简要地说,一般的处理步骤如下
请求一个空的输入 input buffer
填入数据、并将其交给 MediaCodec
MediaCodec 处理数据后,将处理后的数据放在一个空的 output buffer
获取填充数据了的 output buffer,得到其中的数据,然后将其返还给 MediaCodec
2.3 MediaCodec API 说明
MediaCodec可以处理具体的视频流,主要有这几个方法:
configure:配置为编码器start:成功地配置组件后,调用start方法。
getInputBuffers:获取需要编码数据的输入流队列,返回的是一个ByteBuffer数组
queueInputBuffer:输入流入队列dequeueInputBuffer:从输入流队列中取数据进行编码操作
getOutputBuffers:获取编解码之后的数据输出流队列,返回的是一个ByteBuffer数组
dequeueOutputBuffer:从输出队列中取出编码操作之后的数据
releaseOutputBuffer:处理完成,释放ByteBuffer数据
stop:完成解码/编码任务后,需注意的是codec任然处于活跃状态且准备重新start。
flush:冲洗组件的输入和输出端口release:释放codec实例使用的资源。
reset:使codec返回到初始(未初始化)状态。
这里是引用
https://blog.csdn.net/sunlifeall/article/details/118054922?spm=1001.2014.3001.5502
https://blog.csdn.net/u012165769/article/details/108406035?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_title~default-0-108406035-blog-117927614.pc_relevant_paycolumn_v3&spm=1001.2101.3001.4242.1&utm_relevant_index=3
https://blog.csdn.net/rikeyone/article/details/50600137