Android中使用FFMPEG将yuv420p编码为h264

单帧

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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值