MediaCodec オーディオとビデオの同期 MediaSync

MediaSync は、android M によって追加された新しい API であり、ビデオとオーディオの同期再生のアプリケーションを支援できます。

MediaSyncの基本的な使い方

ステップ 1: MediaSync を初期化し、me​​diaCodec と AudioTrack を初期化し、AudioTrack とサーフェスを MediaSync に渡します。

MediaSync sync = new MediaSync();
sync.setSurface(mSurface);
Surface inputSurface = sync.createInputSurface();


mVideoMediaCodec.configure(mediaFormat,inputSurface,null,0);
sync.setAudioTrack(audioTrack);

ステップ 2: MediaSync がコールバック インターフェイスを設定する

MediaSync はオーディオ バッファでのみ動作します。1 つは書き込み用の queueAudio メソッドで、もう 1 つは書き込み用のコールバック メソッドです。

sync.setCallback(new MediaSync.Callback() {
            @Override
            public void onAudioBufferConsumed(@NonNull MediaSync sync,
                    @NonNull ByteBuffer audioBuffer, int bufferId) {
                Log.e("TAG","onAudioBufferConsumed");
                mAudioMediaCodec.releaseOutputBuffer(bufferId, true);
            }
        },null);

ステップ 3: 再生速度を設定する

sync.setPlaybackParams(new PlaybackParams().setSpeed(1.0f));

ステップ 4: 非同期コールバックで処理する

@Override
    public void onOutputBufferAvailable(@NonNull MediaCodec codec, int index,
            @NonNull MediaCodec.BufferInfo info) {
        String type = codec.getInputFormat().getString(MediaFormat.KEY_MIME);
        if (type.contains("video")) {
            codec.releaseOutputBuffer(index, 1000 * info.presentationTimeUs);
        } else{
            Log.e("TAG","queueAudio");
            ByteBuffer outputBuffer = codec.getOutputBuffer(index);
            sync.queueAudio(outputBuffer, index, info.presentationTimeUs);
        }
    }

ステップ 5: プレイ後、リソースを解放する

sync.setPlaybackParams(new PlaybackParams().setSpeed(0.f));
sync.release();
sync = null;

おすすめ

転載: blog.csdn.net/xiaowang_lj/article/details/128328198