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

相关推荐
美狐美颜SDK开放平台4 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
2601_955662464 天前
短剧多人对白怎么配?2026年多角色配音工具对比
大数据·人工智能·音视频·语音识别
开发笔记-阿牛4 天前
蓝牙音乐灯拆解,又一次拆到蓝牙音乐灯芯片CK6865L
人工智能·单片机·嵌入式硬件·音视频·音频
旺仔小馒头wang5 天前
AI 智能手机发布会:赋予人类的五种新能力
人工智能·学习·音视频
纳祥科技5 天前
拆机拆到芯片级:ARC功放机里的NX7026、NX8420、NX6805
单片机·音视频·智能音箱
youandyouyou5 天前
律所内部培训共享的内网部署方案:架构、参数与三步落地
音视频
爱吃提升5 天前
文生视频核心
人工智能·音视频
2601_955662465 天前
抖音视频怎么做多语言配音?2026年AI配音工具与制作流程详解
人工智能·音视频·语音识别·视频
音视频牛哥5 天前
Android与HarmonyOS NEXT如何接入GB28181:从SIP到PS/RTP的完整链路
音视频·gb28181-2022对接·鸿蒙next gb28181·gb/t 28181-2022·gb/t 28181-2016·gb28181-2022平台
美狐美颜SDK开放平台5 天前
直播APP源码与视频美颜sdk如何配合?一套完整开发思路
android·人工智能·计算机视觉·音视频·直播美颜sdk