1.media转码软件的原理。

转码软件是安卓系统给予的用以浏览低等多媒体系统伺服电机/视频解码器的插口,是安卓系统低等多媒体系统构架的一部分。它往往与MediaExtractor.MediaMuxer和AudioTrack融合应用,能够对H.264.H.265.AAC.3gp等普遍音频视频文件格式开展编解码。

理论来讲,MediaCodec根据解决键入数据信息来转化成輸出数据信息。从总体上,MediaCodec应用一组键入/輸出缓冲区域,在编号和编解码全过程中同歩或多线程解决数据信息。最先,手机客户端将待编码解码的数据信息载入获得的转码软件键入缓冲区域,递交给转码软件,转码软件解决后,传送到伺服电机的輸出缓冲区域,与此同时修复手机客户端对键入缓冲区域的使用权。随后,手机客户端从得到的转码软件輸出油压缓冲器载入编码数据开展解决,而且转码软件在解决进行以后将手机客户端的使用权取回到輸出油压缓冲器。反复全部全过程,直至伺服电机停止工作或出现异常撤出。

转码软件的功用是解决键入数据信息并产生輸出数据信息。最先,转化成键入数据信息油压缓冲器,并将数据信息添充在油压缓冲器中并给予给转码软件。转码软件将以多线程方法解决键入数据信息,随后将添充的輸出缓冲区域给予给顾客,顾客在购物后将缓冲区域回到给转码软件。

二.MediaCodec编号全过程。

在全部编解码全过程中,MediaCodec的应用会历经配备.运行.数据处理方法.终止.释放出来等好多个全过程,相匹配的情况能够归纳为终止.实行.释放出来。终止情况可细分化为未复位.已配备和不正确,实行情况可细分化为更新.运作和流完毕。

转码软件的总体情况框架图如下所示:

音频解码器是干什么用的-解码器的主要功能-第1张图片从图中能够看得出,在建立MediaCodec时,它将进到未复位情况。设定配备信息内容并启用start()后,MediaCodec将加入运作情况,能够读写能力数据信息。假如在这个环节中发生不正确,MediaCodec将进到Stopped情况,因此大家只要应用reset方式对Codec开展重设,不然MediaCodec拥有的資源最后会被释放出来。自然,假如MediaCodec应用一切正常,大家还可以向Codec推送EOS命令,启用终止和释放出来方式来停止codec的应用。

三.新闻媒体转码软件运用程序编写插口表明。

转码软件能够解决特殊的rtmp协议,关键根据下列方法:

getInputBuffers:获得必须编码数据的键入流序列,回到的是一个ByteBuffer二维数组queueInputBuffer:键入注入序列dequeueInputBuffer:从键入流序列中取数据信息开展编号实际操作getOutputBuffers:获得编解码以后的数据信息輸出流序列,回到的是一个ByteBuffer二维数组dequeueOutputBuffer:从輸出序列中取下编号实际操作以后的数据信息releaseOutputBuffer:解决进行,释放出来ByteBuffer数据信息

第四,MediaCodec的基本上使用方法。

全部同歩方式的新闻媒体转码软件运用程序编写插口遵循一种方式:

并建立一个MediaCodec目标循环系统,直至进行:假如键入缓冲区域已准备好,则载入一个键入块并将其拷贝到键入缓冲区域中;假如輸出缓冲区域就绪,拷贝輸出缓冲区域中的数据信息以释放出来MediaCodec目标。

(1)建立伺服电机/视频解码器。

MediaCodec关键给予createEncoderByType(字符串类型)和createDecoderByType(字符串类型)二种办法来建立转码软件,这2种方式都必须以MIME种类的多媒体系统文件格式传送。普遍的MIME多媒体系统文件格式如下所示:●“video/x-vnd . on2 . vp8”-vp8 video(即video in . webm)●“video/x-vnd . on2 . vp9”-vp9 video(即video in . webm)●“video/AVC”-h . 264/AVC video●“video/mp4v-es”-MPEG4 video●“video/3gpp”-h . 263 video●“audio/3gpp”-AMR捷变声频)●“audio/vor bis”–vor bis audio●“audio/g711-alaw”–g . 711 alaw audio●“audio/g711-mlaw”–g . 711 ulaw audio。自然,MediaCodec还给予了createByCodecName(字符串数组名字)方式,该方式适用建立具备特殊部件名字的转码软件。可是,这类方式应用起來有点不便,官方网提议最好是与MediaCodecList一起应用,由于MediaCodecList纪录了全部可以用的转码软件。自然,大家还可以应用这一类来分辨传到的minmeType主要参数,以配对MediaCodec是不是认可这类mineType种类的转码软件。

以MIME种类为“video/avc”为例子,编码如下所示:

