Android:使用OMXCodec作为MediaSource时,MPEG4Writer无法启动

时间:2013-09-11 15:09:09

标签: android c++ android-ndk stagefright openmax

我正在尝试对来自字节数组缓冲区的视频进行编码,并且我正在使用本机代码中的MPEG4Writer API。

我已经创建了自定义MediaSource类来提供数据,我将其与OMXCodec包装在一起,以便将其提供给MPEG4Writer

sp<MediaSource> mVideoEncoder = OMXCodec::Create(client.interface(), omxEncMeta, true, mVideoOutSource);
mVideoEncoder->start();

mVideoOutSource是我的自定义MediaSource课程,omxEncMeta如下:

int32_t colorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
int32_t width = 480;
int32_t height = 360;
int32_t frameRate = 24;
int32_t bitRate = 500 * 1024;
int32_t iFrameInterval = 1;

sp<MetaData> omxEncMeta = new MetaData;
omxEncMeta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_AVC);
omxEncMeta->setInt32(kKeyColorFormat, colorFormat);
omxEncMeta->setInt32(kKeyWidth, width);
omxEncMeta->setInt32(kKeyHeight, height);
omxEncMeta->setInt32(kKeyStride, width);
omxEncMeta->setInt32(kKeySliceHeight, height);
omxEncMeta->setInt32(kKeyFrameRate, frameRate);
omxEncMeta->setInt32(kKeySampleRate, frameRate);
omxEncMeta->setInt32(kKeyBitRate, bitRate);
omxEncMeta->setInt32(kKeyIFramesInterval, iFrameInterval);

但是当我调用start()方法时,它会返回错误代码UNKNOWN_ERROR

相反,如果我尝试直接向MPEG4Writer提供我的自定义MediaSource(不用OMXCodec包裹它,它会成功启动,但最终会停止录制并显示错误{{1} (大约12帧后),我认为这是因为我的自定义Missing codec specific data仅提供有关实际帧的信息,但没有提供有关编解码器格式的信息。

我确定我错过了MediaSource的内容,但我无法弄清楚...是否有人可以为我提供自定义OMXCodec的实际示例编码?或者给我一些暗示为什么这根本不起作用? 如果你需要更多的信息,请问,谢谢!

编辑:我正在针对API 14开发此功能,因此请不要建议我使用API​​ 16中的MediaSource:)

编辑:这就是我开始MediaCodec的方式:

MPEG4Writer

这是logcat(int32_t outputFormat = OUTPUT_FORMAT_MPEG_4; int64_t startTimeUs = systemTime() / 1000; int32_t totalBitRate = bitRate; sp<MetaData> meta = new MetaData; meta->setInt64(kKeyTime, startTimeUs); meta->setInt32(kKeyFileType, outputFormat); meta->setInt32(kKeyBitRate, totalBitRate); sp<MPEG4Writer> mWriter = new MPEG4Writer("/sdcard/encode_manual.mp4"); mWriter->addSource(mVideoEncoder); status_t error = mWriter->start(meta.get()); if (error != OK) { LOGE("Writer NOT started! %x", error); } else { LOGI("Writer started!"); } )的输出:

adb logcat OMXClient:V OMXCodec:V *:W

2 个答案:

答案 0 :(得分:3)

我刚刚发现了我的( dumb )问题:在调用start()之前,我在mVideoEncoderOMXCodec实例)上调用start()MPEG4Writer上,这是UNKNOWN_ERROR

我只在start()个实例上调用MPEG4Writer解决了问题。

答案 1 :(得分:2)

我认为有一个错误很重要:

omxEncMeta->setInt32(kKeyBitRate, frameRate); // should set bitrate, 24 is too small

omxEncMeta->setInt32(kKeySampleRate, frameRate); // i don't think is of any use

然后:确保您的来源返回此

virtual sp<MetaData> getFormat() {
    sp<MetaData> meta = new MetaData;
    meta->setInt32(kKeyWidth, mWidth);
    meta->setInt32(kKeyHeight, mHeight);
    meta->setInt32(kKeyColorFormat, mColorFormat);
    meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_RAW);
    return meta;
}

从源代码返回的MediaBuffer应该是正确的大小:480 * 360 * 4(我认为就是这种情况)。

您应该提供adb logcat输出:adb.exe logcat OMXClient:V OMXCodec:V *:W