熟悉windows media format的高手,请问如何在windows media format sdk中使用video for windows codec? 100分在线等

captainwh 2003-10-30 10:02:52
请问windows media format sdk中能否自定义一个profile,不使用windows media自带的codec,而是使用一个自行开发的video codec呢?如果可行,怎么样对profile进行配置,以达到让writer使用我自己的video for windows codec呢?
项目紧急,万分感谢
...全文
53 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
captainwh 2003-11-04
  • 打赏
  • 举报
回复
:( 都没有人用过啊, 我已经知道怎么自定义profile了,可是设置profile的sub media type时总是返回错误,哪位帮我看看:

// 初始化代码
// Image Info (Vid1 format)
ZeroMemory(&m_bmpInfoHdr, sizeof(BITMAPINFOHEADER));
m_bmpInfoHdr.biSize = sizeof(BITMAPINFOHEADER);
m_bmpInfoHdr.biWidth = m_nWidth;
m_bmpInfoHdr.biHeight = m_nHeight;
m_bmpInfoHdr.biPlanes = 1;
m_bmpInfoHdr.biBitCount = 24;
m_bmpInfoHdr.biCompression = FOURCC_VID1; // 自定义的Compression type

// Video Format Struct
RECT rect;
SetRect(&rect, 0, 0, m_nWidth, m_nHeight);
ZeroMemory(&m_VideoInfoHdr, sizeof(WMVIDEOINFOHEADER));
m_VideoInfoHdr.rcSource = rect;
m_VideoInfoHdr.rcTarget = rect;
m_VideoInfoHdr.dwBitRate = 190773; // 码率
m_VideoInfoHdr.dwBitErrorRate = 0; // 这个好像是错误的码
// 率,不止怎么填好
m_VideoInfoHdr.AvgTimePerFrame = 40 * 10000; // 每祯图象显示时间
// (100ns 为单位
m_VideoInfoHdr.bmiHeader = m_bmpInfoHdr;

// Video Media Type
ZeroMemory(&m_MediaSubType, sizeof(WM_MEDIA_TYPE));
m_MediaSubType.majortype = WMMEDIATYPE_Video;
m_MediaSubType.subtype = TTLH264_Video; // 自定义Compress type
// 的GUID
m_MediaSubType.bFixedSizeSamples = FALSE; // 每祯图象是否大小相同
m_MediaSubType.bTemporalCompression = TRUE; // 图象是否已经压缩过
m_MediaSubType.lSampleSize = 0;
m_MediaSubType.formattype = WMFORMAT_VideoInfo;
m_MediaSubType.pUnk = NULL;
m_MediaSubType.cbFormat = sizeof(WMVIDEOINFOHEADER);
m_MediaSubType.pbFormat = (BYTE*)&m_VideoInfoHdr;

// Init Com Library
CoInitialize(NULL);

// Create an Empty Profile
HRESULT hr = WMCreateProfileManager(&m_pProfileMgr);
hr = m_pProfileMgr->CreateEmptyProfile(WMT_VER_9_0, &m_pProfile);

// create a new stream, config the stream
hr = m_pProfile->CreateNewStream(WMMEDIATYPE_Video, &m_pStreamCfg);
hr = m_pStreamCfg->SetStreamNumber(1);
hr = m_pStreamCfg->SetStreamName(L"TTL Video Stream");
hr = m_pStreamCfg->SetConnectionName(L"Video");
hr = m_pStreamCfg->SetBufferWindow(3000); // 缓冲时间
hr = m_pStreamCfg->SetBitrate(190773); // 码率
hr = m_pStreamCfg->QueryInterface(IID_IWMMediaProps, (void**)
&m_pMediaProp);
hr = m_pMediaProp->SetMediaType(&m_MediaSubType); // 设置sub type
if (FAILED(hr))
{
// 在这里失败, 返回值表示m_MediaSubType的设置不正确
if (hr == NS_E_INVALID_STREAM)
int y = 100;
}

// add the stream to the profile
hr = m_pProfile->AddStream(m_pStreamCfg);
if (FAILED(hr))
{
if (hr == NS_E_INVALID_STREAM)
int x = 100;
}

// Create WM Writer Object, Set the Profile
hr = WMCreateWriter(NULL, &m_pWriter);
hr = m_pWriter->SetProfile(m_pProfile);

// Config all Input
DWORD dwInputCount = 0;
hr = m_pWriter->GetInputCount(&dwInputCount);
for (int i = 0; i < dwInputCount; i++)
hr = m_pWriter->SetInputProps(i, NULL);

// Init Writer
hr = WMCreateWriterFileSink(&m_pFileSink);
hr = m_pFileSink->QueryInterface(IID_IWMWriterFileSink3, (void**)
&m_pFileSink3);
hr = m_pWriter->QueryInterface(IID_IWMWriterAdvanced, (void**)
m_pWriterAdvanced);
hr = m_pWriterAdvanced->AddSink(m_pFileSink3);

// 启动写入线程
unsigned ThreadID;
m_hThread = (HANDLE)_beginthreadex(NULL, 0, ThreadProc, this,
0, &ThreadID);
// 初始化结束


// 这里是写入数据的线程代码
int CTTLASFWriter::Run()
{
m_bRunning = true;

// 打开输出文件, 开始写入
HRESULT hr = m_pFileSink3->Open(L"d:\\test.asf");
hr = m_pWriter->BeginWriting();

QWORD qwSampleTime = 0; // sample time
while (true)
{
if (m_bExit)
break;

// 获取数据
int res = m_pSource->ReadVideo(&m_pInBuffer, &m_InSize);
if (m_InSize <= 0 || res == -1)
break;

INSSBuffer *pNSSBuffer;
hr = m_pWriter->AllocateSample(m_InSize, &pNSSBuffer);
BYTE *pOutBuf = NULL;
hr = pNSSBuffer->GetBuffer(&pOutBuf);
memcpy(pOutBuf, m_pInBuffer, m_InSize);
hr = pNSSBuffer->SetLength(m_InSize);
qwSampleTime = timeGetTime() * 10000; // 单位100ns
m_pWriterAdvanced->WriteStreamSample(VIDEO_STREAM_NUMBER,
qwSampleTime, 0, 0, 0, pNSSBuffer);
pNSSBuffer->Release();

m_pInBuffer = NULL;
m_InSize = 0;
}

hr = m_pFileSink3->Close();
hr = m_pWriter->EndWriting();

m_bRunning = false;
return 0;
}

请教为什么我设置sub media type会失败, 另外在写入sample时,每个sample都需要有一个sample time, 文档中也没有介绍这个冬冬怎么写, 它是相对第一祯的时间还是绝对的时间值呢? 请高手帮忙
fingerfox 2003-10-31
  • 打赏
  • 举报
回复
没玩过,友情UP

16,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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