検索してもほとんど何も見つかりませんでしたので、質問にご協力いただければ幸いです。
私は、libavを使用してYouTubeのFLVファイルからダウンストリームh264パケットを読み取って送信するDirectShowソースフィルターを作成しています。しかし、フィルターのGetMediType()とFillBuffer()を正しく実装するための適切なlibav構造体のフィールドが見つかりません。一部のlibavフィールドはnullです。その結果、受信したデータを処理しようとしてh264デコーダーがクラッシュします。
私はどこが間違っていますか?libavまたはDirectShowインターフェイスを使用していますか?たぶん、h264はlibavで作業するときに追加の処理が必要ですか、それとも参照時間を間違って入力しますか?誰かがlibavでDirectShowh264ソースフィルターを書くのに役立つリンクを持っていますか?
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()を呼び出すとクラッシュします。