2016-12-08 72 views
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

お願いします。

答えて

0

私はあなたのコード内で二つの潜在的な問題を見ることができます:

ビットレートは、1秒あたりのビット、毎秒キロビットで表現する必要があります。コーデックは、毎秒320ビットが不合理に低いと考えて、そのパラメータで設定することを拒否します。

第2に、エンコーダがカラーフォーマット21をサポートしていますか?おそらくそうだと思いますが、一般的に、エンコーダーのサポートされているカラーフォーマットのリストを確認してから決定する必要があります。

+0

あなたは正しいです! [MediaFormat](https://developer.android.com/reference/android/media/MediaFormat.html)で確認してください。 'KEY_BIT_RATE \t整数\tエンコーダのみ、ビット/秒単位のビットレート'エンコーダのサポートされているカラーフォーマットのリストを確認する方法を教えてください。 – Sheikh

+0

通常は、 'MediaCodec.getCodecInfo' https://developer.android.com/reference/android/media/MediaCodec.html#getCodecInfo()や' MediaCodecList'を使いますが、どちらもNdkMediaCodecでは利用できません。したがって、JNIを使​​用してJavaクラスを呼び出す必要があります。 'AMediaCodec *'オブジェクトで 'getCodecInfo()'メソッドを呼び出せないのはおそらく対応するjavaオブジェクトが存在しないからです。しかし 'MediaCodecList'を呼び出してエンコーダー名とサポートされている色を見つけることができますフォーマットし、次に 'AMediaCodec_createCodecByName()'を使ってエンコーダを作成します。 – mstorsjo

関連する問題