0
NdkMediaCodecを使用しています。 デコーダを正常に作成しましたが、エンコーダで失敗しました。ここ は、私はそれをやろうとしています方法です:NDK MediaCodecのエンコーダでAMediaCodec_configure()が失敗しました
AMediaCodec* codec = AMediaCodec_createEncoderByType("video/avc");
if (codec != NULL) {
// fill the format
AMediaFormat* format = AMediaFormat_new();
if (format != NULL) {
ANativeWindow* surface = NULL;
AMediaCrypto * crypto = NULL;
uint32_t flags = AMEDIACODEC_CONFIGURE_FLAG_ENCODE;
int32_t height = 288;
int32_t width = 384;
int32_t frameRate = 30;
int32_t bitRate = 320;
AMediaFormat_setString(format, AMEDIAFORMAT_KEY_MIME, "video/avc");
AMediaFormat_setInt32(format, AMEDIAFORMAT_KEY_HEIGHT, height);
AMediaFormat_setInt32(format, AMEDIAFORMAT_KEY_WIDTH, width);
AMediaFormat_setInt32(format, AMEDIAFORMAT_KEY_BIT_RATE, bitRate);
AMediaFormat_setInt32(format, AMEDIAFORMAT_KEY_FRAME_RATE, frameRate);
AMediaFormat_setInt32(format, AMEDIAFORMAT_KEY_COLOR_FORMAT, 21); // #21 COLOR_FormatYUV420SemiPlanar (NV12)
media_status_t rc = AMediaCodec_configure(codec, format, surface, crypto, flags);
if (AMEDIA_OK == rc) {
AMediaCodec_start(codec);
return 0;
} }
私はいつも次のエラーで失敗しました:私もこの方法AMediaFormat_setInt64を試してみました
E/ACodec(3484): [OMX.qcom.video.encoder.avc] configureCodec returning error -38
E/ACodec(3484): signalError(omxError 0x80001001, internalError -2147483648)
E/MediaCodec(3484): Codec reported err 0x80001001, actionCode 0, while in state 3
E/MediaCodec(3484): configure failed with err 0x80001001, resetting...
E/OMX-VENC-720p(184): ioctl VEN_IOCTL_CMD_READ_NEXT_MSG failed
E/OMX-VENC-720p(184): Destroy C2D instance
I/OMXClient(3484): Using client-side OMX mux.
E/OMX-VENC-720p(184): Is component secure 0
E/NdkMediaCodec(3484): sf error code: -2147479551
E/OMX-VENC-720p(184): ioctl VEN_IOCTL_CMD_READ_NEXT_MSG failed
。しかし、成功はありません。
デバイスはNexus 7(2013)です。 API 5.1.1。
お願いします。
あなたは正しいです! [MediaFormat](https://developer.android.com/reference/android/media/MediaFormat.html)で確認してください。 'KEY_BIT_RATE \t整数\tエンコーダのみ、ビット/秒単位のビットレート'エンコーダのサポートされているカラーフォーマットのリストを確認する方法を教えてください。 – Sheikh
通常は、 'MediaCodec.getCodecInfo' https://developer.android.com/reference/android/media/MediaCodec.html#getCodecInfo()や' MediaCodecList'を使いますが、どちらもNdkMediaCodecでは利用できません。したがって、JNIを使用してJavaクラスを呼び出す必要があります。 'AMediaCodec *'オブジェクトで 'getCodecInfo()'メソッドを呼び出せないのはおそらく対応するjavaオブジェクトが存在しないからです。しかし 'MediaCodecList'を呼び出してエンコーダー名とサポートされている色を見つけることができますフォーマットし、次に 'AMediaCodec_createCodecByName()'を使ってエンコーダを作成します。 – mstorsjo