Поделиться через


Запись видео

Когда поток перейдет в состояние KSSTATE_RUN , начинается процесс записи. В зависимости от интервала кадров, заданного элементом AvgTimePerFrameструктуры KS_VIDEOINFOHEADER , передаваемой при открытии потока, поток передает изображения в буферы, передаваемые через SRB_READ_DATA. Дополнительные сведения о захваченном изображении возвращаются в структуре KS_FRAME_INFO , которая добавляется в конец структуры KSSTREAM_HEADER .

В следующем примере кода получается добавленная структура KS_FRAME_INFO:

PKSSTREAM_HEADER pDataPacket = pSrb->CommandData.DataBufferArray;
PKS_FRAME_INFO pFrameInfo = (PKS_FRAME_INFO) (pDataPacket + 1); 

Мини-накопитель должен задавать дополнительные поля сведений о захваченных данных, например кадры, удаленные кадры и полярность поля. Сведения о кадре обычно хранятся в элементе расширения потока, определенного драйвером записи.

*pFrameInfo = pStrmEx->FrameInfo; // Get the frame info from the minidriver-defined stream extension

Рекомендуется обновлять элементы PictureNumber или DropCountKS_FRAME_INFO, KS_VBI_FRAME_INFO или KSPROPERTY_DROPPEDFRAMES_CURRENT_S при переходе в состояние KSSTATE_ACQUIRE .

Эти элементы можно обновлять при переходе из состояния KSSTATE_ACQUIRE в состояние KSSTATE_PAUSE .

Не обновляйте PictureNumber или DropCount при переходе из состояния KSSTATE_PAUSE в состояние KSSTATE_RUN или состояние KSSTATE_RUN на состояние KSSTATE_PAUSE .

Если кадры были удалены ранее, мини-driver должен установить флаг непрерывности, а затем сбросить свой внутренний флаг. В следующем коде показано, как установить флаг неразрывности данных:

if (pStrmEx->fDiscontinuity) {
    pDataPacket->OptionsFlags |= KSSTREAM_HEADER_OPTIONSF_DATADISCONTINUITY;
    pStrmEx->fDiscontinuity = FALSE;
}

Наконец, мини-диск должен отказаться от управления SRB, завершив захват кадра.

CompleteStreamSRB (pSrb);