首页 > 编程知识 正文

nef codec,音视频编解码技术

时间:2023-05-05 04:13:03 阅读:163603 作者:525

用于文章目录资料的接口如下所示,用于所有可分析的编解码器MediaCodec的异步模式。 (使用buffer异步处理) MediaCodec在同步模式下的用法如下: (使用Buffers同步处理) Buffer Arrays同步处理介质

数据

媒体编码解码器使用介绍

MediaCodec的基本原理和使用

安卓媒体实现多级音视频的剪切和拼接

安卓解码器MediaCodec分析

安卓直播开发之旅(8)安卓硬编解码接口MediaCodec原理分析

安卓媒体编解码器详情和demo

安卓音视频开发(六):MediaCodec API详情

安卓音视频开发(五)使用MediaExtractor和MediaMuxer API分析和封装mp4文件

安卓硬编解码接口MediaCodec使用完全分析(一) ) )。

安卓分离合成音频视频(在MediaExtractor和MediaMuxer中) ) ) ) ) )。

安卓音视频开发-入门(四)使用:媒体扩展器和MediaMuxer API分析并封装mp4文件

android中的MediaCodec类分析

安卓媒体软件

安卓原生媒体播放器与媒体解码器的区别与联系(2) )。

媒体编码官方API

使用的界面获取//获取所有可分析的编解码器/所有支持的编码器的数量valcodeccount : int=mediacodeclist.getcode count () ) for {判断是否为valcodecinfoat : mediacodecinfo=mediacodeclist.getcodecinfoat (I )//编码器if (! 获取codecinfoat.is encoder } { continue }//编码器支持的MIME类型,然后单击valtypes=codecinfoat.supported types.foreach { //membervariablecodec.set callback (new media codec.callback ({ @ overridevoidoninputbufferavailable ) ) (mediacodecMC, iinputbuferavailable ) ) mediacodec//fillinputbufferwithvaliddata…codec.queue input buffer (input buffer id, …) } @ overridevoidonoutputbufferavailable (mediacodecmc,int outputBufferId,…) (bytebufferoutputbuffer=codec.getoutoutid //optiona//bufferformatisequivalenttomoutputformat//outputbufferisreadytobeprocessedorrendered .…codec.releaseaseaseaseseseoresetettttted @ overridevoidonoutputformatchanged (mediacodecmc, mediaformatformat (//subsequentdatawillconformtonewformat.//canignoreifusingetoutputformat ) outputbufferid ) moutputputputppporid codec.configure(format, ); mOutputFormat=codec.getOutpu

tFormat(); // option Bcodec.start();// wait for processing to completecodec.stop();codec.release(); MediaCodec在同步模式下的用法如下:(使用Buffers同步处理) MediaCodec codec = MediaCodec.createByCodecName(name);codec.configure(format, …);MediaFormat outputFormat = codec.getOutputFormat(); // option Bcodec.start();for (;;) { int inputBufferId = codec.dequeueInputBuffer(timeoutUs); if (inputBufferId >= 0) { ByteBuffer inputBuffer = codec.getInputBuffer(…); // fill inputBuffer with valid data … codec.queueInputBuffer(inputBufferId, …); } int outputBufferId = codec.dequeueOutputBuffer(…); if (outputBufferId >= 0) { ByteBuffer outputBuffer = codec.getOutputBuffer(outputBufferId); MediaFormat bufferFormat = codec.getOutputFormat(outputBufferId); // option A // bufferFormat is identical to outputFormat // outputBuffer is ready to be processed or rendered. … codec.releaseOutputBuffer(outputBufferId, …); } else if (outputBufferId == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) { // Subsequent data will conform to new format. // Can ignore if using getOutputFormat(outputBufferId) outputFormat = codec.getOutputFormat(); // option B }}codec.stop();codec.release(); 使用Buffer Arrays同步处理(deprecated) MediaCodec codec = MediaCodec.createByCodecName(name);codec.configure(format, …);codec.start();ByteBuffer[] inputBuffers = codec.getInputBuffers();ByteBuffer[] outputBuffers = codec.getOutputBuffers();for (;;) { int inputBufferId = codec.dequeueInputBuffer(…); if (inputBufferId >= 0) { // fill inputBuffers[inputBufferId] with valid data … codec.queueInputBuffer(inputBufferId, …); } int outputBufferId = codec.dequeueOutputBuffer(…); if (outputBufferId >= 0) { // outputBuffers[outputBufferId] is ready to be processed or rendered. … codec.releaseOutputBuffer(outputBufferId, …); } else if (outputBufferId == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) { outputBuffers = codec.getOutputBuffers(); } else if (outputBufferId == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) { // Subsequent data will conform to new format. MediaFormat format = codec.getOutputFormat(); }}codec.stop();codec.release(); MediaExtractor API介绍

MediaExtractor的作用是把音频和视频的数据进行分离。

主要API介绍:

setDataSource(String path):即可以设置本地文件又可以设置网络文件getTrackCount():得到源文件通道数 getTrackFormat(int index):获取指定(index)的通道格式getSampleTime():返回当前的时间戳 readSampleData(ByteBuffer byteBuf, int offset):把指定通道中的数据按偏移量读取到ByteBuffer中;advance():读取下一帧数据release(): 读取结束后释放资源 MediaExtractor extractor = new MediaExtractor(); extractor.setDataSource(...); int numTracks = extractor.getTrackCount(); for (int i = 0; i < numTracks; ++i) { MediaFormat format = extractor.getTrackFormat(i); String mime = format.getString(MediaFormat.KEY_MIME); if (weAreInterestedInThisTrack) { extractor.selectTrack(i); } } ByteBuffer inputBuffer = ByteBuffer.allocate(...) while (extractor.readSampleData(inputBuffer, ...) >= 0) { int trackIndex = extractor.getSampleTrackIndex(); long presentationTimeUs = extractor.getSampleTime(); ... extractor.advance(); } extractor.release(); extractor = null; 使用MediaCodec的编解码流程

一些编解码器对于它们的buffer要求是比较特殊的,比如内存对齐或是有特定的最小最大限制,为了适应广泛的可能性,buffer分配是由编解码器实现的。

这看起来和“零拷贝”原则是相悖的,但大部分情况发生拷贝的几率是比较小的,因为编解码器并不需要复制或调整这些数据来满足要求,而且大多数情况可以直接使用buffer,比如直接从磁盘或网络读取数据到buffer中,不需要复制。

MediaCodec采用异步方式处理数据,并且使用了一组输入输出的buffer(ByteBuffer)。

使用者从MediacCodec请求一个空的输入buffer(ByteBuffer),填充满数据后将它传递给MediaCodec处理。MediaCodec处理完这些数据并将处理结果输出至一个空的输出buffer(ByteBuffer)中。使用者从MediaCodec获取输出buffer的数据,消耗掉里面的数据,使用完输出buffer的数据之后,将其释放回编解码器。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。