MediaCodec 编码解码踩坑记录

2023-05-16

概述
  在MediaCodec的生命周期内存在三种状态:Stopped, Executing or Released,其中
  Stopped状态包含三种子状态:Uninitialized, Configured and Error
  Executing状态包含三种子状态:Flushed, Running and End-of-Stream
  由于MediaCodec在不同的数据处理模式下状态间的转换会有些许差别,故接下来我们分别对同步处理模式及异步处理模式下的状态转换做详细分析


同步模式下的状态转换(Synchronous Processing using Buffers)
  首先我们先看一下状态转换的流程图,如下:
  1. 当通过 MediaCodec.createByCodecName(...) or MediaCodec.createDecoderByType(...) or MediaCodec.createEncoderByType(...)三种方法中的任一种创建一个MediaCodec对象实例后,Codec将会处于 Uninitialized 状态;
  2. 当你调用 MediaCodec.configure(...)方法对Codec进行配置后,Codec将进入 Configured 状态;
  3. 之后可以调用 MediaCodec.start() 方法启动Codec,Codec会转入 Executing 状态,start后Codec立即进入 Flushed 子状态,此时的Codec拥有所有的input and output buffers,Client无法操作这些buffers;
  4. 一旦第一个input buffer 出队列,也即Client通过调用 MediaCodec.dequeueInputBuffer(...)请求得到了一个有效的input buffer index, Codec立即进入到了 Running 子状态,在这个状态下Codec会进行实际的数据处理(解码、编码)工作,度过它生命周期的主要阶段;
  5. 当输入端入队列一个带有 end-of-stream 标记的input buffer时(queueInputBuffer(EOS)),Codec将转入 End of Stream 子状态。在此状态下,Codec不再接受新的input buffer数据,但仍会处理之前入队列而未处理完的input buffer并产生output buffer,直到end-of-stream 标记到达输出端,数据处理的过程也随即终止;
  6. 在 Executing状态下可以调用 MediaCodec.flush()方法使Codec进入 Flushed 子状态;
  7. 在 Executing状态下可以调用 MediaCodec.stop()方法使Codec进入 Uninitialized 子状态,可以对Codec进行重新配置;
  8. 极少数情况下Codec会遇到错误进入 Error 状态,可以调用 MediaCodec.reset() 方法使其再次可用;
  9. 当MediaCodec数据处理任务完成时或不再需要MediaCodec时,可使用 MediaCodec.release()方法释放其资源。
异步模式下的状态转换(ASynchronous Processing using Buffers)
  首先我们先看一下状态转换的流程图,如下:
  异步模式下状态转换与同步模式下大同小异,主要有两点区别:
  1. 调用 MediaCodec.start() 方法启动Codec,Codec会直接转入 Running 子状态;
  2. 当调用 MediaCodec.flash() 方法进入 Flushed 子状态后,必须调用 MediaCodec.start() 方法Codec才会进入 Running 子状态。
  其他情况下均与同步模式下相同,就不在此赘述。

更新于2019.01.17------------------------------

1.录音后开始编码,还没开始给编码器喂数据,编码器已经吐出来2个字节的数据,以为该数据是脏数据,就扔掉了,在解码的时候,没有解析该2byte的数据,导致程序抛出异常;也就是说在初始化完成以后MediaCodec就会吐出2byte字节,这2字节记录了当前编码器的一些信息,编码格式、编码位数,频道数等,是重要的信息不可扔掉。

ByteBuffer outBuf = mMediaCodec.getOutputBuffer(outIndex);

2.解码器解码后给AudioTrack播放,最后1S数据没有播放的问题,因为AudioTrack设置的有缓存大小,是因为缓存没有满没有播放,在播放最后一帧数据后再把缓冲填满来解决该问题。

byte[] bufferTmp = new byte[RealTimeTalkCommon.AUDIO_MIN_BUF_SIZE];
Arrays.fill(bufferTmp,(byte)0);
mAudioTrack.write(bufferTmp,0,bufferTmp.length);

