额外减小
发表于 2023-1-30 21:16:52
Mike_python小 发表于 2023-1-30 21:14
卧槽原来可以不用windows.h,我这就去试试
只要你可以找到跟sleep()函数对应的
Mike_python小
发表于 2023-1-30 21:19:21
额外减小 发表于 2023-1-30 21:16
只要你可以找到跟sleep()函数对应的
这就抛弃clion,去投奔xcode(不过太大了)
额外减小
发表于 2023-1-30 21:21:31
Mike_python小 发表于 2023-1-30 21:19
这就抛弃clion,去投奔xcode(不过太大了)
不是
额外减小
发表于 2023-1-30 21:22:39
Mike_python小 发表于 2023-1-30 21:19
这就抛弃clion,去投奔xcode(不过太大了)
你听我说
确实要加windows.h
跟编译器没什么关系。
不是她的错()
你要不去其他库里面找对应的函数?
或者自己写一个()
额外减小
发表于 2023-1-30 21:24:08
Mike_python小 发表于 2023-1-30 21:19
这就抛弃clion,去投奔xcode(不过太大了)
跟编译器没有关系
实际上要加windows.h
人造人
发表于 2023-1-30 23:15:31
不管是你创建的窗口也好,还是现有的窗口也好,只要知道了id,那么画吧,想画什么就画什么
是的,你没有看错,这是在那个黑框框里面画的,用gdi函数给这个黑框框贴了一个图片,^_^
那么任务来了,把前言中的那个图片效果做出来,当然不是要你贴一个图片上去,是要动画效果,^_^
贴图片的代码我给你了,不停的贴图片就是动画
#include <stdio.h>
#include <windows.h>
int main(void) {
HWND hwnd = GetConsoleWindow();
HDC hdc_cmd = GetDC(hwnd);
HBITMAP img = LoadImage(NULL, "image.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
HDC hdc_img = CreateCompatibleDC(NULL);
HGDIOBJ obj_hdc = SelectObject(hdc_img, img);
BITMAP bm; GetObject(img, sizeof(BITMAP), &bm);
BitBlt(hdc_cmd, 0, 0, bm.bmWidth, bm.bmHeight, hdc_img, 0, 0, SRCCOPY);
SelectObject(hdc_img, obj_hdc);
DeleteDC(hdc_img);
DeleteObject(img);
ReleaseDC(hwnd, hdc_cmd);
getchar();
return 0;
}
人造人
发表于 2023-1-30 23:27:56
^_^
额外减小
发表于 2023-1-30 23:31:01
人造人 发表于 2023-1-30 23:15
不管是你创建的窗口也好,还是现有的窗口也好,只要知道了id,那么画吧,想画什么就画什么
是的,你没有看 ...
!!!
膜拜大佬
但我不会”windows程序设计“
额外减小
发表于 2023-1-30 23:32:42
人造人 发表于 2023-1-30 23:15
不管是你创建的窗口也好,还是现有的窗口也好,只要知道了id,那么画吧,想画什么就画什么
是的,你没有看 ...
我没学到那么深{:10_266:}
让我先去了解下{:10_243:}
额外减小
发表于 2023-1-30 23:37:17
人造人 发表于 2023-1-30 23:27
^_^
报错了
虽然看不懂
但我想知道为什么
C:\Users\summer\Desktop\codehome>gcc cccc.c
C:\Users\summer\AppData\Local\Temp\ccEK7Upj.o:cccc.c:(.text+0x6e): undefined reference to `__imp_CreateCompatibleDC'
C:\Users\summer\AppData\Local\Temp\ccEK7Upj.o:cccc.c:(.text+0x86): undefined reference to `__imp_SelectObject'
C:\Users\summer\AppData\Local\Temp\ccEK7Upj.o:cccc.c:(.text+0xa6): undefined reference to `__imp_GetObjectA'
C:\Users\summer\AppData\Local\Temp\ccEK7Upj.o:cccc.c:(.text+0xf0): undefined reference to `__imp_BitBlt'
C:\Users\summer\AppData\Local\Temp\ccEK7Upj.o:cccc.c:(.text+0x104): undefined reference to `__imp_SelectObject'
C:\Users\summer\AppData\Local\Temp\ccEK7Upj.o:cccc.c:(.text+0x114): undefined reference to `__imp_DeleteDC'
C:\Users\summer\AppData\Local\Temp\ccEK7Upj.o:cccc.c:(.text+0x124): undefined reference to `__imp_DeleteObject'
collect2.exe: error: ld returned 1 exit status
人造人
发表于 2023-1-30 23:37:58
额外减小 发表于 2023-1-30 23:37
报错了
虽然看不懂
但我想知道为什么
加上 -lgdi32
人造人
发表于 2023-1-30 23:39:23
额外减小
发表于 2023-1-30 23:45:26
本帖最后由 额外减小 于 2023-1-30 23:46 编辑
人造人 发表于 2023-1-30 23:37
加上 -lgdi32
怎么回事呢
好像没有填满。
人造人
发表于 2023-1-31 00:00:43
额外减小 发表于 2023-1-30 23:45
怎么回事呢
好像没有填满。
我并没有对图片进行变换,图片是多大,贴上去就是多大
原样贴上去而已
^_^
额外减小
发表于 2023-1-31 00:17:43
人造人 发表于 2023-1-31 00:00
我并没有对图片进行变换,图片是多大,贴上去就是多大
原样贴上去而已
^_^
好的。
那我试试看
人造人
发表于 2023-2-1 18:06:04
我又来了,这一次不贴图片了,贴视频,^_^
使用了ffmpeg这个库,目前只实现了视频,音频部分的代码还没写
要实现烟花动画,那就找一个烟花的视频
另外,有屏幕的地方就有BadApple对吧,^_^
怎么做呢?简单,把BadApple.mp4改成test.mp4,然后放到这个exe文件所在的目录,运行这个exe就可以了
论坛限制,发不了gif动画效果,那就贴几个图片吧
【视频素材】顶级烟花视频素材包无版权无水印[1080p HD]:https://www.bilibili.com/video/BV1Zp4y1S7LT/?vd_source=d7ab559fd4b017311a641effed03ee60
#include <stdio.h>
#include <windows.h>
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
#include <libswscale/swscale.h>
#include <libavutil/time.h>
#define SCREEN_WIDTH 1860
#define SCREEN_HEIGHT 930
void output_audio_frame(const AVFrame *frame) {
}
void write_frame(const AVFrame *frame) {
HBITMAP img = CreateBitmap(frame->width, frame->height, 1, 32, frame->data);
HWND hwnd = GetConsoleWindow();
HDC hdc_cmd = GetDC(hwnd);
HDC hdc_img = CreateCompatibleDC(NULL);
HGDIOBJ obj_hdc = SelectObject(hdc_img, img);
BITMAP bm; GetObject(img, sizeof(BITMAP), &bm);
BitBlt(hdc_cmd, 0, 0, bm.bmWidth, bm.bmHeight, hdc_img, 0, 0, SRCCOPY);
SelectObject(hdc_img, obj_hdc);
DeleteDC(hdc_img);
ReleaseDC(hwnd, hdc_cmd);
DeleteObject(img);
}
void output_video_frame(const AVFrame *frame) {
int width = frame->width;
int height = frame->height;
struct SwsContext *sws_ctx = sws_getContext(width, height, frame->format, SCREEN_WIDTH, SCREEN_HEIGHT, \
AV_PIX_FMT_BGRA, SWS_FAST_BILINEAR, NULL, NULL, NULL);
AVFrame *frame_bgra = av_frame_alloc();
frame_bgra->format = AV_PIX_FMT_BGRA;
frame_bgra->width = SCREEN_WIDTH;
frame_bgra->height = SCREEN_HEIGHT;
av_frame_get_buffer(frame_bgra, 4);
sws_scale(sws_ctx, (const uint8_t *const *)frame->data, frame->linesize, 0, height, frame_bgra->data, \
frame_bgra->linesize);
write_frame(frame_bgra);
av_frame_free(&frame_bgra);
sws_freeContext(sws_ctx);
}
void decode_packet(AVCodecContext *dec_ctx, const AVPacket *packet) {
avcodec_send_packet(dec_ctx, packet);
AVFrame *frame = av_frame_alloc();
while(!avcodec_receive_frame(dec_ctx, frame)) {
if(dec_ctx->codec->type == AVMEDIA_TYPE_AUDIO) output_audio_frame(frame);
if(dec_ctx->codec->type == AVMEDIA_TYPE_VIDEO) output_video_frame(frame);
av_frame_unref(frame);
}
av_frame_free(&frame);
}
int main(void) {
const char *filename = "test.mp4";
AVFormatContext *fmt_ctx = NULL;
avformat_open_input(&fmt_ctx, filename, NULL, NULL);
avformat_find_stream_info(fmt_ctx, NULL);
av_dump_format(fmt_ctx, 0, filename, 0);
int audio_stream_idx = av_find_best_stream(fmt_ctx, AVMEDIA_TYPE_AUDIO, -1, -1, NULL, 0);
int video_stream_idx = av_find_best_stream(fmt_ctx, AVMEDIA_TYPE_VIDEO, -1, -1, NULL, 0);
AVStream *audio_stream = fmt_ctx->streams;
AVStream *video_stream = fmt_ctx->streams;
const AVCodec *audio_dec = avcodec_find_decoder(audio_stream->codecpar->codec_id);
const AVCodec *video_dec = avcodec_find_decoder(video_stream->codecpar->codec_id);
AVCodecContext *audio_dec_ctx = avcodec_alloc_context3(audio_dec);
AVCodecContext *video_dec_ctx = avcodec_alloc_context3(video_dec);
avcodec_parameters_to_context(audio_dec_ctx, audio_stream->codecpar);
avcodec_parameters_to_context(video_dec_ctx, video_stream->codecpar);
avcodec_open2(audio_dec_ctx, audio_dec, NULL);
avcodec_open2(video_dec_ctx, video_dec, NULL);
AVPacket *packet = av_packet_alloc();
int64_t start_time = av_gettime();
while(!av_read_frame(fmt_ctx, packet)) {
AVCodecContext *dec_ctx = NULL;
int stream_idx = packet->stream_index;
dec_ctx = stream_idx == audio_stream_idx ? audio_dec_ctx : dec_ctx;
dec_ctx = stream_idx == video_stream_idx ? video_dec_ctx : dec_ctx;
if(dec_ctx) decode_packet(dec_ctx, packet);
int64_t pts = av_rescale_q(packet->pts, fmt_ctx->streams->time_base, \
av_make_q(1, AV_TIME_BASE));
int64_t now_time = av_gettime() - start_time;
if(pts > now_time) av_usleep(pts - now_time);
av_packet_unref(packet);
}
decode_packet(audio_dec_ctx, NULL);
decode_packet(video_dec_ctx, NULL);
av_packet_free(&packet);
avcodec_free_context(&video_dec_ctx);
avcodec_free_context(&audio_dec_ctx);
avformat_close_input(&fmt_ctx);
return 0;
}
额外减小
发表于 2023-2-1 19:03:55
人造人 发表于 2023-2-1 18:06
我又来了,这一次不贴图片了,贴视频,^_^
使用了ffmpeg这个库,目前只实现了视频,音频部分的代码还没写
...
没文化的我只能哇
{:10_257:}
额外减小
发表于 2023-2-1 19:04:28
人造人 发表于 2023-2-1 18:06
我又来了,这一次不贴图片了,贴视频,^_^
使用了ffmpeg这个库,目前只实现了视频,音频部分的代码还没写
...
您懂的真多
人造人
发表于 2023-2-1 19:09:36
额外减小 发表于 2023-2-1 19:04
您懂的真多
^_^
人造人
发表于 2023-2-3 19:53:14
继续,音频部分也没问题了
接下来就是合并这两个程序了
#include <stdio.h>
#include <initguid.h>
#include <windows.h>
#include <objbase.h>
#include <mmdeviceapi.h>
#include <audioclient.h>
void LoadData(BYTE *pData, UINT32 numBufferFrames, const WAVEFORMATEX *pwfx, DWORD *dwFlags) {
UINT32 count = numBufferFrames * pwfx->nBlockAlign;
size_t ret = fread(pData, 1, count, stdin);
if(ret != count) {
*dwFlags |= AUDCLNT_BUFFERFLAGS_SILENT;
memset(pData + ret, 0, count - ret);
}
}
int main(void) {
freopen("test.pcm", "rb", stdin);
CoInitialize(NULL);
IMMDeviceEnumerator *pEnumerator;
CoCreateInstance(&CLSID_MMDeviceEnumerator, NULL, CLSCTX_INPROC_SERVER, &IID_IMMDeviceEnumerator, \
(LPVOID *)&pEnumerator);
IMMDevice *pDevice;
pEnumerator->lpVtbl->GetDefaultAudioEndpoint(pEnumerator, eRender, eMultimedia, &pDevice);
IAudioClient *pAudioClient;
pDevice->lpVtbl->Activate(pDevice, &IID_IAudioClient, CLSCTX_INPROC_SERVER, NULL, (LPVOID *)&pAudioClient);
WAVEFORMATEX wfx = {
.wFormatTag = WAVE_FORMAT_PCM,
.nChannels = 2,
.nSamplesPerSec = 44100,
.nAvgBytesPerSec = 44100 * 8,
.nBlockAlign = 8,
.wBitsPerSample = 32,
.cbSize = 0
};
WAVEFORMATEX *pwfx;
pAudioClient->lpVtbl->IsFormatSupported(pAudioClient, AUDCLNT_SHAREMODE_SHARED, &wfx, &pwfx);
if(!pwfx) {pwfx = CoTaskMemAlloc(sizeof(wfx)); *pwfx = wfx;}
pAudioClient->lpVtbl->Initialize(pAudioClient, AUDCLNT_SHAREMODE_SHARED, 0, 10000000, // 1秒的缓冲区
0, pwfx, NULL);
IAudioRenderClient *pRenderClient;
pAudioClient->lpVtbl->GetService(pAudioClient, &IID_IAudioRenderClient, (LPVOID *)&pRenderClient);
UINT32 numBufferFrames;
pAudioClient->lpVtbl->GetBufferSize(pAudioClient, &numBufferFrames);
pAudioClient->lpVtbl->Start(pAudioClient);
DWORD dwFlags = 0;
while((dwFlags & AUDCLNT_BUFFERFLAGS_SILENT) == 0) {
UINT32 numPaddingFrames;
pAudioClient->lpVtbl->GetCurrentPadding(pAudioClient, &numPaddingFrames);
if(numBufferFrames > numPaddingFrames) {
BYTE *pData;
pRenderClient->lpVtbl->GetBuffer(pRenderClient, numBufferFrames - numPaddingFrames, &pData);
LoadData(pData, numBufferFrames - numPaddingFrames, pwfx, &dwFlags);
pRenderClient->lpVtbl->ReleaseBuffer(pRenderClient, numBufferFrames - numPaddingFrames, dwFlags);
}
Sleep(500); // 半秒醒过来填一次缓冲区
}
pAudioClient->lpVtbl->Stop(pAudioClient);
pRenderClient->lpVtbl->Release(pRenderClient);
CoTaskMemFree(pwfx);
pAudioClient->lpVtbl->Release(pAudioClient);
pDevice->lpVtbl->Release(pDevice);
pEnumerator->lpVtbl->Release(pEnumerator);
CoUninitialize();
return 0;
}