我正在尝试对来自字节数组缓冲区的视频进行编码,并且我正在使用本机代码中的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
答案 0 :(得分:3)
我刚刚发现了我的( dumb )问题:在调用start()
之前,我在mVideoEncoder
(OMXCodec
实例)上调用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