如何处理 Android MediaCodec 解码器的第一个输出 ByteBuffer?

2024-06-24

我正在尝试使用 Android 的 MediaCodec 套件编写音频重采样器。

我目前正在将 MP3 立体声音频文件输入 MediaExtractor,然后由 MediaCodec 进行解码。源音频的采样率为48000。

我不明白的是我从解码器收到的前四个输出缓冲区:

  1. 大小 0,时间 0
  2. 尺寸 0,时间 24000
  3. 尺寸4312,时间48000
  4. 尺寸4608,时间72000
  5. 尺寸4608,时间96000
  6. etc.

From 这个答案 https://stackoverflow.com/a/37882247/4639640, 这个答案 https://stackoverflow.com/a/22771864/4639640, and 本文 https://developer.apple.com/library/content/documentation/QuickTime/QTFF/QTFFAppenG/QTFFAppenG.html,我相信前两个缓冲区只是传播“编码器延迟”,可能会被丢弃。然而,我列出的第三个缓冲区让我陷入了困境。

对于缓冲区#4(及以后),数学计算结果为:

((4608 bytes) / (2 bytes/sample) / (2 channels)) 
    / ((48,000 samples/sec) / (1,000,000 us/sec))
= 24,000 us (i.e. the change in time between buffers)

缓冲区 #3 发生了什么?对数据的简单理解表明,音频在 48000 us 时刻开始播放,然后在 72000 us 标记之前暂停片刻,此时开始连续播放,不间断。

看起来更有可能的是,在缓冲区 #3 的数据之前有 296 个隐藏的 0,但是这个偏移量似乎没有由我的代码中的任何变量指示。有人能为我解释一下吗?


据我所知,音频 MediaCodec stuff* 并不真正关心与每个缓冲区关联的时间戳。相反,它只是假设字节流中没有漏洞,使用指定的比特率神奇地重新计算每条数据的时间戳。

作为这一假设的支持证据,解决方案之一这个答案 https://stackoverflow.com/a/27854883/4639640只是建议增加时间戳值,而不是实际计算正确的时间戳。

因此,在这个问题的示例中,音频 MediaCodec stuff* 将完全忽略所有时间戳值。 MediaCodec 将假定缓冲区 #3 字节 #1 为时间 0,并且缓冲区 #4 字节 #1 的时间将从迄今为止处理的字节数推断出来,not取为 24000 或 48000。

*即 MediaCodec 对象或一些相关的自定义组件

注意:MediaCodec 视频编码器似乎确实关心时间戳。

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

如何处理 Android MediaCodec 解码器的第一个输出 ByteBuffer? 的相关文章

