我已经搜索并且几乎没有发现任何东西,所以我非常感谢我的问题的一些帮助。
我正在编写一个 DirectShow 源过滤器,它使用 libav 从 youtube 的 FLV 文件读取和发送下游 h264 数据包。但我找不到合适的 libav 结构字段来正确实现过滤器的 GetMediType() 和 FillBuffer()。一些 libav 字段为空。因此,h264 解码器在尝试处理接收到的数据时崩溃。
我哪里错了?使用 libav 或 DirectShow 接口?也许 h264 在使用 libav 时需要额外的处理,或者我错误地填写了参考时间?有人有任何链接可用于使用 libav 编写 DirectShow h264 源过滤器吗?
GetMediaType() 的一部分:
VIDEOINFOHEADER *pvi = (VIDEOINFOHEADER*) toMediaType->AllocFormatBuffer(sizeof(VIDEOINFOHEADER));
pvi->AvgTimePerFrame = UNITS_PER_SECOND / m_pFormatContext->streams[m_streamNo]->codec->sample_rate; //sample_rate is 0
pvi->dwBitRate = m_pFormatContext->bit_rate;
pvi->rcSource = videoRect;
pvi->rcTarget = videoRect;
//Bitmap
pvi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pvi->bmiHeader.biWidth = videoRect.right;
pvi->bmiHeader.biHeight = videoRect.bottom;
pvi->bmiHeader.biPlanes = 1;
pvi->bmiHeader.biBitCount = m_pFormatContext->streams[m_streamNo]->codec->bits_per_raw_sample;//or should here be bits_per_coded_sample
pvi->bmiHeader.biCompression = FOURCC_H264;
pvi->bmiHeader.biSizeImage = GetBitmapSize(&pvi->bmiHeader);
FillBuffer() 的一部分:
//Get buffer pointer
BYTE* pBuffer = NULL;
if (pSamp->GetPointer(&pBuffer) < 0)
return S_FALSE;
//Get next packet
AVPacket* pPacket = m_mediaFile.getNextPacket();
if (pPacket->data == NULL)
return S_FALSE;
//Check packet and buffer size
if (pSamp->GetSize() < pPacket->size)
return S_FALSE;
//Copy from packet to sample buffer
memcpy(pBuffer, pPacket->data, pPacket->size);
//Set media sample time
REFERENCE_TIME start = m_mediaFile.timeStampToReferenceTime(pPacket->pts);
REFERENCE_TIME duration = m_mediaFile.timeStampToReferenceTime(pPacket->duration);
REFERENCE_TIME end = start + duration;
pSamp->SetTime(&start, &end);
pSamp->SetMediaTime(&start, &end);
PS 我已经用 hax264 解码器调试了我的过滤器,它在调用 libav 不推荐使用的函数 img_convert() 时崩溃。