資源簡介
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?height;?h++)
????{
????????for?(int?w?=?0;?w?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
- 上一篇:移動筆試專業知識
- 下一篇:windows游戲編程大師技巧.part08.rar
評論
共有 條評論