疑难解答


为什么我无法访问演示应用程序中的本地文件?

Android 11(API 级别 30)中的作用域存储强制执行 阻止了直接访问文件系统。 在开发期间进行手动测试时,可以通过在演示应用程序清单中添加管理外部存储权限来访问本地文件。

<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>

然后通过 adb 授予权限。

adb shell appops set --uid androidx.media3.demo.transformer \
    MANAGE_EXTERNAL_STORAGE allow

为什么导出在特定设备上失败?

请在 Media3 问题追踪器 上提交一个包含足够信息以重现问题的问题。 可以将针对特定设备问题的解决方法添加到库中,以随着时间的推移提高兼容性。

Transformer 是否支持转换(或录制)远程媒体?

Transformer 支持远程渐进流,包括 MP4 等媒体文件容器。

在网络条件非常差的情况下,导出可能会失败,因为缓冲远程媒体的时间过长会触发混音器中的检查,这些检查旨在识别管道是否卡住。 可以通过在 Transformer.Builder 上设置 maxDelayBetweenMuxerSamplesMs 来覆盖默认行为。

Kotlin

Transformer.Builder(context)
    .setMaxDelayBetweenMuxerSamplesMs(C.TIME_UNSET)
    .build()

Java

new Transformer.Builder(context)
    .setMaxDelayBetweenMuxerSamplesMs(C.TIME_UNSET)
    .build();

传递 C.TIME_UNSET 将完全移除超时,但如果您的应用运行在 MediaCodec 可能卡住的芯片组上,您可能希望设置一个更大的非零超时。

Transformer 是否支持 8k 输入?

Transformer 以与格式无关的方式实现,因此它不会限制对 8k 视频的处理,但设备上的硬件功能可能意味着导出无法成功。 例如,即使在能够捕获 8k 的设备上,也可能无法解码和重新编码 8k 视频,因为这会超过可用的硬件编解码器或 RAM 资源。

Transformer 如何与平台兼容媒体转码相关?

兼容媒体转码 是 Android 12(API 级别 31)中的 Android 平台功能,它将最长 1 分钟的媒体转换为应用程序支持的格式。 如果选择使用此功能,则读取格式不兼容的媒体文件会导致按需对其进行转码,并且结果将被缓存以供以后的读取操作使用。

Transformer 还支持 格式转换,但它作为支持库提供,并且应用程序完全控制转码操作。

如何减少导出延迟或提高吞吐量?

Transformer 依赖于 MediaCodec 进行硬件加速的解码和编码,并依赖于 OpenGL 处理视频帧。 根据我们在典型设备上的测量结果,Transformer 吞吐量的限制因素是对于没有重量级效果处理的用例的硬件 MediaCodec 编码器吞吐量。 这很可能以相同的方式影响其他实现。 例如,平台兼容转码功能具有与 Transformer 相似的性能。

演示应用程序的调试预览会显着降低吞吐量,因此在使用演示应用程序的发布版本进行测试时关闭预览功能,以获得对性能的真实了解。