如何理解MediaCodec的用户界面来提高编解码器性能?

2024-03-30

媒体编解码器的官方文件 https://developer.android.com/reference/android/media/MediaCodec#data-types said:

数据类型 编解码器对三种数据进行操作:压缩数据、原始音频数据和原始视频数据。所有三种数据都可以使用 ByteBuffer 进行处理,但您应该使用 Surface 来处理原始视频数据,以提高编解码器性能。 Surface 使用本机视频缓冲区,而不将它们映射或复制到 ByteBuffers;因此,它的效率要高得多。使用 Surface 时通常无法访问原始视频数据,但可以使用 ImageReader 类访问不安全的解码(原始)视频帧。这可能仍然比使用 ByteBuffers 更有效,因为一些本机缓冲区可能会映射到直接 ByteBuffers 中。使用 ByteBuffer 模式时,您可以使用 Image 类和 getInput/OutputImage(int) 访问原始视频帧。

这怎么理解呢?您应该使用 Surface 来处理原始视频数据以提高编解码器性能, 什么是本机视频缓冲区?如何使用 Surface 提高编码或解码性能?


您可以使用编解码器的输入表面来编码视频帧,您可以使用以下方式获取该表面创建输入表面() https://developer.android.com/reference/android/media/MediaCodec#createInputSurface()然后(如果您不使用 NDK)您可以从表面获取画布并在其上绘制帧,或者您可以使用 NDK 并将帧数据复制到表面缓冲区,结果中的两种方法都会为您提供编码的帧数据。

至于解码,您可以在 UI 中创建一些表面并将其传递给解码器使用配置() https://developer.android.com/reference/android/media/MediaCodec#configure(android.media.MediaFormat,%20android.view.Surface,%20android.media.MediaCrypto,%20int)它将允许解码器将解码的帧渲染到表面中,因此您不需要从解码器的输出缓冲区复制解码的数据,您唯一应该做的就是传递true作为“渲染”参数释放输出缓冲区() https://developer.android.com/reference/android/media/MediaCodec#releaseOutputBuffer(int,%20boolean)的解码器。

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

