2009-04-08 2 views
2

여러 비디오를 한 번에 표시하는 응용 프로그램에서 작업하고 있습니다. 비디오는 이미지 파일로 가득 찬 디렉토리 형태로 저장됩니다. 각 프레임 번호에는 디스크에서로드해야하는 이미지가 최대 9 개 있습니다. 캐싱 및 미리 읽기 이미지 구현하고 싶습니다. 이것은 매우 간단하지만, 파일 시스템 (때로는 네트워크 FS)이 모든 이미지를 표시 할만큼 충분히 빠르지는 않습니다. 따라서 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 

누구든지 제안 했습니까? 도움 주셔서 감사합니다. - 토마스

+0

작은 세상입니다. –

답변

0

실시간 작업을위한 것입니까?

내가 본 최악의 비디오 편집자 중 일부는 각 프레임을 자체 이미지 파일에 저장하여 각 프레임을 "색인"합니다. 이 저장 장치를 사용하고 있습니까? 원본 비디오가 이미 비디오 형식 (파일 당 하나)으로 저장되고 각 비디오에 대한 인덱스 (기본적으로 각 프레임의 파일 오프셋)가 있으면 훨씬 더 효율적입니다. 그런 다음 운영 체제의 캐싱 메커니즘을 사용하여 성능을 향상시킬 수 있습니다.

네트워크 파일 시스템에별로 도움이되지 않지만 고려해야 할 또 다른 사항은 이미지를 YUV 형식으로 저장하는 것입니다. 비디오를 표시하는 응용 프로그램이 더 빨라질 수 있습니다 (RGB 대 YUV 변환이 필요하지 않고 YUV 이미지를 비디오 카드로 가져 오는 작업을 오프로드 할 수 있기 때문에) 파일 시스템에 더 많은 시간을두고 있습니다 작업. 지터를 피하기 위해 X 디스플레이에 그릴 때 이것을 수행합니다.

이미지를 캐싱하는 한, 메인 스레드가 이미지를 어셈블하고 표시하는 동안 가능한 한 빨리 디스크에서 이미지를 읽는 별도의 스레드를 사용합니다. 주 스레드는 프레임 표시 간격 당 한 번 루프를 수행 할 수 있으며 버퍼링/준비된 이미지의 양이 특정 임계 값에 도달하면 별도의 스레드가 차단 될 수 있습니다. mplayer와 같은 비디오 플레이어는 이러한 전략을 사용합니다.

+0

Matlab의 비디오 프레임을 분석하는 방법이므로이 저장 메커니즘이 붙어 있습니다. 전용 readahead 스레드가 좋습니다. 디스플레이 스레드가 올바른 프레임을 보지 못하면 아무 일도하지 않게됩니다. 그리고 readahead는로드 할 프레임을 전략적으로 지정할 수 있습니다. – rescdsk

+0

저장 메커니즘에 대해 너무 나쁩니다. 이미지 파일에서 실시간 비디오를 만드는 것은 상당히 어려운 문제입니다. –

관련 문제