3

Android ACodec.cppでは、 と( / )からsetupAVCEncoderParameters読み取らprofileれ、が から来ているように見えます。したがって、以下のように/を手動で設定できると思います。levelmsgmsg->findInt32("profile", &profile)msg->findInt32("level", &level)msgformatMediaCodec.configure()profilelevelMediaCodec.configure()

format.setInteger(MediaCodec.KEY_PROFILE, MediaCodecInfo.CodecProfileLevel.AVCProfileHigh);
format.setInteger(MediaCodec.KEY_LEVEL, MediaCodecInfo.CodecProfileLevel.AVCLevel5);

もちろん、設定したプロファイル/レベルをデバイスがサポートしているかどうかがわからないため、これは良い考えではないことに同意します。また、ほとんどのサンプル コードでは、これらの値がまったく設定されていませんでした。

例えば:

MediaFormat format = MediaFormat.createVideoFormat(MIME_TYPE, mWidth, mHeight);
format.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);  // API >= 18
format.setInteger(MediaFormat.KEY_BIT_RATE, calcBitRate());
format.setInteger(MediaFormat.KEY_FRAME_RATE, FRAME_RATE);
format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 10)

mMediaCodec = MediaCodec.createEncoderByType(MIME_TYPE);
mMediaCodec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);

おそらくそれらは自動的に設定されますか?MediaCodec は、現在のデバイスがサポートしているプロファイル/レベルを照会し、自動的に選択しますか? デバイスが複数のプロファイル/レベルをサポートしている場合、どれが選択されますか? 低レベルのもの(ベースラインなど)または高レベルのもの(高など)?

4

1 に答える 1

3

ほとんどの場合 (私の知る限り)、それはベースラインになります。なぜなら、より高いプロファイル (B フレームが有効になっている) では、発信者として、それを正しく処理する準備ができている必要があるからです (単純な/素朴なアプリケーションには、そうでない仮定がある可能性があります)。 t は B フレームに耐えます)、B フレームを使用するエンコーダーはより高いレイテンシーを持っています。

于 2016-12-30T10:27:49.963 に答える