ffmpeg使用x11录屏

version

#define FFMPEG_VERSION "6.1.1"

note

x11视频采集结构:AVInputFormat ff_xcbgrab_demuxer

code

复制代码
void CFfmpegOps::CaptureVideo(const char *outFileName)
{
    const AVInputFormat *iFmt = nullptr;
    size_t n = 0;
    AVFormatContext *iFmtCtx = nullptr;
    AVDictionary *iFmtCtxOps = nullptr;
    AVStream *video_stream = nullptr;
    int video_stream_index = 0;
    const AVPixFmtDescriptor *pix_fmt_desc = nullptr;
    int bits_per_pixel = 0;         // 像素数据
    int padding_bits_per_pixel = 0; // 像素数据+附加数据
    int pixel_fmt_is_planar = 0;
    int width = 0;
    int height = 0;
    int img_buffer_size = 0;
    int ret = -1;
    int i = 0;
    AVPacket* avpacket = nullptr;
    int capture_cnt = 1000;
    FILE *out_fp = nullptr;

    if (!outFileName)
    {
        printf("return for !outFileName\n");
        return;
    }

    iFmt = av_find_input_format("x11grab");
    if (!iFmt)
    {
        printf("av_find_input_format error\n");
        goto end;
    }

#if 0
    // 设置x11grab输入格式的可选参数
    ret = av_dict_set(&iFmtCtxOps, "framerate", "60", 0);
    if (ret < 0)
    {
        printf("av_dict_set framerate error:%s\n", GetFfmpegERR(ret));
        goto end;
    }
#endif

    ret = avformat_open_input(&iFmtCtx, nullptr, iFmt, &iFmtCtxOps);
    if (ret < 0)
    {
        printf("avformat_open_input error:%s\n", GetFfmpegERR(ret));
        goto end;
    }

    if (iFmtCtx->nb_streams < 1)
    {
        printf("no stream\n");
        goto end;
    }

    video_stream = iFmtCtx->streams[video_stream_index];

    width = video_stream->codecpar->width;
    height = video_stream->codecpar->height;

    // bgr0:b g r 0
    pix_fmt_desc = av_pix_fmt_desc_get((AVPixelFormat)(video_stream->codecpar->format));
    bits_per_pixel = av_get_bits_per_pixel(pix_fmt_desc);
    padding_bits_per_pixel = av_get_padded_bits_per_pixel(pix_fmt_desc);
    pixel_fmt_is_planar = (AV_PIX_FMT_FLAG_PLANAR & pix_fmt_desc->flags) ? 1 : 0;

    img_buffer_size = av_image_get_buffer_size((AVPixelFormat)(video_stream->codecpar->format), width, height, 1);
    if (img_buffer_size == (bits_per_pixel / 8 * width * height))
    {
        printf("img_buffer_size with bits_per_pixel\n");
    }
    else if (img_buffer_size == (padding_bits_per_pixel / 8 * width * height))
    {
        printf("img_buffer_size with padding_bits_per_pixel\n");
    }

    avpacket = av_packet_alloc();
    if (!avpacket)
    {
        printf("av_packet_alloc error\n");
        goto end;
    }

    out_fp = fopen(outFileName, "wb");
    if (!out_fp)
    {
        printf("fopen error\n");
        goto end;
    }

    while (capture_cnt)
    {
        ret = av_read_frame(iFmtCtx, avpacket);
        if (ret < 0)
        {
            printf("av_read_frame error\n");
            continue;
        }

        if (avpacket->stream_index != video_stream_index)
        {
            av_packet_unref(avpacket);
            continue;
        }

        if (avpacket->size == img_buffer_size)
        {
            for (i = 0; i < width * height; i++)
            {
                // write bgr of bgr0
                n = fwrite(avpacket->data + i * 4, sizeof(uint8_t), 3, out_fp);
            }
        }

        av_packet_unref(avpacket);

        --capture_cnt;
    }

end:
    if (out_fp)
    {
        fclose(out_fp);
        out_fp = nullptr;
    }

    if (avpacket)
    {
        av_packet_free(&avpacket);
        avpacket = nullptr;
    }

    if (iFmtCtxOps)
    {
        av_dict_free(&iFmtCtxOps);
        iFmtCtxOps = nullptr;
    }

    if (iFmtCtx)
    {
        avformat_close_input(&iFmtCtx);
    }
}

performance

相关推荐
王江奎4 小时前
FFmpeg 升级指北
ffmpeg
】余185381628006 小时前
碰一碰发视频源码搭建与定制化开发:支持OEM
音视频
张晓~183399481217 小时前
数字人分身+矩阵系统聚合+碰一碰发视频: 源码搭建-支持OEM
线性代数·矩阵·音视频
山登绝顶我为峰 3(^v^)39 小时前
如何录制带备注的演示文稿(LaTex Beamer + Pympress)
c++·线性代数·算法·计算机·密码学·音视频·latex
雨夜和阳晨9 小时前
FFmpeg录制屏幕及声音
ffmpeg
吴声子夜歌9 小时前
FFmpeg——基础知识及FFmpeg框架
ffmpeg
却道天凉_好个秋14 小时前
音视频学习(三十六):websocket协议总结
websocket·音视频
【余1853816280016 小时前
碰一碰发视频源码搭建定制化开发:支持OEM
音视频
EQ-雪梨蛋花汤16 小时前
【Part 3 Unity VR眼镜端播放器开发与优化】第四节|高分辨率VR全景视频播放性能优化
unity·音视频·vr
菜包eo20 小时前
基于二维码的视频合集高效管理与分发技术
音视频