Creación de codificador OMXCodec en modo HW
Estoy tratando de implementar HW-accelrated H264 codificación de vídeo en Android ICS 4.0.4. Dado que la clase MediaCodec no está disponible, tengo que usar stagefright API. Pero cuando puse el indicador de HardwareCodecsOnly , OMXCodec :: Create siempre devuelve NULL. Si llamo a OMXCodec :: findMatchingCodecs () con la bandera kHardwareCodecsOnly, tengo la siguiente lista:
– OMX.TI.DUCATI1.VIDEO.H264E
– OMX.qcom.7×30.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 HW-codificación soportada por hardware.
- reproducir vídeo vimeo en videoview android
- Tasa de reproducción de vídeo variable en Android
- Lo sentimos, este video no se puede reproducir - streaming mp4 a android
- Recortar un video de Android
- Cómo jugar videos de Youtube en Android Video View?
Cuando no puse banderas en OMXCodec :: Create – códec creado bien, pero supongo que está en modo de software (BTW, ¿cómo puedo comprobar que codec exactamente se creó?)
Navegando por las 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 codec de software primero. ¿Qué estoy haciendo mal? Cualquier ayuda wil sea apreciada grandemente. Gracias
He aquí 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);
- Android FFmpegMediaMetadataRetriever.getFrameAtTime () es lento
- Reproduce vídeos de Youtube en la vista de vídeo en android
- Crear video desde capturas de pantalla en android
- cómo encubrir las imágenes de vídeo en android
- Vídeo de pantalla completa sin relación de aspecto de rotura
- Java.lang.ExceptionInInitializerError en FFmpeg Prueba Demo
- Android WebView - Los vídeos de Youtube que no se reproducen dentro de la aplicación
- ¿Cómo puedo reproducir vídeos de Youtube en un diseño personalizado de Android?
En Android
ICS 4.0.4
, el registro de 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 codecs de hardware
y software
es bastante simple. Si el nombre del componente no se inicia con OMX
, se interpreta que es un códec de software
como se muestra en el método IsSoftwareCodec
.
Puesto que usted está intentando un codificador de AVC
, el códec del software si creó sería AVCEncoder
como se puede encontrar de él es referencia de la Factory
.
Para comprobar qué codec se creó, puede habilitar los registros en el archivo OMXCodec.cpp
quitando el comentario como #define LOG_NDEBUG 0
en esta línea, guárdelo y compile para crear libstagefright.so
que podría ser utilizado para generar los registros en la pantalla logcat
.
EDITAR:
En caso de streaming rtsp
, es necesario habilitar los registros en ACodec.cpp
.
Se necesita averiguar si libstagefrighthw.so
está presente en /system/lib
que registrará el núcleo OMX
con el framework Stagefright
.