- 为什么我无法在演示应用中访问本地文件?
- 为什么导出在特定设备上失败?
- Transformer 是否支持转换(或录制)远程媒体?
- Transformer 是否支持 8k 输入?
- Transformer 与平台兼容媒体转码有什么关系?
- 如何减少导出延迟或提高吞吐量?
为什么我无法在演示应用中访问本地文件?
从 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 类似的性能。
演示应用的调试预览显着降低了吞吐量,因此在使用演示应用的发布版本进行测试时关闭预览功能,以获得对性能的真实了解。