FFmpeg capture stream picture

21 篇文章 0 订阅
19 篇文章 0 订阅

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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值