3

MediaCodec を使用してエンコーダーを適用しようとしています。私が使用する MediaFormat は次のとおりです。

 MediaFormat mediaFormat = MediaFormat.createVideoFormat("video/mp4v-es", 640, 480);
    mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 125000);
    mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 15);
    mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT,MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV422PackedSemiPlanar);
    mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 5);

デモは仮想マシン上でうまく動作します。しかし、実機(Samsung Galaxy Tab GT3113)でテストすると失敗します。デモは行でエラーを報告しますcodec.configure(mediaFormat, null /* surface */, null /* crypto */, MediaCodec.CONFIGURE_FLAG_ENCODE /* flags */); codec.start(); logcat は言います:

06-24 15:16:54.582: E/ACodec(3146): [OMX.TI.DUCATI1.VIDEO.MPEG4E] はカラー形式をサポートしていません 19 06-24 15:16:54.582: E/ACodec(3146): [ OMX.TI.DUCATI1.VIDEO.MPEG4E] configureCodec がエラー -2147483648 を返す

06-24 15:16:54.582: E/MediaCodec(3146): コーデックがエラーを報告しました。(omx エラー 0x80001001、内部エラー -2147483648)

Android が提供するすべてのKEY_COLOR_FORMATを試しましたが、どれも機能しません。誰でも私を助けることができますか?ありがとう!

4

1 に答える 1

4

おそらく、間違ったエンコーダを使用しようとしています。エンコーダーを開始する前に、次のようなものを使用して既存のエンコーダーを「プローブ」する必要があります。

HashMap<String, CodecCapabilities> mEncoderInfos;
void initEncoderInfos(){
    for(int i = MediaCodecList.getCodecCount() - 1; i >= 0; i--){
        MediaCodecInfo codecInfo = MediaCodecList.getCodecInfoAt(i);
        if(codecInfo.isEncoder()){
            for(String t : codecInfo.getSupportedTypes()){
                try{
                    mEncoderInfos.put(t, codecInfo.getCapabilitiesForType(t));
                } catch(IllegalArgumentException e){
                    e.printStackTrace();
                }
            }
        }
    }
}

すべての情報は mEncoderInfos に収集されます。この後、最適なエンコーダーを使用できます。

言い換えれば、一部のエンコーダー(あなたの場合は「video/mp4v-es」)がいくつかのカラーフォーマット(あなたの場合はMediaCodecInfo.CodecCapabilities.COLOR_FormatYUV422PackedSemiPlanar)をサポートしていると想定しないでください。

于 2013-06-30T06:03:35.933 に答える