android - Creando el codificador OMXCodec en modo HW
video android-ndk (1)
Estoy tratando de implementar la codificación de video H264 acelerada por HW en Android ICS 4.0.4. Como la clase MediaCodec no está disponible, tengo que usar la API stagefright. Pero cuando pongo el indicador HardwareCodecsOnly , OMXCodec :: Create siempre devuelve NULL. Si llamo a OMXCodec :: findMatchingCodecs () con el indicador kHardwareCodecsOnly, obtuve la siguiente lista:
- OMX.TI.DUCATI1.VIDEO.H264E
- OMX.qcom.7x30.video.encoder.avc
- OMX.qcom.video.encoder.avc
- OMX.TI.Video.encoder
- OMX.Nvidia.h264.encoder
- OMX.SEC.AVC.Encoder
así que supongo que significa que la codificación HW es compatible con hardware.
Cuando no puse banderas en OMXCodec :: Create - codec creado bien, pero supongo que está en modo de software (por cierto, ¿cómo puedo verificar qué códec fue exactamente creado?)
Buscando fuentes de OMXCodec he encontrado líneas interesantes:
if (createEncoder) {
sp<MediaSource> softwareCodec =
InstantiateSoftwareEncoder(componentName, source, meta);
if (softwareCodec != NULL) {
LOGV("Successfully allocated software codec ''%s''", componentName);
return softwareCodec;
}
}
parece que para Encoder siempre intenta instanciar el códec de software primero. ¿Qué estoy haciendo mal? Cualquier ayuda será muy apreciada. Gracias
Aquí hay un código de creación de 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);
En Android
ICS 4.0.4
, el registro del códec era estático, es decir, todos los códecs se registraron como parte de una matriz KEncoderInfo
como se puede encontrar aquí .
La metodología para diferenciar entre códecs de hardware
y software
es bastante simple. Si el nombre del componente no comienza con OMX
, se interpreta como un códec de software
como se muestra en el método IsSoftwareCodec
.
Como está probando un codificador AVC
, el códec de software si se creó sería AVCEncoder
como se puede encontrar en su referencia de Factory
.
Para verificar qué códec se creó, puede habilitar los registros en el archivo OMXCodec.cpp
eliminando el comentario como #define LOG_NDEBUG 0
en esta línea, guardar y libstagefright.so
a compilar para compilar libstagefright.so
que se podría usar para generar los registros en la pantalla de logcat
.
EDITAR:
En el caso de la transmisión rtsp
, es necesario habilitar los registros en ACodec.cpp
.
Es necesario determinar si libstagefrighthw.so
está presente en /system/lib
que registrará el núcleo OMX
con el framework Stagefright
.