Android AudioVideo Framework 无法正确读取元数据

问题描述 投票:0回答:1

我一直在尝试在特定的 Android 设备上打开

*.mp4
媒体文件。一旦我打开它
MediaFormat
数据在音轨上有未定义的语言。如果我然后在不同的设备上上传相同的应用程序,它会正确解码。

截至目前,我尝试了

MediaPlayer
MediaMetadataRetriever
MediaExtractor
API。使用
AMediaExtractor
API 的 C++ 本机代码可以重现同样的问题。

示例:

        val me = MediaExtractor()
        val fis = resources.openRawResourceFd(R.raw.mp4)
        me.setDataSource(fis.fileDescriptor, fis.startOffset, fis.length)
        val format = me.getTrackFormat(1)
        val language = format.getString(MediaFormat.KEY_LANGUAGE)

Android 9 Razer Phone 2
上,这将返回未定义,而任何其他设备都可以正常工作并返回实际的语言信息。

我也在

Android 8.1.0 Asus Rog Phone

上重现了同样的问题

同一曲目的 MIME 为

audio/mp4a-latm
。我尝试过
*.m4a
音频文件,但它有同样的问题。

故障设备上的解码器似乎是

OMX.google.aac
,但我发现其他带有此解码器的设备工作得很好。

媒体格式数据 好设备(Galaxy 21 Plus) 设备故障(Razer Phone 2)
最大比特率 96000 96000
是DMCMMExtractor 1 1
采样率 48000 48000
轨道 ID 2 2
哑剧 音频/mp4a-latm 音频/mp4a-latm
简介 2
Field Missing
比特率 96000 96000
语言
aac-配置文件 2 2
track-fourcc -1
Field Missing
编码器延迟 2112
Field Missing
持续时间我们 725333 725333
通道数 2 2
每个样本位数 16 16
编码器填充 705
Field Missing
最大输入大小 524308 65538
csd-0 [17,-112] [17,-112]

使用的文件是使用 FFMPEG CLI 生成的,有 8 个音轨,但我也从中提取了音频并用于测试相同的问题

android kotlin media-player mp4 aac
1个回答
0
投票

Razer Phone 2 是一款相对较旧的设备(2018 年末发布)。而且我没有证据来验证这一假设。

根据 AOSP,2018 年 11 月进行了更改,在

AMediaFormat
中使用
MPEG4Extractor.cpp

具体来说,使用

AMEDIAFORMAT_KEY_LANGUAGE
(字符串值“语言”)代替
kKeyMediaLanguage
(字符串值“lang”)。

所以我怀疑Razer Phone 2将语言存储在媒体格式映射中的“lang”键下,但您正在寻找“语言”。

© www.soinside.com 2019 - 2024. All rights reserved.