IDL/New Graphics

동영상 파일의 제작 [2] (WRITE_VIDEO)

이상우_IDL 2024. 11. 12. 15:11
728x90

지난 회차 게시물에서는 IDLffVideoWrite 클래스의 객체를 이용하여 동영상을 제작하는 방법을 소개하였습니다. 오늘은 그 두번째 방법으로서 WRITE_VIDEO 프로시저를 사용하는 방법을 소개해보겠습니다. 먼저 예제 데이터의 생성 및 표출의 기본적인 내용은 지난 회와 동일하게 시작합니다.

 

x = FINDGEN(301)
y = SIN(2*x*!DTOR)*5+RANDOMU(seed, 301)
sx = 800
sy = 450
win = WINDOW(DIMENSIONS=[sx, sy], BACKGROUND_COLOR='khaki', $

  /NO_TOOLBAR)
p = PLOT(x, y, XRANGE=[0, 300], YRANGE=[-6, 6], $
  /NODATA, FONT_SIZE=11, MARGIN=0.1, /CURRENT)
tx = TEXT(0.5, 0.93, 'Test Plot for Video Save', $
  ALIGNMENT=0.5, COLOR='maroon', FONT_SIZE=16, /NORMAL)
po = PLOT(x[0:0], y[0:0], COLOR='royal blue', SYMBOL='circle', $
  /SYM_FILLED, SYM_SIZE=0.5, CLIP=0, /OVERPLOT)

 

FOR j = 0, 300 DO BEGIN
  po.SetData, x[0:j], y[0:j]
ENDFOR

 

위의 내용을 실행하면 반복형 구문에 의하여 플롯의 데이터 포인트들이 하나씩 증가하는 모습을 볼 수 있게 됩니다. 그리고 반복이 모두 종료된 후의 최종적인 모습은 지난번과 같이 다음 그림과 같을 것입니다.

 

그러면 이러한 과정을 동영상으로 담기 위하여 오늘은 IDLffVideoWrite 대신 WRITE_VIDEO 프로시저를 사용해봅시다. WRITE_VIDEO 프로시저를 사용하기 위해서는 동영상에 담고자 하는 프레임별 이미지들을 모두 모아서 하나의 배열로 구성하는 것이 가장 중요합니다. 그러기 위해서는 반복형 구문 내에서 변화하는 그림을 캡쳐하여 계속 누적시키는 과정이 필요하며 이를 위하여 그래픽 창 개체인 win에 대하여 CopyWindow 메서드를 사용하는 것이 필요합니다. 사실 이러한 부분은 지난 회차에서 소개했던 IDLffVideoWrite를 사용하는 경우와 유사합니다. 다만 WRITE_VIDEO를 사용하는 경우에는 그 이외의 전반적인 처리 과정이 조금 다른데요. WRITE_VIDEO를 사용하는 방식으로 위의 내용을 전체적으로 수정해보면 다음과 같습니다.

 

x = FINDGEN(301)
y = SIN(2*x*!DTOR)*5+RANDOMU(seed, 301)
sx = 800
sy = 450
win = WINDOW(DIMENSIONS=[sx, sy], BACKGROUND_COLOR='khaki', $

  /NO_TOOLBAR)
p = PLOT(x, y, XRANGE=[0, 300], YRANGE=[-6, 6], $
  /NODATA, FONT_SIZE=11, MARGIN=0.1, /CURRENT)
tx = TEXT(0.5, 0.93, 'Test Plot for Video Save', $
  ALIGNMENT=0.5, COLOR='maroon', FONT_SIZE=16, /NORMAL)
po = PLOT(x[0:0], y[0:0], COLOR='royal blue', SYMBOL='circle', $
  /SYM_FILLED, SYM_SIZE=0.5, CLIP=0, /OVERPLOT)

 

data = BYTARR(3, sx, sy, 301)
FOR j = 0, 300 DO BEGIN
  po.SetData, x[0:j], y[0:j]
  cap = win.CopyWindow(WIDTH=sx)
  data[*, *, *, j] = cap
ENDFOR
WRITE_VIDEO, 'idl_video.mp4', data, VIDEO_FPS=30

 

