游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2784|回复: 4

当用DirectShow播放缓冲区内容时得到错误:0xC0000005: Access V

[复制链接]

1

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2007-7-28 19:13:00 | 显示全部楼层 |阅读模式
    最近在用DirectShow播放缓冲区内容时遇到了奇怪的问题,百思不得其解。

    我用DirectShow的例子MEMFile改写了一个播放缓冲区内容的播放器,从网络获取数据,写入一个循环缓冲区,然后当DS需要数据时就从缓冲区取数据进行填充,也就是“拉”的模式。

    我的缓冲区是20M,先缓冲满缓冲区(如果文件大于缓冲区的话,也就是预缓冲),然后进行播放,播放过程中在适当的时候在进行缓冲。

    现在情况是:预缓冲成功完成,并且可以开始播放,但是播放几分钟后就会出现错误“First-chance exception in Peer.exe (XVIDCORE.DLL): 0xC0000005: Access Violation”。这几分钟肯定没有把预缓冲的20M播放完,并且每次出错的位置都不一样。

    我实在想不出其中原因。如果哪位遇到过类似的问题,还望给予指教,在此表示感谢!


相关代码大概列出:

HRESULT CMemStream::Read(PBYTE pbBuffer,
             DWORD dwBytesToRead,
             BOOL bAlign,
             LPDWORD pdwBytesRead)
{
    CAutoLock lck(&m_csLock);
    DWORD dwReadLength = 0;



    /*  Wait until the bytes are here! */
    DWORD dwTime = timeGetTime();
    if (m_llPosition + dwBytesToRead > m_llLength) {
        dwReadLength = (DWORD)(m_llLength - m_llPosition);
    } else {
        dwReadLength = dwBytesToRead;
    }

    DWORD dwTimeToArrive =
        ((DWORD)m_llPosition + dwReadLength) / m_dwKBPerSec;
    if (dwTime - m_dwTimeStart < dwTimeToArrive) {
        Sleep(dwTimeToArrive - dwTime + m_dwTimeStart);




// copy data from my buffer to DS's buffer

int iPos = m_llPosition % BUFFER_SIZE;
if (iPos+dwReadLength > BUFFER_SIZE) {
memcpy((PVOID)pbBuffer, (PVOID)(m_pbData + iPos), (BUFFER_SIZE-iPos) );
memcpy((PVOID)pbBuffer, (PVOID)(m_pbData), (dwReadLength - (BUFFER_SIZE-iPos)) );
} else {
memcpy((PVOID)pbBuffer, (PVOID)(m_pbData + iPos), dwReadLength);
}
   
    m_llPosition += dwReadLength;
    *pdwBytesRead = dwReadLength;




  // buffer when need

  // ...


    return S_OK;
}



2

主题

683

帖子

687

积分

高级会员

Rank: 4

积分
687
发表于 2007-7-29 09:30:00 | 显示全部楼层

Re:当用DirectShow播放缓冲区内容时得到错误:0xC0000005: Acces

有没有可能是因为缓冲区内容错误?

1

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2007-7-29 10:34:00 | 显示全部楼层

Re:当用DirectShow播放缓冲区内容时得到错误:0xC0000005: Acces


对,我也考虑过这个因素。
但是,我的两个peer都在本机,一个peer读取文件,然后通过socket传输给另外一个peer,该peer就把数据存到循环缓冲区。然后在read中feed给DS的缓冲区。
通过打印发现,数据的读取,传输,接收都非常正常,都是按照顺序,并且每个块的起始与长度也都正常(我是分块传输的,每块2M)。

1

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2007-7-29 10:43:00 | 显示全部楼层

Re:当用DirectShow播放缓冲区内容时得到错误:0xC0000005: Acces


但是,当我直接播放本机文件时,又不会出现这个问题。

所以我想可能有两个方面的因素:
1,CMemStream使用不当
2,数据传输不当

第二种因素是可以排除的,但是我目前对于CMemStream的机制还只是一知半解,目前正在买书学习。
还望哪位比较清楚的给予帮助。

1

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2007-7-29 14:29:00 | 显示全部楼层

Re:当用DirectShow播放缓冲区内容时得到错误:0xC0000005: Acces


我发现用DS自带的sample-MEMFile播放同一个文件时,也会出现相同的错误。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-25 17:16

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表