3.MediaCodec在处于end-of-stream的状态时,如何重新回到工作状态(Running),mDecoder.flush();mDecoder.start();要同时调用才起作用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MediaCodec 编码解码踩坑记录 的相关文章

  • 无人机各个类型介绍

    为了执行 xff0c 无人机可能由类似的元件制成 xff0c 但无论是它们的能力 xff0c 还是由什么组成的 xff0c 它们都在某种程度上有所不同 大多数无人机都是为了执行特定任务而制造的 xff0c 因此以特定的方式建造 xff0c
  • 知识图谱概述(图谱学苑课程)

    1 知识图谱概念 知识图谱本质上是基于图的语义网络 xff0c 表示实体和实体之间的关系 构建知识图谱的目的 xff0c 就是让机器具备认知能力 xff0c 理解这个世界 2 知识图谱研究的多个维度 2 1 知识图谱相关发展领域 知识图谱是
  • 关于keils中#include后的双引号““与尖引号<>的区别

    关于keils中 include后的双引号 34 34 与尖引号 lt gt 的区别 关于 include 后的 与 lt gt KEILS中 include后的 与 lt gt 关于 include 后的 与 lt gt lt gt 搜索
  • UC/OS-III学习——触发PendSV中断

    UC OS III学习 触发PendSV中断 前言一 关于PendSV的基础知识二 代码1 c语言2 汇编语言 前言 PendSV典型使用场合是在上下文切换时 xff08 在不同任务之间切换 xff09 本文主要介绍触发PendSv中断的两
  • 数据结构与算法(C语言)------顺序线性表

    顺序线性表 定义 xff1a 线性表的顺序存储结构 xff0c 指的是用一段地址连续的存储单元依次存储线性表的数据元素 线性表的顺序存储的结构代码 xff1a span class token macro property span cla
  • 操作系统---内存管理

    操作系统之内存管理 内存管理1 概念2 内存空间的分配和回收内存空间的分配和回收会需要实现的功能用户空间的分配进程空间的分配内存分配策略 从逻辑地址到物理地址的转换 内存管理 1 概念 1 什么是内存 xff1f 首先从硬件的角度去理解内存
  • C/C++中字符串和数字之间的转换

    1 数字转换成字符串 1 采用to string 函数 std string to string int value std string to string long value std string to string long lon
  • Xmanager 5 远程连接linux图形界面

    准备环境 xff1a Windows客户端安装 Xmanager 软件我用的Xmanager Enterprise 5 Linux系统环境 root span class hljs property 64 localhost span sp
  • Git将本地仓库上传到Github远程仓库

    1 本地配置SSH keys 1 在本地创建ssh key xff08 进入windows根目录 xff09 ssh keygen t rsa C span class token string 34 email addr 64 email
  • 什么是伺服电机的电流环、速度环、位置环和带宽?

    FAQ What are servo motor current velocity and position loops and bandwidths 伺服电机在闭环系统中运行 xff0c 该系统包括反馈装置 驱动器 xff08 放大器 x
  • ROS创建功能包,catkin_make没有编译,没出CMake的log

    问题描述 xff1a 我需要在原有的ROS工程基础之上 xff0c 新建一个ROS功能包 我直接复制了目录下原有的一个包 xff0c 进行修改 然后恶心的事来了 xff1a catkin make后竟然没有反应 甚至没有检测到我新改写的cm
  • TypeScript 对象动态添加属性和删除属性

    1 准备对象数组 span class token keyword let span cities span class token operator 61 span span class token punctuation span sp
  • 计算机 原码、反码、补码(相互转化)

    一 基本概念 在计算机系统中 xff0c 数值一律用补码来表示和存储 原因在于 xff0c 使用补码 xff0c 可以将符号位和数值域统一处理 xff1b 同时 xff0c 加法和减法也可以用补码统一处理 此外 xff0c 补码与原码相互转
  • 一、PX4环境搭建和编译(Ubuntu 16.04、ROS kinetic)

    Ubuntu16 04 xff32 xff2f xff33 xff1a kinetic 源于 官网PX4开发指南 v1 10 0 lt master gt https dev px4 io v1 10 zh 稍微参考一下这个网站 xff1a
  • 二、MAVROS的安装(PX4:v1.10.0 \ ROS:kinetic)

    mavros 功能包提供了 一台能够运行ros的机载电脑 支持MAVLINK协议的飞控和支持MAVLINK的地面站这三者之间的通讯功能 MAVROS 是 ROS 与 MAVLink 协议之间的 有 34 官方 34 支持的ROS功能包 它当
  • 三、MAVROS功能包的offboard模式控制例子

    这里介绍了介绍了使用 Gazbo SITL 中模拟的四轴飞行器 Offboard 控制的基础知识 如何通过MAVROS功能包的offboard模式控制gazebo中的飞机起飞到高度两米 主要过程 xff1a 要先解锁无人机 xff0c 在切
  • 四、无人机知识笔记(初级:基本运动原理)

    笔记来源于 xff1a 沈阳无距科技 工业级无人机的中国名片 xff08 编程外星人 xff09 目录 一 多旋翼直升机 二 基本飞行姿态 三 多旋翼飞行原理 四 反扭力与偏航运动 五 螺旋桨 六 有刷电机和无刷电机 七 电调与PWM信号
  • WinIo驱动级键盘模拟编程

    前天无聊 xff0c 翻翻自己的兴趣项目文件夹 xff0c 发现了这个放下很久的项目 xff01 那是大三时候的事了 当时是为了提高我魔兽三的按键速度 xff0c 用了个叫移花接木的软件 xff0c 把键盘的键位改了 的确是有所帮助 xff
  • 五、无人机知识笔记(中级:控制原理与程序实现)

    笔记来源于 xff1a 沈阳无距科技 工业级无人机的中国名片 xff08 编程外星人 xff09 目录 一 飞控整体架构 一 数据存储 xff08 Storage xff09 二 外部通讯 xff08 External Connectivi
  • 九、键盘控制无人机 · 中(multirotor_communication.py解读)

    笔记来源于开源项目 xff1a 基于PX4和ROS的无人机仿真平台 来源于开源项目 xff1a GAAS 目录 一 解读启动通信的multirotor communication py脚本 1 库函数以及消息服务 2 class Commu

随机推荐