故障排除


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

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 的设备上,也可能由于超出可用的硬件编解码器或 RAM 资源而无法解码和重新编码 8k 视频。

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

兼容媒体转码是 Android 12(API 级别 31)中的一项 Android 平台功能,可将最长一分钟的媒体转换为应用支持的格式。如果您选择使用此功能,读取不兼容格式的媒体文件时,它将按需转码,并且结果将缓存起来供后续读取操作使用。

Transformer 还支持格式转换,但它作为支持库提供,应用对转码操作拥有完全控制权。

如何降低导出延迟或提高吞吐量?

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

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