Android ICS 4.0.4 でハードウェア アクセラレーションによる H264 ビデオ エンコーディングを実装しようとしています。MediaCodec クラスが利用できないため、stagefright API を使用する必要があります。しかし、HardwareCodecsOnlyフラグを設定すると、OMXCodec::Create は常に NULL を返します。
フラグ kHardwareCodecsOnly を指定してOMXCodec ::findMatchingCodecs() を呼び出すと、次のリストが表示
されます
。
- OMX.TI.Video.encoder
- OMX.Nvidia.h264.encoder
- OMX.SEC.AVC.Encoder
つまり、ハードウェアでサポートされている HW エンコーディングを意味していると思います。
OMXCodec::Createにフラグを設定しなかった場合- コーデックは適切に作成されましたが、ソフトウェア モードにあると思います (どのコーデックが正確に作成されたかを確認するにはどうすればよいですか?)
OMXCodec ソースをブラウズすると、興味深い行が見つかりました。
if (createEncoder) {
sp<MediaSource> softwareCodec =
InstantiateSoftwareEncoder(componentName, source, meta);
if (softwareCodec != NULL) {
LOGV("Successfully allocated software codec '%s'", componentName);
return softwareCodec;
}
}
Encoder の場合、常に最初にソフトウェア コーデックをインスタンス化しようとするようです。私は何を間違っていますか?どんな助けでも大歓迎です。ありがとう
OMXCodec 作成のコードは次のとおりです。
mClient = new OMXClient();
mClient->connect();
logger->log("mClient.connect();");
enc_meta = new MetaData;
// frame size of target video file
int width = 640; //720;
int height = 480;
int kFramerate = 15;
int kVideoBitRate = 500000;
int kIFramesIntervalSec = 5;
int32_t colorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
enc_meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_AVC); //MEDIA_MIMETYPE_VIDEO_MPEG4); //MEDIA_MIMETYPE_VIDEO_H263);//MEDIA_MIMETYPE_VIDEO_AVC);
enc_meta->setInt32(kKeyWidth, width);
enc_meta->setInt32(kKeyHeight, height);
enc_meta->setInt32(kKeyFrameRate, kFramerate);
enc_meta->setInt32(kKeySampleRate, 44100);
enc_meta->setInt32(kKeyBitRate, kVideoBitRate);
enc_meta->setInt32(kKeyStride, width);
enc_meta->setInt32(kKeySliceHeight, height);
enc_meta->setInt32(kKeyIFramesInterval, kIFramesIntervalSec);
enc_meta->setInt32(kKeyColorFormat, colorFormat);
mVideoSource = OMXCodec::Create(
mClient->interface(),
enc_meta,
true,
mSrc,
NULL,
OMXCodec::kHardwareCodecsOnly );
logger->log("OMXCodec_CREATED result: %d", (mVideoSource!=NULL) ? 1 : 0);