記事ディレクトリ
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と等しくなる可能性があることに注意してください。