여기서는 WRITE_VIDEO의 사용을 위하여 관련 내용들이 추가되었고 이러한 내용은 볼드체로 표시하였습니다. 가장 먼저 주목해야 할 부분은 data라는 배열을 정의한 것인데요. 이와 같이 동영상에 포함될 모든 프레임별 이미지 데이터를 담기 위한 배열을 정의하는 것이 필요합니다. 여기서는 3x800x450x301의 4차원 구조의 배열로 정의되었는데, 800과 450은 프레임별 이미지의 가로 및 세로 크기이고 301은 총 프레임 수입니다. 그리고 3은 R, G, B 채널을 의미합니다. 즉 각 프레임별 이미지는 24비트 RGB 이미지가 되어야 하기 때문입니다. 따라서 반복형 구문 내에서는 CopyWindow 메서드를 사용하여 그림이 변화할 때마다 그 모습을 캡쳐하는데 이렇게 캡쳐된 이미지는 기본적으로 RGB 이미지가 됩니다. 즉 매 회차마다 캡쳐되는 이미지 배열인 cap의 구조는 3x800x450이 되고 이것이 data 배열에 매 프레임별로 저장되도록 한 것입니다.

 

이와 같은 반복 작업이 종료된 후에는 data 배열은 WRITE_VIDEO에 투입될 인수로 사용됩니다. 즉 위의 내용과 같이 WRITE_VIDEO 프로시저에는 생성될 동영상 파일의 이름 및 데이터 배열을 인수로 투입하면 됩니다. 그 외에도 필요에 따라 별도의 키워드들을 사용할 수도 있는데, 여기서는 VIDEO_FPS 키워드의 값을 30으로 설정하였습니다. 이 키워드는 동영상의 초당 프레임수(frames per second)를 결정하는 역할을 합니다. 어쨌든 위의 내용을 실행하면 idl_video.mp4라는 동영상 파일이 생성될 것입니다. 실제로 위의 과정에 의하여 생성된 파일을 아래에 첨부합니다. 재생 버튼을 누르면 동영상을 돌려볼 수 있습니다.

 

 

이 동영상을 재생해보면 지난 회차에서 IDLffVideoWrite를 사용하여 생성한 결과물과 거의 동일하다는 것을 확인할 수 있습니다. 따라서 IDL에서 동영상을 제작하는데 있어서는 IDLffVideoWrite 또는 WRITE_VIDEO 중 어느 방식으로 작업을 하든 큰 차이는 없다고 볼 수 있습니다. 다만 문법적으로 보면 WRITE_VIDEO를 사용하는 것이 약간 더 간편해보이기는 하지만 어차피 유저가 선택할 문제가 될 것입니다.

 

IDL에서 동영상을 제작하는 방법에 관한 내용은 일단 이 정도로 마무리합니다. 그리고 이번 게시물들은 예제 그래픽의 구현에 있어서 NG 체계에서 작업을 했지만, 동영상에 삽입될 프레임별 이미지들을 생성하는데 있어서는 그래픽 체계의 구분은 필요없습니다. 즉 NG 체계 뿐 아니라 DG 체계에서도 이러한 방법론은 얼마든지 적용이 가능하다는 점을 참고해두시면 좋을 것 같습니다.

 

* 참고로 동영상과 같이 여러 장의 프레임 이미지들로 구성되는 방식으로서 애니메이션 GIF도 있습니다. 물론 파일의 세부 형식이나 제작 방법 등은 다르지만 어떤 면에서는 유사한 성격이라고 볼 수도 있는데요. IDL에서 애니메이션 GIF 파일을 만드는 방법에 관해서는 예전에 관련 게시물을 올린 바 있으므로 이 내용을 참조하시면 됩니다.

 

* 지금까지 언급한 .mp4 형식의 동영상 파일을 생성하는 경우와 애니메이션 GIF 파일을 생성하는 경우 사이에는 중요한 차이점이 있습니다. IDLffVideoWrite 또는 WRITE_VIDEO를 사용하여 .mp4 동영상을 생성하는 경우에는 각 프레임은 24비트 RGB 이미지가 되어야 합니다. 반면 애니메이션 GIF를 생성하는 경우에는 각 프레임은 8비트 이미지가 되어야 합니다. 두 방식 사이의 이러한 차이점을 유의하는 것이 중요할 것 같습니다.

 

 

이 글이 도움이 되었다면 게시물에 대하여 공감 버튼(하트 모양) 클릭 및 블로그 구독도 해주시면 더 큰 힘이 됩니다. 감사합니다.

LIST