将CBR过滤器应用于ASF Writer的代码不起作用,为什么?

时间:2011-01-16 20:54:36

标签: filter directshow asf writer

我正在尝试将CBR配置文件应用于ASF Writer,以减少视频/音频流的延迟。

这就是我到目前为止所做的事情:

  1. 使用Media Encoder,我生成了一个 默认CBR配置文件
  2. 将个人资料保存到prx文件
  3. 使用此代码将配置文件应用于ASF Writer:

     // Initialize a new Profile Manager
     IWMProfileManager* pIPM = 0;
     WMCreateProfileManager(&pIPM);
    
    FILE * file = fopen("lowprofile.prx", "rb");
    
     fseek(file, 0, SEEK_END);
     long length = ftell(file);
     fseek(file, 0, SEEK_SET);
    
     wchar_t * buffer = new wchar_t[length];
     size_t numRead = fread(buffer, sizeof(wchar_t), length, file);
     buffer[numRead] = NULL;
     fclose(file);
    
     IWMProfile* pProxProfile = 0;
     hr = pIPM->LoadProfileByData(buffer, &pProxProfile);
    
     // Set the profile for the writer
     CComQIPtr<IConfigAsfWriter2> pConfigWriter;
     pConfigWriter = m_pWMASFWritter;
    
     hr = pConfigWriter->SetParam(AM_CONFIGASFWRITER_PARAM_DONTCOMPRESS, TRUE, 0);
    
     hr = pConfigWriter->ConfigureFilterUsingProfile(pProxProfile); // THIS LINE FAILS, hr = E_FAIL
    
     hr=m_pGraph->AddFilter(m_pWMASFWritter,L"ASF Writter");
     if(FAILED(hr)) 
      return FALSE;
    
    //etc..
    

    这段代码有什么问题?我误解了什么?

    对我来说不幸的是,媒体格式sdk中没有代码也没有在互联网上提供,以帮助我应用这样的过滤器。我正在仔细阅读msdn上提供的文档,但它肯定不如一个好的代码示例那么清晰。

    有人可以给我一个暗示吗?

2 个答案:

答案 0 :(得分:0)

看起来没问题,我的代码接近于工作正常 - 尝试设置配置文件以使用标准音频/视频编解码器来查看代码是否正常工作然后只是为了查明问题和/或注释掉{{ 1}}打电话。

还要确保首先将AsfFileWriter添加到图形中,然后对其进行配置,最后连接图形。您目前只在配置它之后才添加它 - 再次,这可能有用,它不是我运行的命令并且肯定有效。

答案 1 :(得分:0)

这里以字节计算文件大小:

fseek(file, 0, SEEK_END);
long length = ftell(file);
fseek(file, 0, SEEK_SET);

但是你将它视为chacacters中的大小:

wchar_t * buffer = new wchar_t[length];
size_t numRead = fread(buffer, sizeof(wchar_t), length, file);
buffer[numRead] = NULL;

您可以使用以下修复程序:

long length = ftell(file) / sizeof(wchar_t);