问题排查


为什么我无法在演示版应用中访问本地文件?

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 等媒体文件容器。

在网络条件非常差的情况下,导出可能会失败,因为缓冲远程媒体的时间过长会触发对多路复用器的检查,该多路复用器旨在识别流水线卡住。您可以通过更改多路复用器配置来替换默认行为,如下所示:

Kotlin

Transformer.Builder(context)
    .setMuxerFactory(DefaultMuxer.Factory(/* maxDelayBetweenSamplesMs= */ C.TIME_UNSET))
    .build()

Java

new Transformer.Builder(context)
    .setMuxerFactory(new DefaultMuxer.Factory(/* maxDelayBetweenSamplesMs= */ C.TIME_UNSET))
    .build();

传入 C.TIME_UNSET 会完全消除超时,但如果您的应用在 MediaCodec 可能会卡住的芯片组上运行,您可能需要设置更大的非零超时。

Transformer 是否支持 8k 输入?

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

Transformer 与平台兼容的媒体转码之间有何关系?

兼容的媒体转码是 Android 12(API 级别 31)中的一项 Android 平台功能,可将时长不超过一分钟的媒体转换为应用支持的格式。如果您选择使用此功能,读取格式不兼容的媒体文件会导致系统按需对其进行转码,并缓存结果以供日后读取操作。

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

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

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

演示版应用的调试预览会显著降低吞吐量,因此请在使用演示版应用的发布 build 进行测试时关闭预览功能,以真实了解性能。