private static MediaCodecInfo selectCodec(String mimeType) { // 获得全部适用转码软件总数 int numCodecs = MediaCodecList.getCodecCount(); for (int i = 0; i < numCodecs; i ) { // 转码软件关联性信息内容存放在MediaCodecInfo中 MediaCodecInfo codecInfo = MediaCodecList.getCodecInfoAt(i); // 分辨是不是为伺服电机 if (!codecInfo.isEncoder()) { continue; } // 获得伺服电机适用的MIME种类,并开展配对 String[] types = codecInfo.getSupportedTypes(); for (int j = 0; j < types.length; j ) { if (types[j].equalsIgnoreCase(mimeType)) { return codecInfo; } } } return null; }

(2)配备并运行伺服电机/视频解码器。

转码软件配备应用MediaCodec的configure方式,最先获取MediaFormat中储存的数据信息投射,随后启用当地方式native-configure来配备转码软件。配备时,configure方式必须传到format.surface.crypto和flags等主要参数,在其中format是MediaFormat的一个案例,以键值对的方式储存多媒体系统数据类型信息内容。Surface用以表明视频解码器的数据库来源于这一surface;数据加密用以特定用以安全性破译新闻媒体数据信息的MediaCrypto目标。标示标示伺服电机已配备(配备标示编号)。

MediaFormat mFormat = MediaFormat.createVideoFormat("video/avc", 640 ,480); // 建立MediaFormatmFormat.setInteger(MediaFormat.KEY_BIT_RATE,600); // 特定视频码率mFormat.setInteger(MediaFormat.KEY_FRAME_RATE,30); // 特定帧数mFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT,mColorFormat); // 特定伺服电机色调文件格式 mFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL,10); // 特定关键帧间隔时间mVideoEncodec.configure(mFormat,null,null,MediaCodec.CONFIGURE_FLAG_ENCODE);

之上编码是编号H.264时的配备方式,createvideo format(“video/avc”,640,480)是“video/AVC”种类(即H.264)伺服电机的MediaFormat目标,必须特定视頻数据信息的间距和相对高度。启用MediaFormat的createaudioformat方式(字符串数组mime.int采样频率.int安全通道记数)。除开视频帧率.音频采样率等一些配备主要参数外,还必须重点关注MediaFormat的配备特性。KEY_COLOR_FORMAT,用以表明视频编码器的色调文件格式,挑选哪种色文件格式与键入视頻数据库的色调文件格式相关。例如大家都了解Camera浏览捕捉的图象流一般是NV21或YV12,因此伺服电机必须特定有效的色调文件格式,不然编号后的数据信息很有可能会发生屏幕闪烁.黑影累加.色调失帧等状况。Codecinfo.codeccapacities .储存伺服电机适用的所有颜色文件格式,普遍色调文件格式投射如下所示:

原始记录 伺服电机 NV12(YUV420sp) ———> COLOR_FormatYUV420PackedSemiPlanar NV21 ———-> COLOR_FormatYUV420SemiPlanar YV12(I420) ———-> COLOR_FormatYUV420Planar

转码软件配备进行后,能够启用MediaCodec的start()方式,该方式将启用低等native_start()方式运行伺服电机,启用低等方式ByteBuffer[] getBuffers(input)开启一系列I/O缓冲区域。

start()方式的源码如下所示:

public final void start() { native_start(); synchronized(mBufferLock) { cacheBuffers(true /* input */); cacheBuffers(false /* input */); } }

(3)数据处理方法。

MediaCodec适用二种形式的转码软件,即同步和异步。说白了同歩方式就是指转码软件数据信息的填写和輸出是同歩的,转码软件仅有在解决完輸出后才会再度接受导入数据信息。多线程转码软件数据信息的填写和輸出是单线程的,转码软件在再度接受导入数据信息以前不容易等候輸出数据信息被解决。这儿关键详细介绍同歩编解码,由于大家用的比较多。我们知道,当转码软件运作时,每一个转码软件都是会有一组键入和輸出缓冲区域,但这种缓冲区域临时没法应用。仅有根据MediaCodec的摘帽键入缓冲区域/摘帽輸出缓冲区域方式,才可以得到I/O缓冲区域的受权,并根据回到的ID来实际操作这种缓冲区域。使我们根据一个官方网编码来剖析这一拓展:

MediaCodec codec = MediaCodec.createByCodecName(name); codec.configure(format, …); MediaFormat outputFormat = codec.getOutputFormat(); // option B codec.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();

从里面的编码能够看得出,当转码软件运作时,它会键入一个for(;;)循环系统,这是一个不断循环,便于从转码软件的键入缓存池里持续得到包括数据信息的缓冲区域,随后从輸出缓存池里得到编号的輸出数据信息。

评论(0条)

刀客源码 游客评论