Ненадежное кэширование и чтение видеокадров - PullRequest
2 голосов
/ 08 апреля 2009

Я работаю над приложением, которое отображает несколько видео одновременно. Видео хранятся в виде каталогов с файлами изображений. Для каждого номера кадра можно загрузить до 9 изображений с диска. Я хотел бы реализовать кэширование и упреждающее чтение для изображений. Это было бы довольно просто, но сложность заключается в том, что файловая система (иногда сетевая ФС) далеко не достаточно быстра для отображения каждого изображения. Поэтому readahead должен выбрать, какие кадры он будет пытаться загрузить, и отправлять только запросы read () для этих изображений. Кроме того, было бы лучше, если бы он мог учитывать, какие изображения уже кэшированы, при решении, какие кадры он будет загружать.

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

Я предполагаю, что время измеряется относительно частоты кадров, а не секунд, чтобы упростить псевдокод.

load_time_per_image = how long it takes to load an image
images_per_frame = the number of images to display simultaneously
worst_time = images_per_frame * load_time_per_image

def decide_next_frame_to_load:
    for each frame from now to now + worst_time:
        loadable = (frame - now) / load_time_per_image
        if number_of_images_cached(frame) > images_per_frame - loadable:
            # this frame is the first one it's possible to load in time.
            return frame

У кого-нибудь есть предложения? Спасибо за вашу помощь! -Томас

1 Ответ

0 голосов
/ 09 апреля 2009

Это предназначено для работы в режиме реального времени?

Некоторые из худших видеоредакторов, которые я видел, «индексируют» каждый кадр, сохраняя каждый кадр в своем собственном файле изображения. Вы застряли с использованием этого механизма хранения? Было бы значительно более эффективно, если исходные видео были сохранены в видеоформате (по одному на файл), и для каждого видео был индекс (в основном смещение файла для каждого кадра). Затем вы можете использовать механизм кэширования операционной системы, чтобы повысить производительность.

Еще одна вещь, которую вы можете рассмотреть, хотя это, вероятно, не очень поможет с сетевыми файловыми системами, это хранить изображения в формате YUV. Ваше приложение, которое отображает видео, может работать быстрее (отчасти потому, что преобразование RGB-в-YUV не требуется, а часто потому, что вы можете перенести работу по рисованию изображения YUV на видеокарту), что оставляет больше времени для файловой системы Работа. Я делаю это при рисовании на дисплее X, чтобы избежать дрожания.

Что касается кэширования изображений, я бы, вероятно, использовал отдельный поток для чтения изображений с диска так быстро, как вы можете, пока основной поток собирает и представляет изображение. Основной поток может выполнять свой цикл один раз за интервал представления кадра, а отдельный поток может блокировать, когда количество буферизованных / подготовленных изображений достигает определенного порога. Видеоплееры, такие как mplayer, используют такие стратегии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...