如何理解MediaCodec的用户界面来提高编解码器性能? 的相关文章

  • 如何使用 kotlin Android 从 Url 读取 JSON?

    我正在使用 kotlin 来开发应用程序 现在我想从服务器获取 JSON 数据 在java中 我实现了Asyntask以及Rxjava来从Url读取JSON 我也在谷歌搜索 但我无法获得满足我的要求的正确详细信息 如何使用 kotlin 从
  • Realm 中的更新语句

    I have VisitingCardPOJO表格 我想更新单个条目说在哪里no 3 VisitingCardPOJO java public class VisitingCardPOJO extends RealmObject Prima
  • 使用 PutDataMapRequest 后,Wearable.DataApi.getDataItem() 的 Uri 是什么?

    我正在测试可穿戴数据层 API如中所述安卓教程 http developer android com training wearables data layer index html 有一个基于底层 APIDataItem http dev
  • GCM 无法唤醒设备

    我正在开发 GCM 应用程序 当设备不空闲时 即按电源按钮休眠 一切正常 但是 当我在设备空闲时发送消息时 设备不会唤醒 我做了以下事情 已验证服务器应用程序中的delay while idle未设置为true 每条消息使用不同的折叠键 多
  • 在Android中使用RxJava2插入SQLiteDatabase

    我在学习RxJava2在安卓中 谁能解释一下我们如何使用将数据插入 SQLiteDatabaseRxJava2 这是我尝试使用的代码示例 但它将数据插入数据库六次 单击时 getCompletableObservable subscribe
  • Android版本App更新代码

    我读到如果我们想更新Google Play中的应用程序 版本代码应该高于以前的apk文件 我有一个版本代码为 20 且版本名称为 1 0 的应用程序 那么要更新app 应该如何增加版本号呢 应该增加10吗 或者仅仅 1 就足够了 即版本代码
  • android ndk 多点触控?

    我正在编写一个仅使用本机代码的应用程序 那么ndk中是否可以获取多点触控事件呢 我感觉我已经搜索了整个网络 但什么也没找到 有谁知道如何做到这一点 是的 您可以检查名为native activity查看如何获取输入事件 寻找engine h
  • 使用 setText 更改文本后如何更新屏幕?

    现在我正在使用以下代码来更新TextView txtMain setText new text 该代码执行后 屏幕不会更新新文本 有没有办法可以强制文本立即更新 该代码执行后 屏幕不会更新新文本 一旦您将控制权归还给 Android 就应该
  • 片段内容下方是否存在持久性 BottomSheet?

    Using a 持久底表 https material google com components bottom sheets html bottom sheets persistent bottom sheets 在一个协调器布局 htt
  • Google 地图位于活动的中间区域

    我正在使用 Android studio 2 1 2 我检查了一下 大多数问题要么使用旧版本的 Android studio 要么使用一些旧的类 这些类不适用于我的情况 从文件 gt 新项目 gt 我使用了选项Google Maps Act
  • Android中如何使用JNI获取设备ID?

    我想从 c 获取 IMEIJNI 我使用下面的代码 但是遇到了未能获取的错误cls 它总是返回NULL 我检查了环境和上下文 它们都没有问题 为什么我不能得到Context班级 我在网上搜索了一下 有人说我们应该使用java lang Ob
  • 在 /dev/input/eventX 中写入事件需要哪些命令?

    我正在开发一个android需要将触摸事件发送到 dev input eventX 的应用程序 我知道C执行此类操作的代码结构如下 struct input event struct timeval time unsigned short
  • 如何向 Android Studio 中的现有项目添加新活动?

    在 Eclipse 中 您只需单击 新建 按钮并选择 Android 活动即可添加新活动 但 Android Studio 有点不同 我无法找到如何向项目添加新活动 要添加一个Activity使用 Android Studio 此步骤与添加
  • 警报对话框中的 Webview 不显示内容

    我正在开发一个 Android 应用程序 我需要在网络视图和警报对话框上显示一个网站 该站点显示在网络视图中 但不显示在警报对话框中 到目前为止 这是我的代码 WebView WebView myWebView WebView v find
  • Android 无法解析日期异常

    当尝试解析发送到我的 Android 客户端的日期字符串时 我得到一个无法解析的日期 这是例外 java text ParseException 无法解析的日期 2018 09 18T00 00 00Z 位于 偏移量 19 在 java t
  • 在 Xamarin 中隐藏软键盘

    如何隐藏软键盘以便在聚焦时显示Entry在 Xamarin forms 便携式表单项目中 我假设我们必须为此编写特定于平台的渲染器 但以下内容不起作用 我创建自己的条目子类 public class MyExtendedEntry Entr
  • JetPack Compose - 卡中行中的weight() 不起作用

    创建 Android 应用程序时 我将一些可组合项放在卡片的一行中 如下所示 但它没有按我的预期工作 我添加 weight 1f 的可组合项不再显示 data class Test val title String val text Str
  • 如何在android中安装和使用couch db

    我应该如何在 android 中安装和使用 couch Db 我的意思是本地沙发数据库 我可以在平板电脑和模拟器中使用它 为此我必须遵循哪些步骤 我目前正在开发一个使用它的项目 有两种选择 1 couchbase android 是的 co
  • ARM Chromebook 上的 Android 开发环境?

    我尝试了多次安装和使用安卓工作室 https developer android com studio index html on an ARM Chromebook C100P https archlinuxarm org platfor
  • Keystore getEntry 在 Android 9 上返回 NULL

    c我已对存储在 Android 密钥库中的登录密码进行了加密和解密 在 Android 9 上 我观察到应用程序在尝试解密密码时崩溃 我无法重现它 但拥有 Pixel 3 的用户是崩溃的设备之一 下面是我如何从密钥库解密密码 private

随机推荐