【新手紧急求助】:加载并运行OCX控件,导致IE浏览器页面崩溃的问题?
用VC++6.0写了个有窗口的MFC OCX控件,实现实时网络音视频流的解码和播放,在IE6.0(IE7或IE8也会存在同样的问题)中加载该控件并运行后,可以正常的解码\播放音视频.但发现按F5刷新显示页面一次或多次后,出现IE页面崩溃! 晕啊...
错误提示如下:
iexplore.exe--应用程序错误
"0x77c1840c" 指令引用的"0x00000000"内存.该内存不能为"read"
要终止程序,请点击"确定".
要调试程序,请点击"取消".
请高手过来帮帮忙!谢了
[解决办法]
MFC,OpenGL高手请进: http://topic.csdn.net/u/20100531/20/fe55580f-977b-4e59-83d9-c5261ad44568.html
[解决办法]
debugger attach进去看看就清楚了
[解决办法]
指针地址越界了吧
可能是内存泄露
[解决办法]
老兄 尝试使用debugview 跟踪打印消息
比较好用的
[解决办法]
试了一下,ie直接就崩溃退出了,其他基于ie内核的浏览器进入页面之后就卡死了,不知是网速慢下载视频还是怎么回事,长时间没反应。
[解决办法]
刚试过,网页可以打开,但不能看到视频图像喔。另外请教下,我也是在做264视频监控,而且在网页中中嵌入ocx控件的,请问下,为什么我的html页面能用360的浏览器打开,但IE就不能打开呢?他们用的都是一样的内核的喔,楼主你知道这是怎么回事吗?
[解决办法]
这样测试有啥用,让大家看看IE怎么崩溃的?只有跟踪源码才能找到错误是在什么地方。
[解决办法]
难道说的就是我? 呵呵
[解决办法]
难道说的就是我? 呵呵
[解决办法]
mark
[解决办法]
既然是刷心导致的问题。我想还是你在ocx中析构和收回资源的时候没有收回完全造成的。造成两次加载ocx冲突。楼主可以从这方面找找原因。
因为刷心页面触发page_close与page_init事件,page_paint事件,所以,楼主想问题的出发点应该在这。
[解决办法]
楼主,你好,我想问下你们的cab怎么做才能自动下载安装,我搞了一个,在有些机器上(xp+sp2)无法安装,详细情况请看我的帖子:http://topic.csdn.net/u/20100709/15/8f48a386-adef-44e7-b71b-cfb589e801b3.html?78510
希望楼主可以帮忙下,我的控件是做摄像头拍摄的。
[解决办法]
你可以试试coreavc h264 decoder2.0, 网上有破解版。
我用它在普通双核PC上可以轻松解码720 50P。
[解决办法]
45ms,是长了点.
也许是参数设置的问题?
去掉异常处理试试.
另外,CoreAVC是只有FILTER版本,
不过你既然用过DSHOW,可以把CoreAVC
封装成DLL,这个并不难实现.
[解决办法]
3D API要比DDRAW API效率高。
参考
[解决办法]
./configure --prefix=`pwd`/mybuild --enable-memalign-hack --enable-shared --enable-static --disable-encoders --disable-muxers --disable-demuxers --disable-filters --disable-decoders --enable-decoder=h264 --enable-decoder=mjpeg --disable-ffmpeg --disable-ffplay --disable-ffserver --disable-parsers --enable-parser=h264 --disable-protocols --disable-bsfs --disable-network --disable-indevs --disable-debug --enable-runtime-cpudetect --enable-gpl --enable-version3
支持mjpeg和h264
不用考虑硬件加速,主流机器上1080P 12M 25帧 每帧在30-35ms左右 ,显示方面direct draw 和d3d都可以,但是direct draw 垂直同步比较难搞,特别是在多路情况下。
祝好运。
[解决办法]
不要关注显示的效率(除非你的代码很烂),硬件blt的效率都很高,你应该关注的是解码效率。
如果对视频撕裂不那么在意(在1080P的视频大运动量情况下,很容易出现)你可以考虑direct draw,简单高效。
如果你对视频质量要求较高,且希望实现多路视频播放,可以参考d3d 的swapchain。
[解决办法]
我的解码函数,希望对你有帮助
bool ffmpeg_dec::dec_one_frame(char* buf,int len,long systime,unsigned long long time_stamp,yuv_data_ptr& yuv_ptr)
{
//time_interval_check tm_check("dec check");
if(buf == NULL
[解决办法]
m_err)
{
return false;
}
m_avpkt.size = len;
m_avpkt.data = (uint8_t*)buf;
int got_picture;
while(m_avpkt.size > 0)
{
int ret = ::avcodec_decode_video2(m_context,m_picture,&got_picture,&m_avpkt);
if(ret < 0)
{
return false;
}
if(got_picture)
{
yuv_ptr = yuv_data_ptr(new yuv_data(m_context->width,
m_context->height,
m_picture->linesize[0],
m_picture->linesize[1]));
yuv_ptr->assign(m_picture->data[0],
m_picture->data[1],
m_picture->data[2],
m_picture->linesize[0],
m_picture->linesize[1],
m_context->width,
m_context->height,
time_stamp,
systime);
return true;
}
m_avpkt.data += ret;
m_avpkt.size -= ret;
}
//下面代码会在Udp丢包时产生永远无法解码的现象,还有待解决???
///*有时候第一个i帧必须将m_avpkt.data设为NULL,才能解出来,*/
m_avpkt.size = 0;
m_avpkt.data = NULL;
int ret = ::avcodec_decode_video2(m_context,m_picture,&got_picture,&m_avpkt);
if(ret < 0)
{
return false;
}
if(got_picture)
{
yuv_ptr = yuv_data_ptr(new yuv_data(m_context->width,
m_context->height,
m_picture->linesize[0],
m_picture->linesize[1]));
yuv_ptr->assign(m_picture->data[0],
m_picture->data[1],
m_picture->data[2],
m_picture->linesize[0],
m_picture->linesize[1],
m_context->width,
m_context->height,
time_stamp,
systime);
return true;
}
return false;
}
[解决办法]
写这个程序的时候,我的显卡不支持D3D RGB24直接渲染,所以在RGB24中也用shader了,
如果你的显卡支持RGB24,你可以修改代码试试看。
RGB24数据量比YUV420大,但是RGB的shader没有YUV420的计算量大。
[解决办法]
呵呵,今天才看到,你已经下载了。
[解决办法]
指针地址无效,
------解决方案--------------------
所谓不支持全屏,是指D3D中的应用程序独占显卡的全屏模式。
这里实现的全屏,如你所说,是把窗口放大为全屏,和独占模式的全屏相比,是伪全屏。
[解决办法]
你的显卡跑1080P应该没问题。
主板应该也不差吧,我以前遇到过主板导致的撕裂问题。
你下载新的DX9 SDK试试。
D3DPRESENT_INTERVAL_ONE就是做垂直同步,防撕裂的。
也可以试着修改显卡的一些3D属性,如垂直同步,三缓冲等。
我的GeForce 9800 GT跑720P, 1080P没有问题。
[解决办法]
win7下没有试过,有人也反应说有问题。
据说dx9在win7下是模拟执行。你可以编译后试试,别忘了告诉我结果。
[解决办法]
调试运行。报错后。看栈
[解决办法]
同样的问题,SPS求宽高,还有解码报错~
解码报错我判断基本上应该是P帧队列的问题,如果都使用I帧好像不报错,分辨率大了P帧队列内存容易满?
SPS求宽高我直接用p[6],p[7],p[8]就可以求,但是不完全对。