FFmpeg capture stream picture

Capture live stream and convert YUV to JPEG using FFmpeg.

static int capture_picture(Decoder *d, AVFrame *frame)
{
    AVPacket pkt;
    int got_picture = 0;
    int ret = 0;

    AVCodec *pCodec = avcodec_find_encoder(AV_CODEC_ID_MJPEG);
    if(!pCodec) 
        return -1;
    AVCodecContext *pCodecCtx = avcodec_alloc_context3(pCodec);
    if(!pCodecCtx) 
        return -2;

    pCodecCtx->codec_type = AVMEDIA_TYPE_VIDEO;
    pCodecCtx->pix_fmt = AV_PIX_FMT_YUVJ420P;
    pCodecCtx->width = d->avctx->width;
    pCodecCtx->height = d->avctx->height;
    pCodecCtx->time_base.num = 1;
    pCodecCtx->time_base.den = 30;

    av_new_packet(&pkt, d->avctx->width * d->avctx->height * 3);

    ret = avcodec_open2(pCodecCtx, pCodec, NULL);
    if(ret < 0)
         goto fail;

    ret = avcodec_encode_video2(pCodecCtx, &pkt, frame, &got_picture);
    if(ret < 0) 
        goto fail;

    if(got_picture) 
        printf("Got the data: size=%d, w=%d, h=%d, format=%d\n", pkt.size, frame->width, frame->height, frame->format);

fail:
    av_free_packet(&pkt);
    if(pCodecCtx) 
        avcodec_free_context(&pCodecCtx);
    return ret;
}
Call above function in decoder_decode_frame() or queue_picture() in ffplay.c file.

Note: this will not work when using hard decoding.

猜你喜欢

转载自blog.csdn.net/hhbgk/article/details/79745933