android - 对于某些特定视频的音频,我使用 mediaExtractor 和 mediaFormat 获得一半的通道数和一半的采样率
问题描述
对于某些特定视频的音频,我使用 android mediaExtractor 和 mediaFormats 获得了一半的通道数和一半的采样率(例如:通道数为 2,采样率为 44100,但我得到的通道数为 1,采样率为 22050)。对于其他视频,它工作正常。我注意到的一件事是,对于“aac profile = 29”,它会导致问题。
我正在使用的代码
MediaExtractor extractor = new MediaExtractor();
try {
extractor.setDataSource( path);
int trackIndex = MetadataUtils.getTrackIndex(extractor, "audio/");
if (trackIndex != -1) {
MediaFormat format = extractor.getTrackFormat(trackIndex);
audioMetadata.mAudioTrackIndex = trackIndex;
audioMetadata.mAudioTrackFormat = format;
if (format != null) {
if (format.containsKey(MediaFormat.KEY_MIME)) {
audioMetadata.mAudioMimeType = format.getString(MediaFormat.KEY_MIME);
MediaFormat.KEY_AAC_PROFILE
}
if (format.containsKey(MediaFormat.KEY_CHANNEL_COUNT)) {
audioMetadata.mNoInputChannel = format.getInteger(MediaFormat.KEY_CHANNEL_COUNT);
}
if (format.containsKey(MediaFormat.KEY_SAMPLE_RATE)) {
audioMetadata.mInputSampleRateHz = format.getInteger(MediaFormat.KEY_SAMPLE_RATE);
}
if (format.containsKey(MediaFormat.KEY_DURATION)) {
audioMetadata.mAudioDurationUs = format.getLong(MediaFormat.KEY_DURATION);
}
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
extractor.release();
}
我怎样才能解决这个问题 ?
解决方案
当 KEY_AAC_PROFILE 为 29 时,表示 AACObjectHE_PS 或 HE AAC v2。当 KEY_AAC_PROFILE 为 5 时,表示 AACObjectHE 或 HE AAC
HE AAC中使用了SBR(Spectral Band Replication),所以实际采样率会翻倍。在 HE AAC v2 中,同时使用了 SBR(Spectral Band Replication)和 PS(Parametric Stereo),因此实际采样率和通道数将增加一倍。
有关更多信息,请参阅以下链接
https://tech.ebu.ch/docs/techreview/trev_305-moser.pdf https://datatracker.ietf.org/doc/html/rfc6416
另一种解决方案:为此,您必须使用 mediaCodec 解码音频文件,在onOutputFormatChanged(codec: MediaCodec, format: MediaFormat)
回调中,您将有准确的 channelCount 和 sampleRate格式。
推荐阅读
- python - 如何计算滑动窗口结果并将其写入csv?
- python - 如何创建一个矩阵,用户在其中输入行和列,然后在 Python 中输入每个位置的值?
- python - 将图像垂直分成两半并按增量顺序保存写入它们:opevcv
- javascript - 我可以将图像作为 blob 存储到本地存储或某处,以便它可以在另一个页面中使用吗?
- android - Flutter:如何使用 Listview.builder 使每张卡片都独一无二?
- java - 从 SQlite 在列表视图中加载数据的问题
- javascript - 如何获取其他文件夹中的上传图像?表达静态问题
- python - 检查对象属性时,if-else 条件始终返回 false
- java - 如果 BigInteger 对于 int 来说太大,如何返回 int?
- outlook-redemption - C# folder.FolderPath(和许多其他动态属性)