使用mcisendstring播放视频发生闪烁的问题

0

win32控制台程序,多字节字符集。

源码:

#include <graphics.h>
#pragma comment(lib,"Winmm.lib")

int main()
{
	char Mci_open[MAX_PATH] = { 0 };
	char Mci_set[MAX_PATH] = { 0 };

	HWND hWnd = initgraph(1035,515);

	sprintf(Mci_open, "open \"D:\\PR输出\\Dasiy.wmv\" alias video parent %u style CHILD", hWnd);//打开并设置在easyx窗口下播放
	sprintf(Mci_set, "put myvideo window at %d %d %d %d", 0, 0, 1035, 515);

	mciSendString(Mci_open, NULL, 0, NULL);
	mciSendString(Mci_set, NULL, 0, NULL);
	mciSendString("play video wait", NULL, 0, NULL);

	return 0;
}

最开始尝试的是h264编码的avi格式,有视频画面无声音,且画面闪烁严重。

然后尝试将播放设置改为直接创建新窗口,结果是视频画面正常无闪烁,依旧没声音。

生成的新窗口无法操作,又改回easyx下播放。

之后看到贴吧里说要使用Cinepak Codec编码的avi,但是我的Pr没有这个编码器,我选择导出avi(未压缩),v210编码器无画面但声音正常,UYVY编码器有画面且声音正常,但闪烁依旧严重。

然后我尝试使用windows media即wmv格式时,有声音有画面,且画面闪烁有明显改善,从avi格式下的频闪变成约半秒一次黑屏。

而且我发现当鼠标在窗口上方标题栏长按时,不会再有闪烁,视频播放正常。

猜测是easyx创建窗口的消息机制造成的闪烁。

请问如何解决?

ava
纸鸦

2020-7-28

0

如果单纯是播放视频,在确保视频编码被 mcisendstring 支持的前提下(比如 mpeg 编码),启用批量绘图就好了:

……
HWND hWnd = initgraph(1035, 515);
BeginBatchDraw();

……

注:只需要启用批量绘图,无需调用 FlashBatchDraw。

但即便解决了闪烁问题,可能还会有别的奇怪的问题,毕竟用 mcisendstring 播放视频的并不多见,主要是主流视频格式都不支持。现在比较多的是调用 vlc 或 ffmpeg,功能强大,编码支持齐全。

ava
慢羊羊

2020-7-28

感谢,闪烁问题解决了,也确实有很多奇奇怪怪的问题,比如窗口失去焦点后就经常无响应。 - 纸鸦 2020-7-29