Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

비디오 파일 읽어오기

비디오에서 특정 시간 또는 프레임 인덱스에서 시작하는 프레임을 읽어오거나 지정된 구간 내의 프레임을 읽어오거나 비디오 내 모든 프레임을 읽어옵니다.

지정된 시간 또는 프레임 인덱스에서 시작하는 프레임 읽어오기

파일 시작부터 0.5초 후에 시작하는 비디오 파일의 일부를 읽어옵니다. 그런 다음, 프레임 인덱스 100에서 시작하여 비디오 파일의 끝까지 비디오를 읽어옵니다.

샘플 파일 'xylophone.mp4'에 연결되는 VideoReader 객체를 생성합니다.

vidObj = VideoReader('xylophone.mp4');

CurrentTime 속성을 설정하여 파일 시작부터 0.5초 후에 읽어오기가 시작되도록 지정합니다.

vidObj.CurrentTime = 0.5;

readFrame 메서드를 사용하여 파일 끝에 도달할 때까지 비디오 프레임을 읽어옵니다.

while hasFrame(vidObj)
    vidFrame = readFrame(vidObj);
    imshow(vidFrame)
    pause(1/vidObj.FrameRate);
end

또는, read 메서드를 사용하여 지정된 프레임 인덱스에서 시작하여 비디오의 끝까지 비디오의 프레임을 읽어올 수 있습니다. 읽어올 인덱스를 [100 Inf]로 지정합니다. read 메서드는 프레임 인덱스 100에서 시작하여 비디오 파일의 끝까지 해당하는 모든 프레임을 반환합니다.

vidframes = read(vidObj,[100 Inf]);

지정된 구간 내의 프레임 읽어오기

시간 또는 프레임 구간을 지정하여 비디오 파일의 일부를 읽어옵니다.

0.6초에서 0.9초 사이의 비디오 프레임을 읽어옵니다. 먼저, video reader 객체와 프레임을 유지할 구조체형 배열을 만듭니다.

vidObj = VideoReader('xylophone.mp4');
s = struct('cdata',zeros(vidObj.Height,vidObj.Width,3,'uint8'),'colormap',[]);

CurrentTime 속성을 설정하여 파일 시작부터 0.6초 후에 읽어오기가 시작되도록 지정합니다.

vidObj.CurrentTime = 0.6;

CurrentTime이 0.9초에 도달할 때까지 한 번에 한 프레임씩 읽어옵니다. 각 비디오 프레임의 데이터를 구조체형 배열에 추가합니다. 구조체형 배열에 포함된 프레임 개수를 확인합니다. s는 10개 프레임을 읽었음을 나타내는 1×10 구조체입니다. 구조체 s의 프레임을 동영상으로 표시하는 방법에 대한 자세한 내용은 movie 함수 도움말 페이지를 참조하십시오.

k = 1;
while vidObj.CurrentTime <= 0.9
    s(k).cdata = readFrame(vidObj);
    k = k+1;
end
whos s
  Name      Size              Bytes  Class     Attributes

  s         1x10            2305344  struct              

또는 프레임 인덱스를 사용하여 지정된 구간에 포함된 모든 프레임을 읽어올 수 있습니다. 예를 들어, read의 두 번째 인수를 [18 27]로 지정합니다. read 메서드는 10개 프레임을 읽었음을 나타내는 FrameSize×10 배열을 반환합니다.

frames = read(vidObj,[18 27]);
whos frames
  Name          Size                    Bytes  Class    Attributes

  frames      240x320x3x10            2304000  uint8              

모든 프레임 읽어오기

비디오에서 모든 프레임을 한 번에 하나씩 또는 한 번에 모두 읽어옵니다.

video reader 객체를 만들고 비디오에 포함된 총 프레임 개수를 표시합니다.

vidObj = VideoReader('xylophone.mp4');
vidObj.NumFrames
ans = 141

readFrame 메서드를 사용하여 모든 프레임을 한 번에 하나씩 읽어오고 프레임을 표시합니다.

while hasFrame(vidObj)
   frame = readFrame(vidObj);
   imshow(frame)
   pause(1/vidObj.FrameRate);
end

또는, 모든 비디오 프레임을 한 번에 읽어올 수 있습니다. read 메서드는 비디오 프레임으로 구성된 FrameSize×141 배열을 반환합니다.

allFrames = read(vidObj);
whos allFrames
  Name             Size                      Bytes  Class    Attributes

  allFrames      240x320x3x141            32486400  uint8              

비디오 읽어오기 관련 문제 해결과 팁

  • CurrentTime 속성값과 Duration 속성값이 같은 경우 hasFrame 메서드가 논리값 1(true)을 반환할 수 있습니다. 이는 사용되는 기본 API의 한계로 볼 수 있습니다.

  • CurrentTime 속성을 Duration 값에 가까운 값으로 설정하여 비디오 파일의 마지막 프레임을 탐색하는 것은 권장되지 않습니다. 일부 파일의 경우, 읽어오기 작업은 CurrentTime 값이 Duration 값보다 작은 경우에도 파일 끝에 도달했음을 나타내는 오류를 반환합니다. 이 문제는 대개 파일 재생 시간이 비디오 스트림 재생 시간보다 길고, 파일 끝 근처에 읽어올 수 있는 비디오가 없는 경우에 발생합니다.

  • 비디오 파일에서 데이터 읽어오는 것을 제한하기 위해 Duration 속성을 사용하는 것은 권장되지 않습니다. hasFrame 메서드를 사용하여 읽어올 수 있는 프레임이 있는지 확인하십시오. 파일에서 읽어올 수 있는 프레임이 더 이상 없다고 보고할 때까지 데이터를 읽어오는 것이 가장 좋습니다.

  • Windows® 시스템에서의 비디오 읽기 성능: Windows에서 비디오 리더가 MP4MOV 파일을 읽어오는 성능을 높이기 위해 MATLAB®은 디코딩할 때 시스템의 그래픽스 하드웨어를 사용합니다. 그러나 어떤 경우에는 디코딩을 위해 그래픽스 카드를 사용하면 시스템의 특정 그래픽스 하드웨어에 따라 성능이 저하될 수 있습니다. 시스템의 비디오 리더 성능이 느려졌다면 matlab.video.read.UseHardwareAcceleration('off')를 입력하여 하드웨어 가속 기능을 비활성화하십시오. matlab.video.read.UseHardwareAcceleration('on')을 입력하여 하드웨어 가속을 다시 활성화할 수 있습니다.

참고 항목

| | | |

관련 항목