手游网 手游攻略 手游评测 解码器 mqa,mdac20解码器

解码器 mqa,mdac20解码器

时间:2024-08-12 16:21:18 来源:头条 浏览:0

1. MediaCodec 工作原理MediaCodec 类是Android 提供的用于访问低级多媒体编解码器/解码器接口,是Android 低级多媒体架构的一部分,通常与MediaExtractor、MediaMuxer 和AudioTrack 结合使用。它可以编解码H.264、H.265、AAC、3GP等流行的音视频格式。从广义上讲,MediaCodec 的工作原理是处理输入数据并生成输出数据。具体来说,MediaCodec在编码和解码过程中使用一组输入/输出缓冲区来同步或异步处理数据。首先,客户端将需要编解码的数据写入到获得的编解码器输入缓冲区中,然后发送给编解码器。编解码器处理完毕后,将编解码器传输到编码器的输出缓冲区,同时恢复客户端对输入缓冲区的所有权,之后客户端从编解码器的输出缓冲区进行读取。处理完成后,编解码器将输出缓冲区的所有权收回给客户端。重复整个过程,直到编码器停止工作或崩溃。媒体编解码器的作用是处理输入数据并产生输出数据。首先,教师创建一个输入数据缓冲区,并将数据提供给缓冲区中的编解码器。编解码器异步处理输入数据,并在输出缓冲区中将数据提供给使用者。当消费者消费完成后,缓冲区中的空间返回给编解码器。

2、MediaCodec编码流程:在整个编解码过程中,MediaCodec的使用要经历几个过程:配置、启动、数据处理、停止、释放。对应的状态可以概括为停止、运行、释放。 ),而停止状态又可以细分为未初始化(uninitialized)、已配置(configured)、异常(error)。执行状态还可以细分为读写数据(flushed)、运行(running)、运行中(running)。流结束(流结束)。 MediaCodec整体状态结构图如下:

从上图中可以看到,MediaCodec在创建时处于未初始化状态,但是一旦设置了配置信息并调用start()启动后,MediaCodec就处于运行状态,可以进行数据读写操作。您将能够运行。如果在此过程中出现错误,则MediaCodec处于停止状态,必须使用reset方法重置编解码器。否则,MediaCodec所持有的资源最终会被释放。当然,如果MediaCodec正常使用,也可以向编解码器发送EOS指令,调用stop和release方法来结束编解码器的使用。

3. MediaCodec API 描述了MediaCodec 如何处理特定的视频流。主要方法有:

getInputBuffers:获取需要编码的输入流队列,返回ByteBuffer数组queueInputBuffer:输入流入队列dequeueInputBuffer:从输入流队列获取数据进行编码操作getOutputBuffers:编解码后的数据输出流获取队列返回ByteBuffer数组dequeueOutputBuffer:从输出队列中获取编码操作后的数据releaseOutputBuffer:处理完成后释放ByteBuffer数据4、MediaCodec基本上使用所有同步模式MediaCodec API遵循一个模式:创建和配置MediaCodec并循环直到处理完对象: 如果输入缓冲区准备就绪,则读取输入块并将其复制到输入缓冲区。当输出缓冲区准备就绪时,复制输出缓冲区的数据并释放MediaCodec 对象。

(1)创建编解码器/解码器MediaCodec主要提供了两个创建编解码器的方法:createEncoderByType(String type)和createDecoderByType(String type),这两个方法都是以MIME类型多媒体格式传递的。常见的MIME类型多媒体格式有: "video/x-vnd.on2.vp8" - VP8 视频(即.webm 中的视频) "video/x-vnd.on2.vp9" - VP9 视频(即.webm 中的视频.webm) “video /avc” H.264/AVC 视频“video/mp4v-es” MPEG4 视频“video/3gpp” H.263 视频“audio/3gpp” AMR 窄带音频“audio/amr- wb” AMR 宽带音频 “audio/mpeg” - MPEG1/2 音频层III “audio/mp4a-latm” - AAC 音频(这是原始AAC 数据包,未使用LATM 打包)注) “audio/vorbis” - vorbis 音频 “音频/g711-alaw" - G.711 alaw 音频 "audio/g711-mlaw" - G.711 ulaw 音频当然,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++) { //Codec 依赖信息存储在MediaCodecInfo 中MediaCodecInfo codecInfo=MediaCodecList.getCodecInfoAt(i); //判断是否是编码器if (!codecInfo.isEncoder()) { continue; } //判断编码器支持哪些MIME 类型Get 并匹配它们String[] type=codecInfo .getSupportedTypes(); for (int j=0; jtables.length; j++) { if (types[j].equalsIgnoreCase(mimeType)) { return codecInfo; } } } return null; }(2) 配置,启动编解码器/解码器对于编解码器配置,请使用MediaCodec 的configure 方法。该方法首先提取MediaFormat中存储的数据映射,然后调用本地方法native-configure来配置编解码器。在配置过程中,configure 方法必须传递format、surface、crypto 和flags 参数。 format 是MediaFormat 的一个实例,它使用“key-value”键值对来存储多媒体数据格式信息。使用表面。数据来源来自表面。 crypto 用于指定MediaCrypto 对象以安全地解密媒体数据。 flags 表示编码器(CONFIGURE_FLAG_ENCODE) 已设置。

