关于视频播放进度的问题

sghcpt 2010-11-15 10:59:48
我的问题是这样的,我有一个Filter,继承与CTransformFilter,我的程序的主要功能是把原视频文件,经过一些修改,保存为AVI文件.我的主对话框哪里有一个进度条,想显示操作的进度.使用了下面的代码:
HRESULT CContrast::Transform(IMediaSample *pIn, IMediaSample *pOut)
{
...............................
REFERENCE_TIME TimeStart, TimeEnd;
if(NOERROR == pIn->GetTime(×tart, &TimeEnd))
{
pDest->SetTime(×tart, &TimeEnd);
}
m_lStreamTime = TimeEnd;
...........................
}
STDMETHODIMP CMyFilter::get_Time(LONGLONG* lTime)
{
*lTime = m_lStreamTime;
return NOERROR;
}

void CGraphBuild::GetStreamTime(double* outStreamTime)
{
if (m_pMyFilter)
{
CComPtr<IFraction> pContrast;
HRESULT hr = m_pMyFilter->QueryInterface(IID_IFraction, (void**)&pContrast);
if (SUCCEEDED(hr))
{
__int64 lStreamTime;
if (SUCCEEDED(pContrast->get_Time(&lStreamTime)))
{
*outStreamTime = ((double)lStreamTime) / 10000000.;
return ;
}
}
}
*outStreamTime = 0;
}

bool CGraphBuild::GetDuration(double * outDuration)
{
if (mSeeking)
{
__int64 length = 0;
if (SUCCEEDED(mSeeking->GetDuration(&length)))
{
*outDuration = ((double)length) / 10000000.;
return true;
}
}
return false;
}

void CAviDlg::OnTimer(UINT_PTR nIDEvent)
{
double lStreamTime = 0;
m_pGraph->GetStreamTime(&lStreamTime);
double lStopTime = 0;
m_pGraph->GetDuration(&lStopTime);
double lDone = lStreamTime * 100 / lStopTime;
m_Progress.SetPos((int)lDone);
}

在上面的代码中,m_pGraph是CGraphBuild类型的变量.
但使用上面的代码,得到的效果不行,请问上面的代码或者逻辑上,在那里错了。
...全文
206 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
tufaqing 2010-11-17
  • 打赏
  • 举报
回复
“你就从你的filter开始往前查找,查询IMediaSeeking接口成功为止。”
splitter和source都支持IMediaSeeking,其他的一般不支持。
sghcpt 2010-11-17
  • 打赏
  • 举报
回复
To tufaqing

"你还是先确定是哪里出问题了,把duration和stream time都检查一下。
你用的是自动render的话,有的可能是splitter,而不是source。你就从你的filter开始往前查找,查询IMediaSeeking接口成功为止."

我根据你上面说的,测试后,还是差一些.但IMediaSeeking的接口是直接用IGraphBuilder来调用QueryInterface函数得到的。我想请问一下,从我的filter开始往前查找,要找splitter Filter.但我怎么判断它是Splitter Filter了?还有我的一些视频文件,如wmv,它还是没有用到Splitter Filter,那我应该找那个Filter? 这样处理好像不太统一了
tufaqing 2010-11-16
  • 打赏
  • 举报
回复
你还是先确定是哪里出问题了,把duration和stream time都检查一下。
你用的是自动render的话,有的可能是splitter,而不是source。你就从你的filter开始往前查找,查询IMediaSeeking接口成功为止。
sghcpt 2010-11-16
  • 打赏
  • 举报
回复
To tufaqing
"从graph的IMediaSeeking获取可能不对,这个他里面封装的,不知道怎么处理的。你直接查询AVI Source的IMediaSeeking来获得,如果失败,要从它的outputpin来查询IMediaSeeking。"

请问,我读进来的视频文件都各种格式,而且我在构建GraphFilter链路的的时候,是从m_pGraph->RenderFile(文件)后,删除掉后面的Render,然后加入我的Filter,再加入编码Filter,AVI Mux Filter和AVI Write Filter的,所以这样我能得到Source Filter哪里吗?是否沿着Filter链往上搜寻Filter,直到找到一个Filter,没有输入端的?
tufaqing 2010-11-16
  • 打赏
  • 举报
回复
还有问题?可以把duration和stream time打印出来看看对不对。m_lStreamTime = TimeStart,使用这个,TimeEnd对音视频无用,字幕有用。
看看duration对不对,从graph的IMediaSeeking获取可能不对,这个他里面封装的,不知道怎么处理的。你直接查询AVI Source的IMediaSeeking来获得,如果失败,要从它的outputpin来查询IMediaSeeking。
sghcpt 2010-11-15
  • 打赏
  • 举报
回复
不好意思,上面有错了。
改正如下面.

我的问题是这样的,我有一个Filter,继承与CTransformFilter,我的程序的主要功能是把原视频文件,经过一些修改,保存为AVI文件.我的主对话框哪里有一个进度条,想显示操作的进度.使用了下面的代码:


HRESULT CMyFilter::Transform(IMediaSample *pIn, IMediaSample *pOut)
{
...............................
REFERENCE_TIME TimeStart, TimeEnd;
if(NOERROR == pIn->GetTime(×tart, &TimeEnd))
{
pDest->SetTime(×tart, &TimeEnd);
}
m_lStreamTime = TimeEnd;
...........................
}
STDMETHODIMP CMyFilter::get_Time(LONGLONG* lTime)
{
*lTime = m_lStreamTime;
return NOERROR;
}

void CGraphBuild::GetStreamTime(double* outStreamTime)
{
if (m_pMyFilter)
{
CComPtr<IFraction> pContrast;
HRESULT hr = m_pMyFilter->QueryInterface(IID_IFraction, (void**)&pContrast);
if (SUCCEEDED(hr))
{
__int64 lStreamTime;
if (SUCCEEDED(pContrast->get_Time(&lStreamTime)))
{
*outStreamTime = ((double)lStreamTime) / 10000000.;
return ;
}
}
}
*outStreamTime = 0;
}

bool CGraphBuild::GetDuration(double * outDuration)
{
if (mSeeking)
{
__int64 length = 0;
if (SUCCEEDED(mSeeking->GetDuration(&length)))
{
*outDuration = ((double)length) / 10000000.;
return true;
}
}
return false;
}

void CAviDlg::OnTimer(UINT_PTR nIDEvent)
{
double lStreamTime = 0;
m_pGraph->GetStreamTime(&lStreamTime);
double lStopTime = 0;
m_pGraph->GetDuration(&lStopTime);
double lDone = lStreamTime * 100 / lStopTime;
m_Progress.SetPos((int)lDone);
}

在上面的代码中,m_pGraph是CGraphBuild类型的变量.
但使用上面的代码,得到的效果不行,请问上面的代码或者逻辑上,在那里错了。

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