use*_*593 4 video android hardware-acceleration android-ndk stagefright
我正在尝试在Android ICS 4.0.4上实现HW加速的H264视频编码.由于MediaCodec类不可用,我必须使用stagefright API.但是当我输入HardwareCodecsOnly标志时,OMXCodec :: Create总是返回NULL.如果我用标志kHardwareCodecsOnly调用OMXCodec :: findMatchingCodecs(),我得到以下列表:
- 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
所以我猜这意味着硬件支持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;
}
}
Run Code Online (Sandbox Code Playgroud)
对于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);
Run Code Online (Sandbox Code Playgroud)
在Android ICS 4.0.4,编解码器注册是静态的,即所有编解码器都被注册为数组的一部分,KEncoderInfo可以在这里找到.
区分hardware和software编解码器的方法非常简单.如果组件名称不是以组件名称开头OMX,则它被解释software为如该IsSoftwareCodec方法中所示的编解码器.
由于您正在尝试使用AVC编码器,因此创建的软件编解码器AVCEncoder可以从它的Factory参考中找到.
要检查哪些编解码器创建的,您可以启用日志OMXCodec.cpp通过删除注释作为文件#define LOG_NDEBUG 0在该行,保存并重新编译以建立libstagefright.so其可以用来生成日志logcat屏幕.
编辑:
在rtsp流式传输的情况下,需要启用日志ACodec.cpp.
需要确定是否libstagefrighthw.so存在/system/lib将OMX核心注册到Stagefright框架.
| 归档时间: |
|
| 查看次数: |
3836 次 |
| 最近记录: |