随机推荐

  • Jenkins - 设置向导空白?

    我尝试设置一个安装了 Jenkins 的 docker 映像 我使用了向导 输入了初始密码 并安装了推荐的插件 之后 当我连接到 localhost 8080 页面时 我只得到一个空白页面詹金斯初始页面 https i stack imgu
  • 在 URL 中嵌入 ETag

    有关 Play 中资产指纹识别的问题 如何要求 Play 在 URL 中嵌入 ETag 而不使用第三方插件 例如 如果 css resource cssETag 为1234 那么它就会变成 css responsive 1234 css 相
  • 使用ngx-print打印图像的问题

    图像未使用 ngx print 打印 我不确定我在这里做错了什么 HTML
  • 检查 pyspark df 列的值是否存在于其他 pyspark df 列中

    我有 2 个 pyspark 数据帧 我想检查一列的值是否存在于另一个数据帧的列中 我只看到了如何过滤存在的值的解决方案 像这样 https stackoverflow com questions 41775281 filtering a
  • 打印泰语

    我有一个使用 ESC POS 将收据打印到收据打印机的应用程序 它需要支持泰语 当我尝试打印泰语时 一些字符被分开 如下图所示 这是我的代码 printMSG Command ESC t Command DecimalToCharStrin
  • 哈希函数何时彼此正交?

    哈希函数何时彼此正交 您能提供一个 Java 中两个彼此正交的哈希函数的示例吗 From 正交哈希函数 两个哈希函数h1和h2是正交的 如果对于所有状态 s s S 且 h1 s h1 s 且 h2 s h2 s 我们有 s s S Ede
  • Doctrine2 命名查询

    我在 Doctrine2 中找不到任何有关命名查询的文档 请帮忙 Doctrine2 有命名查询功能吗 您可以使用 命名查询 DQL 例子 use Doctrine ORM Mapping NamedQuery use Doctrine O
  • 使用 AVAssetWriter 录制视频时获取视频的持续时间

    我有一堂课将视频和音频录制到 mp4 文件中 我用AVAssetWriter AVAssetWriterInput做这样的任务 使用这种方法录制视频时如何获取视频的持续时间 AVAssetWriter 开始startSession时可以节省
  • 如果等于特定值则替换列

    我希望替换 CSV 中的第四列 如果它等于 N A 我正在尝试将其更改为 1 我似乎无法让它发挥作用 awk F if 4 N A 4 1 test csv 您可以使用以下内容awk awk F 4 4 N A 1 4 1 OFS test
  • 在 Laravel 4 路由中接受编码的 URL

    我正在 Laravel 4 Beta 5 中开发一个网站 我试图将编码的 URL 传递到路由器 问题是 编码的 URL 中包含百分比等 因此它被 Laravel 阻止 URL 使用 Javascript 函数进行编码encodeURICom
  • 在 Android 模拟器中访问 google api 时出现运行时错误

    我正在尝试访问 googleFit API 看起来很简单 获取谷歌登录权限和所需的授权 然后查询步数 我的代码似乎不起作用 当我调试它时 fitnessOption声明部分抛出 源代码与字节码不匹配 错误 我清理了我的项目 重建它但不起作用
  • 如何在使用 Android Paging 3 库时显示空视图

    我正在使用 Paging 3 库 我可以检查刷新状态是否为 正在加载 或 错误 但我不确定如何检查 空 状态 我可以添加以下条件 但我不确定其条件是否正确 adapter loadStateFlow collectLatest loadSt
  • ExcelDna F# 和可选参数

    对于标量 即非类似数组 可选参数 我将使用以下模式
  • 如果我在计算强连通分量时不使用 G 转置会怎样?

    我正在阅读算法导论 在 22 5 强连通分量中 算法 STRONGLY CONNECTED COMPONENT G 定义为 调用 DFS G 计算每个顶点 u 的完成时间 u f 计算 G 转置 调用 DFS G transpose 但在
  • 如何给 Git 控制台着色?

    我最近看到gitWindows 中的控制台是彩色的 例如绿色表示添加 红色表示删除等 我如何为我的颜色上色git这样的控制台 为了安装它 我使用了以下命令 sudo apt get install git core As noted htt
  • 如何让浏览器或 PHP 缓存 fetch() 请求?

    这基本上是相反的fetch 如何发出非缓存请求 https stackoverflow com questions 29246444 fetch how do you make a non cached request 假设我们有客户端 d
  • 用于生成和使用 JSON 的控制器的 Spring RequestMapping

    具有多个消费和生产的 Spring 控制器application json 我的代码充满了长注释 例如 RequestMapping value foo method RequestMethod POST consumes MediaTyp
  • ASP.NET MVC - 服务层,每个控制器操作中的单个或多个服务?

    我开始在我的 MVC 项目中实现一个服务层 以精简一些臃肿的控制器 它也有存储库 工作单元模式 我的问题是 如果您的页面有一个复杂的视图模型 其中包含大量子对象等 并且在幕后有大量逻辑发生 让您了解原始开发人员编写的控制器有近 4000 行
  • 检查NLog中是否发生日志事件

    我正在尝试检查我的应用程序中是否发生了日志事件 以及它是否执行了某些操作 我已经检查了所有地方 似乎找不到任何有关日志事件是否发生的信息 private static Logger logger LogManager GetCurrentC
  • 如何处理 Android MediaCodec 解码器的第一个输出 ByteBuffer?

    我正在尝试使用 Android 的 MediaCodec 套件编写音频重采样器 我目前正在将 MP3 立体声音频文件输入 MediaExtractor 然后由 MediaCodec 进行解码 源音频的采样率为48000 我不明白的是我从解码