对于某些特定视频的音频,我使用 mediaExtractor 和 mediaFormat 获得了一半的通道数和一半的采样率
For some particular video's audio I am getting half channel count and half sample rate with mediaExtractor and 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)
回调中,您将在 格式 .
对于某些特定视频的音频,我使用 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)
回调中,您将在 格式 .