单帧
JNIEXPORT jbyteArray JNICALL
Java_com_uestc_smileteeth_view_recordvideo_RecordVideoLib_encodeFrame(JNIEnv *env, jclass type,
jbyteArray yuv420p_,
jint width, jint height,
jint index) {
jbyte *yuv420p = (*env)->GetByteArrayElements(env, yuv420p_, NULL);
AVCodec *pCodec;
AVCodecContext *pCodecCtx = NULL;
int i, ret, got_output;
AVFrame *pFrame;
AVPacket pkt;
int y_size;
jbyteArray h264;
//编码格式;
enum AVCodecID codec_id = AV_CODEC_ID_H264;
int in_w = width, in_h = height;
//注册所有编解码器;
avcodec_register_all();
//寻找解码器;
pCodec = avcodec_find_encoder(codec_id);
if (!pCodec) {
LOGI("Codec not found");
}
pCodecCtx = avcodec_alloc_context3(pCodec);
if (!pCodecCtx) {
LOGI("Could not allocate video codec context!");
}
pCodecCtx->bit_rate = 4000000;
pCodecCtx->width = in_w;
pCodecCtx->height = in_h;
pCodecCtx->time_base.num = 1;
pCodecCtx->time_base.den = 25;
pCodecCtx->gop_size = 10;
pCodecCtx->max_b_frames = 0;
pCodecCtx->pix_fmt = AV_PIX_FMT_YUV420P;
if (codec_id == AV_CODEC_ID_H264) {
av_opt_set(pCodecCtx->priv_data, "preset", "slow", 0);
// av_opt_set(pCodecCtx->priv_data, "preset", "superfast", 0);
// av_opt_set(pCodecCtx->priv_data, "tune", "zerolatency", 0);
}
if (avcodec_open2(pCodecCtx, pCodec, NULL) < 0) {
LOGI("Could not open codec!");
}
pFrame = av_frame_alloc();
if (!pFrame) {
LOGI("Could not allocate video frame!");
}
pFrame->format = pCodecCtx->pix_fmt;
pFrame->width = pCodecCtx->width;
pFrame->height = pCodecCtx->height;
ret = av_image_alloc(pFrame->data, pFrame->linesize, pCodecCtx->width, pCodecCtx->height,
pCodecCtx->pix_fmt, 16);
if (ret < 0) {
LOGI("Could not allocate raw picture buffer!");
}
y_size = pCodecCtx->width * pCodecCtx->height;
//Encode
av_init_packet(&pkt);