Main Content

비디오 파일 읽어오기

이 예제에서는 비디오에서 특정 시간 또는 프레임 인덱스에서 시작하는 프레임을 읽어오고, 지정된 구간 내의 프레임을 읽어오고, 비디오 내 모든 프레임을 읽어오는 방법을 보여줍니다.

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

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

샘플 비디오 파일 xylophone_video.mp4에 대한 VideoReader 객체를 만듭니다.

vidObj = VideoReader("xylophone_video.mp4");

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

vidObj.CurrentTime = 0.5;

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

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

Figure contains an axes object. The axes object contains an object of type image.

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

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

VideoReader 객체를 지웁니다.

clear vidObj

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

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

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

vidObj = VideoReader("xylophone_video.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              

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

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

  frames      240x320x3x10            2304000  uint8              

VideoReader 객체를 지웁니다.

clear vidObj

모든 프레임 읽어오기

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

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

vidObj = VideoReader("xylophone_video.mp4");
vidObj.NumFrames
ans = 141

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

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

Figure contains an axes object. The axes object contains an object of type image.

또는, 모든 비디오 프레임을 한 번에 읽어올 수 있습니다. read 메서드는 비디오 프레임으로 구성된 m×n×p×141 배열을 반환합니다(여기서 각 프레임의 크기는 m×n×p임).

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

  allFrames      240x320x3x141            32486400  uint8              

VideoReader 객체를 지웁니다.

clear vidObj

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

  • Windows® 플랫폼에서는 작업 공간에서 VideoReader 객체로 참조되는 AVI 파일을 수정 또는 삭제할 수 없습니다. 작업 공간에서 VideoReader 객체를 제거하려면 clear 함수를 사용하십시오.

  • 일부 MP4 파일의 경우, NumFrames 속성은 Windows, Mac, Linux® 플랫폼에서 서로 다른 값을 반환할 수 있습니다. 이 차이는 기반이 되는 플랫폼별 API의 차이에서 비롯됩니다.

  • 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')을 입력하여 하드웨어 가속을 다시 활성화할 수 있습니다.

참고 항목

| | | |

관련 항목