对于某些特定视频的音频,我使用 mediaExtractor 和 mediaFormat 获得一半的通道数和一半的采样率

Posted

技术标签:

【中文标题】对于某些特定视频的音频,我使用 mediaExtractor 和 mediaFormat 获得一半的通道数和一半的采样率【英文标题】:For some particular video's audio I am getting half channel count and half sample rate with mediaExtractor and mediaFormat 【发布时间】:2021-12-15 10:54:03 【问题描述】:

对于某些特定视频的音频,我使用 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();
        

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

当 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。

【讨论】:

以上是关于对于某些特定视频的音频,我使用 mediaExtractor 和 mediaFormat 获得一半的通道数和一半的采样率的主要内容,如果未能解决你的问题,请参考以下文章

使用 webengine 视频和音频编解码器

使用 FFmpeg 将音频输入与视频混合到特定位置

寻找一个知道检测对特定音频视频格式文件支持的库

使用颤振如何将音频文件与任何视频(如相机动作)的同步合并,颤振中有任何特定的包可用

从中间或特定时间将视频合并到音频文件

python中的视频和音频处理库