天天看點

MediaCodec編碼 音頻pts設定

每一幀音頻pcm錄音,要進行mediacodec編碼時,都需要為此pcm設定pts,在放入編碼的input隊列中。對于視訊的pts來說,編碼h264,一幀原始視訊yuv420格式編碼出的就是一幀h264,是以視訊的pts可以直接取目前的時間戳就可以。但是對于音頻來講,一幀pcm資料,會編碼出多幀的aac,mediacodec會根據送入編碼器時設定的yuv420的pts,為每幀編碼出的h264打一個pts。

音頻的pts設定,就需要小心了。

首先,根據AudioRecord錄音器配置的參數,根據采樣率,聲道數,采樣位,和AudioRecord設定的輸出buffer的大小,計算pts。

如下:

buffer_duration_us = 1000000 * ((double) mAudioBufferSize / mAudioChanelCount / 2 / mAudioSampleRate);
           

buffer_duration_us:每一幀pcm,需要疊加的時間間隔。

pts計算

pts = (long) (firstPresentationTimeUs + mCount * buffer_duration_us);
            if (getPTSUs() - pts > 300000) {
                firstPresentationTimeUs += getPTSUs() - pts;
                pts = (long) (firstPresentationTimeUs + mCount * buffer_duration_us);
            }
           

firstPresentationTimeUs:第一幀編碼的pcm,對于目前系統的時間戳。

mCount:表示第幾幀pcm資料。

這裡以300毫秒為一個內插補點,如果目前設定的pts和系統的時間戳相差大于300毫秒的話,做一個校正。

然後設定pts給編碼器。

mAudioEncoder.queueInputBuffer(inputIndex, 0, chunkPCM.length, pts, 0)
           

擷取目前時間戳

protected long getPTSUs() {
        return System.nanoTime() / 1000L;
    }
           

繼續閱讀