初始化编码器:
void VideoEncoder::Init(int width, int height, int buffNumber)
{
DM_NATIVE_PRINT("VideoEncoder::Init Start... %dx%d", width, height);
imageW = width;
imageH = height;
mMaxBufferNumber = buffNumber;
mInputDataList = new DmSyncQueue<InputData_t>(buffNumber);
mOutputDataList = new DmSyncQueue<InputData_t>(buffNumber);
const char* mine = "video/avc";
mMediaCodec = AMediaCodec_createEncoderByType(mine);
AMediaFormat* videoFormat = AMediaFormat_new();
AMediaFormat_setString(videoFormat, "mime", mine);
AMediaFormat_setInt32(videoFormat, AMEDIAFORMAT_KEY_WIDTH, width); // 视频宽度
AMediaFormat_setInt32(videoFormat, AMEDIAFORMAT_KEY_HEIGHT, height); // 视频高度
AMediaFormat_setInt32(videoFormat, AMEDIAFORMAT_KEY_COLOR_FORMAT, 2135033992);//COLOR_FormatYUV422Flexible
AMediaFormat_setInt32(videoFormat, AMEDIAFORMAT_KEY_BIT_RATE, height*width*4);//帧传输速率
AMediaFormat_setInt32(videoFormat, AMEDIAFORMAT_KEY_FRAME_RATE, 25);
AMediaFormat_setInt32(videoFormat, AMEDIAFORMAT_KEY_I_FRAME_INTERVAL, 5);
media_status_t status = AMediaCodec_configure(mMediaCodec, videoFormat, NULL, NULL, AMEDIACODEC_CONFIGURE_FLAG_ENCODE);
if (status != AMEDIA_OK)
{
AMediaCodec_delete(mMediaCodec);
mMediaCodec = NULL;
opened = false;
} else {
status = AMediaCodec_start(mMediaCodec);
if (status != AMEDIA_OK)
{
DM_NATIVE_ERR_PRINT("AMediaCodec_start: Could not start decoder.");
}
run = true;
mLoopThread = new std::thread(&VideoEncoder::Loop, this);
opened = true;
}
AMediaFormat_delete(videoFormat);
DM_NATIVE_PRINT("VideoEncoder::Init Done");
}
编码器数据编码:
编码器线程:
void VideoEncoder::Loop()
{
while(run) {
Encode();
}
}
void VideoEncoder::Encode()
{
#ifndef WIN32
InputData_t input;
if (mMediaCodec =&#