FFmpeg capture stream picture

本文介绍了一个使用FFmpeg捕获直播流并将YUV格式转换为JPEG的方法。通过定义一个名为capture_picture的静态函数,实现视频帧的编码。此函数首先查找MJPEG编解码器,分配编解码器上下文,并设置相应的参数。然后创建AVPacket,打开编解码器上下文,并调用avcodec_encode_video2进行视频帧的编码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值