オーディオおよびビデオ シリーズ 8 の ffmpeg は、mediacodec ハード デコードを使用します。

ffmpeg を再コンパイルします。

ffmpeg はデフォルトで mediacodec を有効にしないため、構成ファイルに構成を追加する必要があります

--enable-mediacodec

デフォルトでは、mediacodec でサポートされているデコーダーが追加されますが、すべてのデコーダーを無効にしてから、必要に応じて手動で開く場合は、次の構成を参照してください。

--enable-decoder=h264_mediacodec
--enable-decoder=hevc_mediacodec
--enable-decoder=mpeg4_mediacodec
--enable-decoder=mpeg2_mediacodec
--enable-decoder=vp8_mediacodec
--enable-decoder=vp9_mediacodec

特定のコンパイルは、以前の記事で詳しく説明されています。

JavaVM の構成

JNI_OnLoad メソッドでav_jni_set_java_vmメソッドを呼び出します。例は次のとおりです。

    av_jni_set_java_vm(vm, 0);

ffmpeg は、jni を介して Mediacodec Java レイヤーの API をコールバックすることでハード デコードを実装します. 自信がある場合は、MediaCodec ネイティブ レイヤーの API を使用して、究極のパフォーマンスを実現できます.

AVCodec を置き換える

avcodec_find_decoder_by_name メソッドを使用して、MediaCodec でサポートされているエンコードで対応するエンコーダーを検索します. その他はソフト デコード処理と同じです. H264 を例にすると、参照コードは次のようになります.

        AVCodec *avCodec = nullptr;
        AVCodecID videoCodecID = avFormatContext->streams[video_index]->codecpar->codec_id;
        if (videoCodecID == AV_CODEC_ID_H264) {
    
    
            avCodec = avcodec_find_decoder_by_name("h264_mediacodec");
            if (avCodec == nullptr) {
    
    
                avCodec = avcodec_find_decoder(videoCodecID);
            }
        } else {
    
    
            avCodec = avcodec_find_decoder(videoCodecID);
        }

ハード ソリューションをテストすることによって取得されたフレームの best_effort_timestamp は、AV_NOPTS_VALUEと等しくなる可能性があることに注意してください。

おすすめ

転載: blog.csdn.net/Welcome_Word/article/details/124068162