问题排查


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

自 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 平台功能,自 Android 12(API 级别 31)起提供,可将时长不超过一分钟的媒体转换为应用支持的格式。如果您选择启用此功能,则读取不兼容格式的媒体文件会导致系统按需对该文件进行转码,并且结果会缓存起来以供后续读取操作使用。

Transformer 也支持格式转换,但它以支持库的形式提供,应用可以完全控制转码操作。

如何缩短导出延迟时间或提高吞吐量?

Transformer 依靠 MediaCodec 实现硬件加速的解码和编码,并依靠 OpenGL 处理视频帧。根据我们在典型设备上的测量结果,Transformer 吞吐量的限制因素是硬件 MediaCodec 编码器吞吐量(对于不涉及大量特效处理的应用场景)。这可能会以相同的方式影响其他实现。例如,平台兼容的转码功能具有与 Transformer 类似的性能。

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