- 为什么我无法在演示应用中访问本地文件?
- 为什么导出在特定设备上失败?
- 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 的设备上,也可能由于超出可用的硬件编解码器或 RAM 资源而无法解码和重新编码 8k 视频。
Transformer 与平台兼容的媒体转码有何关系?
兼容媒体转码是 Android 12(API 级别 31)中的一项 Android 平台功能,可将最长一分钟的媒体转换为应用支持的格式。如果您选择使用此功能,读取不兼容格式的媒体文件时,它将按需转码,并且结果将缓存起来供后续读取操作使用。
Transformer 还支持格式转换,但它作为支持库提供,应用对转码操作拥有完全控制权。
如何降低导出延迟或提高吞吐量?
Transformer 依靠 MediaCodec
进行硬件加速解码和编码,并依靠 OpenGL 处理视频帧。根据我们在典型设备上的测量,在没有重量级效果处理的用例中,Transformer 吞吐量的限制因素是硬件 MediaCodec
编码器吞吐量。这可能会以同样的方式影响其他实现。例如,平台兼容转码功能与 Transformer 具有相似的性能。
演示应用的调试预览会显著降低吞吐量,因此,在使用演示应用的发布版本进行测试时,请关闭预览功能,以获得真实的性能概念。