资源简介

Qt + ffmpeg写的Windows屏幕录制程序(包含源程序和编译好的可执行程序) 程序使用方法: ScreenCapture w h w和h分别表示希望录制的帧宽度和高度

资源截图

代码片段和文件信息

#define __STDC_CONSTANT_MACROS
extern “C“
{
#include 
#include 
#include 
#include 
#include 
#include 
#include 
}

#define INBUF_SIZE 4096
#define AUDIO_INBUF_SIZE 20480
#define AUDIO_REFILL_THRESH 4096

#include “capthread.h“
#include 
#include 


void CapThread::capframe()
{
    QImage image = QPixmap::grabWindow(QApplication::desktop()->winId()).toImage();
    image = image.scaled(QSize(resize_width resize_height));

    av_init_packet(pkt);
    pkt->data = NULL;    // packet data will be allocated by the encoder
    pkt->size = 0;

    for (int h = 0; h < c->height; h++)
    {
        for (int w = 0; w < c->width; w++)
        {
            QRgb rgb = image.pixel(w h);

            int r = qRed(rgb);
            int g = qGreen(rgb);
            int b = qBlue(rgb);

            int dy = ((66*r + 129*g + 25*b) >> 8) + 16;
            int du = ((-38*r + -74*g + 112*b) >> 8) + 128;
            int dv = ((112*r + -94*g + -18*b) >> 8) + 128;

            uchar yy = (uchar)dy;
            uchar uu = (uchar)du;
            uchar vv = (uchar)dv;

            frame->data[0][h * frame->linesize[0] + w] = yy;

            if(h % 2 == 0 && w % 2 == 0)
            {
                frame->data[1][h/2 * (frame->linesize[1]) + w/2] = uu;
                frame->data[2][h/2 * (frame->linesize[2]) + w/2] = vv;
            }

        }
    }

    frame->pts = i;

    /* encode the image */
    ret = avcodec_encode_video2(c pkt frame &got_output);

    if (ret < 0)
    {
        printf(“Error encoding frame\n“);
        exit(1);
    }

    if (got_output)
    {
        printf(“Write frame %3d (size=%5d)\n“ i pkt->size);

        fwrite(pkt->data 1 pkt->size f);
        fflush(f);
        av_free_packet(pkt);
    }

    i ++;
}


CapThread::CapThread(int width int height Qobject *parent) : QThread(parent)
{
    resize_width = width;
    resize_height = height;

    avcodec_register_all();
    c= NULL;
    pkt = new AVPacket;
    i = 0;


    codec = avcodec_find_encoder(AV_CODEC_ID_MPEG1VIDEO);

    if (codec == 0)
    {
        printf(“find encoder failed\n“);
        exit(1);
    }
/*
    const AVRational* sup = codec->supported_framerates;
    int k = 0;
    while(true)
    {
        AVRational rat = sup[k];
        if(rat.num == 0 && rat.den == 0)
            break;

        printf(“%d  %d\n“ rat.num rat.den);
        k++;
    }*/

    c = avcodec_alloc_context3(codec);
    if (!c)
    {
        printf(“alloc context failed\n“);
        exit(1);
    }

    //c->bit_rate = 400000;
    c->width = width;
    c->height = height;
    c->time_base = (AVRational){1 25};
    c->gop_size = 20;
    c->max_b_frames = 1;
    c->pix_fmt = AV_PIX_FMT_YUV420P;
 

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2014-05-30 21:47  ScreenCapture\
     文件        3997  2014-05-30 21:45  ScreenCapture\capthread.cpp
     文件         704  2014-05-30 21:40  ScreenCapture\capthread.h
     文件        4161  2014-05-30 21:38  ScreenCapture\main.cpp
     目录           0  2014-05-30 21:47  ScreenCapture\release\
     文件    19348992  2014-05-28 10:07  ScreenCapture\release\avcodec-55.dll
     文件     1340928  2014-05-28 10:07  ScreenCapture\release\avdevice-55.dll
     文件     2036224  2014-05-28 10:07  ScreenCapture\release\avfilter-4.dll
     文件     5651456  2014-05-28 10:07  ScreenCapture\release\avformat-55.dll
     文件      420864  2014-05-28 10:07  ScreenCapture\release\avutil-52.dll
     文件      118784  2011-12-02 09:30  ScreenCapture\release\libgcc_s_dw2-1.dll
     文件      979982  2011-12-02 09:30  ScreenCapture\release\libstdc++-6.dll
     文件       47972  2011-08-24 06:59  ScreenCapture\release\mingwm10.dll
     文件      121344  2014-05-28 10:07  ScreenCapture\release\postproc-52.dll
     文件     2847232  2013-03-28 21:21  ScreenCapture\release\QtCore4.dll
     文件    10137600  2013-03-28 21:20  ScreenCapture\release\QtGui4.dll
     文件       63488  2014-05-30 21:45  ScreenCapture\release\ScreenCapture.exe
     文件      278016  2014-05-28 10:07  ScreenCapture\release\swresample-0.dll
     文件      434176  2014-05-28 10:07  ScreenCapture\release\swscale-2.dll
     文件         746  2014-05-30 13:38  ScreenCapture\ScreenCapture.pro
     文件       28043  2014-05-30 21:43  ScreenCapture\ScreenCapture.pro.user

评论

共有 条评论