我一直在尝试在特定的 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 |
|
比特率 | 96000 | 96000 |
语言 | 丹 | 和 |
aac-配置文件 | 2 | 2 |
track-fourcc | -1 |
|
编码器延迟 | 2112 |
|
持续时间我们 | 725333 | 725333 |
通道数 | 2 | 2 |
每个样本位数 | 16 | 16 |
编码器填充 | 705 |
|
最大输入大小 | 524308 | 65538 |
csd-0 | [17,-112] | [17,-112] |
使用的文件是使用 FFMPEG CLI 生成的,有 8 个音轨,但我也从中提取了音频并用于测试相同的问题
Razer Phone 2 是一款相对较旧的设备(2018 年末发布)。而且我没有证据来验证这一假设。
根据 AOSP,2018 年 11 月进行了更改,在
AMediaFormat
中使用 MPEG4Extractor.cpp
。
具体来说,使用
AMEDIAFORMAT_KEY_LANGUAGE
(字符串值“语言”)代替 kKeyMediaLanguage
(字符串值“lang”)。
所以我怀疑Razer Phone 2将语言存储在媒体格式映射中的“lang”键下,但您正在寻找“语言”。