簡體   English   中英

如何使用Android AudioRecord和MediaCodec作為音頻編碼器正確處理PTS?

[英]How to handle the PTS correctly using Android AudioRecord and MediaCodec as audio encoder?

我正在使用AudioRecord在Android設備上的攝像頭捕獲過程中錄制音頻流。 由於我想處理幀數據並處理音頻/視頻樣本,所以我不使用MediaRecorder。

我在另一個線程中運行AudioRecord,調用read()來收集原始音頻數據。 獲得數據流后,我將它們提供給配置為AAC音頻編碼器的MediaCodec。

以下是我的一些關於錄音機/編碼器的代碼:

m_encode_audio_mime = "audio/mp4a-latm";
m_audio_sample_rate = 44100;
m_audio_channels = AudioFormat.CHANNEL_IN_MONO;
m_audio_channel_count = (m_audio_channels == AudioFormat.CHANNEL_IN_MONO ? 1 : 2);

int audio_bit_rate = 64000;
int audio_data_format = AudioFormat.ENCODING_PCM_16BIT;

m_audio_buffer_size = AudioRecord.getMinBufferSize(m_audio_sample_rate, m_audio_channels, audio_data_format) * 2;
m_audio_recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, m_audio_sample_rate,
                                   m_audio_channels, audio_data_format, m_audio_buffer_size);

m_audio_encoder = MediaCodec.createEncoderByType(m_encode_audio_mime);
MediaFormat audio_format = new MediaFormat();
audio_format.setString(MediaFormat.KEY_MIME, m_encode_audio_mime);
audio_format.setInteger(MediaFormat.KEY_BIT_RATE, audio_bit_rate);
audio_format.setInteger(MediaFormat.KEY_CHANNEL_COUNT, m_audio_channel_count);
audio_format.setInteger(MediaFormat.KEY_SAMPLE_RATE, m_audio_sample_rate);
audio_format.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectLC);
audio_format.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, m_audio_buffer_size);
m_audio_encoder.configure(audio_format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);

我發現AudioRecord.read()的第一次需要更長的時間才能返回,而連續的read()的時間間隔更接近音頻數據的實際時間。 例如,我的音頻格式是44100Hz 16Bit 1Channel,AudioRecord的緩沖區大小是16384,因此完整緩沖區意味着185.76 ms。 當我為每次read()調用記錄系統時間並從基准時間減去它們時,我得到以下順序:

每次讀取之前的時間():0ms,345ms,543ms,692ms,891ms,1093ms,1244ms,...

我將這些原始數據提供給音頻編碼器,上述時間值為PTS,編碼器輸出帶有以下PTS的編碼音頻樣本:

編碼器輸出PTS:0ms,185ms,371ms,557ms,743ms,928ms,...

看起來編碼器將每個數據部分視為具有相同的時間段。 我相信編碼器工作正常,因為我每次都給它相同大小(16384)的原始數據。 但是,如果我使用編碼器輸出PTS作為多路復用器的輸入,我將獲得一個視頻內容比視頻內容更快的視頻。

我想問一下:

  1. 是否預計AudioRecord.read()第一次阻止更長時間? 我確信函數調用需要超過300毫秒,而它只記錄16384字節為186毫秒。 這也是一個取決於設備/ Android版本的問題嗎?
  2. 我該怎么做才能實現音頻/視頻同步? 我有一個解決方法來測量第一次調用read()的延遲時間,然后將音頻樣本的PTS移位延遲。 有另一種更好的方法來處理這個問題嗎?

將單聲道輸入轉換為立體聲。 在我意識到MediaCoder暴露的AAC編碼器僅適用於立體聲輸入之前,我正在拔頭發一段時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM