Запись видео с синхронизированными связанными метаданными с помощью UWP/c

#c #uwp #mediacapture

Вопрос:

Я хочу записать видео с помощью API C и UWP. Для этого я использую объект MediaCapture.

 m_mediaCapture = Platform::Agile<MediaCapture>(ref new MediaCapture());
 

Мне удалось записать видео с помощью функции «StartRecordToStorageFileAsync».

 m_mediaCapture->StartRecordToStorageFileAsync(...)

 

В дополнение к этому я хочу записать метаданные, связанные с каждым кадром (такие как метка времени, параметры камеры, индексы изображений …). Мне удалось получить доступ к этим свойствам через объект «MediaFrameReader». Я привязываю функцию «onFrameArrived» к событию «FrameArrived».

 m_mediaCapture->CreateFrameReaderAsync(...).then([=](MediaFrameReader^ reader)
{
   ...
   m_mediaFrameReader->FrameArrived  =
                                ref new TypedEventHandler<MediaFrameReader^, MediaFrameArrivedEventArgs^>(
                                    std::bind(amp;VideoRecordController::onFrameArrived, this, _1, _2));
}

 

где я могу получить доступ к необходимым метаданным.

 void VideoRecordController::onFrameArrived(MediaFrameReader^ sender, MediaFrameArrivedEventArgs^ args)
{
    if (MediaFrameReference^ frame = sender->TryAcquireLatestFrame())
    {
        // Access to MediaFrameReference metadata, e.g. :
        auto timestamp = frame->SystemRelativeTime->Value.Duration;
        auto cameraParameters = frame->VideoMediaFrame->CameraIntrinsics;
    }
    // Or misc. data
    static int frameIndex = 0;
    frameIndex  ;
    // ... Save metadata
}
 

Однако метаданные не синхронизируются с сохраненным видео (разные частоты вывода). Видео записывается со скоростью ~30 кадров в секунду, в то время как метаданные записываются со скоростью ~20 секунд в секунду. Похоже, что событие ‘FrameArrived’ вызывается не в каждом кадре.
Тогда мой вопрос : как записать видео с синхронизированными метаданными связанного кадра ?

Спасибо!

Комментарии:

1. Различные частоты вывода не указывают FrameArrived на то, что событие вызывается не в каждом кадре, что отражает только скорость доступа к метаданным MediaFrameReference, а сохранение метаданных происходит медленнее, чем запись видео. Кроме того, я должен сказать, что трудно искусственно сделать эти два события одинаковыми.