故障排除


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

从 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 平台功能,可将最长一分钟的媒体转换为应用支持的格式。如果您选择使用此功能,则读取格式不兼容的媒体文件会导致按需转码,并且结果会被缓存以供以后读取操作使用。

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

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

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

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