MediaFormat mFormat=MediaFormat.createVideoFormat('video/avc', 640,480); //创建MediaFormat mFormat.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时的配置方法。 createVideoFormat("video/avc", 640, 480) 是“video/avc”(即H.264)编码器类型的MediaFormat 对象。视频数据的宽度和高度要对音频数据进行编码和解码,请调用MediaFormat 的createAudioFormat(String mime, int sampleRate, int channelCount) 方法。除了视频帧率、音频采样率等一些配置参数外,这里我们还需要重点关注MediaFormat.KEY_COLOR_FORMAT配置属性。该属性用于指示视频编码器的颜色格式。具体来说,它指示选择哪种颜色格式。与输入视频数据源的颜色和格式有关。例如,我们都知道相机预览中捕获的图像流通常是NV21或YV12,因此编码器必须指定相应的颜色格式。如果不指定,编码后的数据可能会出现模糊、重叠、颜色失真等情况。 MediaCodecInfo.CodecCapability.存储编码器支持的所有颜色格式。常见的颜色格式映射如下:

Raw Data Encoder NV12(YUV420sp) ——— COLOR_FormatYUV420PackedSemiPlanar NV21 ———- COLOR_FormatYUV420SemiPlanar YV12(I420) ———- COLOR_FormatYUV420Planar 设置完编解码器后,就可以调用MediaCodec 的start() 方法了。使用低级native_start()方法启动编码器,并调用低级方法ByteBuffer[] getBuffers(input)来打开一组输入和输出缓冲区。 start()方法的源码如下:

public Final void start() {native_start(); synchronized(mBufferLock) {cacheBuffers(true /* input */); cacheBuffers(false /* input */); } }(3) 数据处理MediaCodec 支持两种编码模式,所谓同步模式是指编解码器数据输入和输出是同步的,编解码器处理输出后才再次接收输入数据。异步编解码器数据输入和输出是异步的,因此编解码器不会等待。在再次接收输入数据之前处理的输出数据。这里主要介绍同步编解码,因为它使用的比较频繁。当编解码器启动时,已知每个编解码器都有一组输入和输出缓冲区,但这些缓冲区暂时不可用。获得输入和输出缓冲区授权的唯一方法是使用MediaCodec 的dequeueInputBuffer/dequeueOutputBuffer 方法。用于操作这些缓冲区的ID。下面,我们使用官方提供的代码进行扩展分析。

MediaCodec codec=MediaCodec.createByCodecName(name); codec.configure(format, …); MediaFormat OutputFormat=codec.getOutputFormat(); //选项B codec.start(); for (;) { int inputBufferId=codec.dequeueInputBuffer (timeoutUs); if (inputBufferId=0) { ByteBuffer inputBuffer=codec.getInputBuffer(…); //用有效数据填充inputBuffer … codec.queueInputBuffer(inputBufferId, …); } int OutputBufferId=codec.dequeueOutputBuffer( …); if (outputBufferId=0) { ByteBuffer OutputBuffer=codec.getOutputBuffer(outputBufferId); MediaFormatbufferFormat=codec.getOutputFormat(outputBufferId); //选项A //缓冲区格式与输出格式相同//输出缓冲区已准备好渲染… Codec.releaseOutputBuffer(outputBufferId, …); } else if (outputBufferId==MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) { //后续数据将符合新格式//使用getOutputFormat(outputBufferId) 可以忽略if OutputFormat=codec.getOutputFormat( ); //从上面的代码可以看出,编解码器一旦启动,就会进入for(;)循环,从而导致无限循环,从而实现不断删除。从编解码器的输入缓冲池获取包含数据的缓冲区,并从输出缓冲池获取编码和解码的输出数据。

最后我们还整理了音视频开发相关的学习文档。我希望它能帮助你学习和进步。如果需要参考,请直接私信“1”给我参考。

标题:解码器 mqa,mdac20解码器
链接:www.ggaan.com/news/sypc/3267.html
版权:文章转载自网络,如有侵权,请联系删除!
资讯推荐
更多
绯红之境兑换码最新2021 礼包兑换码大全

绯红之境兑换码最新2021 礼包兑换码大全[多图],绯红之境兑换码怎么领取?绯红之境兑换码有哪些?绯红之境在今日

2024-08-12
妄想山海怎么加好友 加好友方法大全

妄想山海怎么加好友 加好友方法大全[多图],妄想山海添加好友功能在哪里?妄想山海添加好友的方法是什么?好友添

2024-08-12
三国群英传7霸王再临攻略 霸王再临攻略技巧开启方法

三国群英传7霸王再临攻略 霸王再临攻略技巧开启方法[多图],三国群英传7霸王再临怎么玩?三国群英传7霸王再临

2024-08-12
江南百景图又见桃花村钓鱼位置在哪?又见桃花村钓鱼攻略

江南百景图又见桃花村钓鱼位置在哪?又见桃花村钓鱼攻略[多图],江南百景图又见桃花村钓鱼怎么钓?又见桃花村钓

2024-08-12