2019년 1월 7일 월요일

동영상을 배경화면으로 쓰기 위한 모험

리눅스 데스크탑 환경을 잘 쓰고 있는데 아쉬운 것 중에 하나는 배경화면에 iOS 환경처럼 동영상을 깔아둘 수 없다는 거다. 굳이 찾아보면 그런 게 된다고 하는 프로그램이 없진 않은데 내 환경이랑은 안 맞기도 하고, 어떻게 동작하는지 단박에 이해가 되지 않아서 내 환경에 들이고 싶은 마음도 안 든다.

X11 Root Window

가장 쉽게 떠올릴 수 있는 건 mplayer -rootwin 혹은 mpv -wid 0 옵션을 적용해 X11 root window에서 재생하는 건데, 이게 예전에는 자연스러운 동작이었지만 (윈도우 10라면 dwm.exe에 해당하는) compositor가 일상적으로 돌아가는 요즘은 (나는 compton을 쓴다) 재생이 시작되자마자 디스플레이 영역 전체를 덮으며 영상이 나오는 바람에 써먹을 수가 없었다.

게다가 여러 모니터를 쓰는 환경이라서 root window를 쓰기엔 어울리지 않았다. 꽤 넓은 이 해상도에 맞게 동영상을 그리면서 계단 현상이 안 생기려면 동영상 자체의 해상도가 어지간히 높아야 하기도 하고, 한 화면에만 동영상을 깔아두고 싶기도 했다.

일반 창 + 추가 속성

mpv 옵션을 한참 만지작거리다가, 굳이 root window일 필요가 없다는 걸 깨달았다. mpv --screen=0 옵션 정도로 0번 모니터에 창이 뜨면 일단 되는 거였다. (창 관리자에 따라서 안 될 수도 있다고 옵션 설명에 적혀있긴 하다)

거기에, 배경화면처럼 동작해야 하니 (흔히 쓰는 Always on top의 반대인) Always on bottom 속성이 먹혀야 하는데 mpv에 --ontop 옵션은 있어도 --onbottom에 해당하는 옵션은 없다. wmctrl -r gl.mpv -x -F -b toggle,below 명령을 쓰면 되는 것까지는 확인했다. 하지만 이게 다가 아니었다. mpv --no-border 옵션을 주거나, wmctrl로 fullscreen 속성을 주면, below 속성이 무시되고 포커스가 갔을 때 다른 창보다 위로 올라간다.

Openbox

그래서 다른 방식으로 해보았다. openbox는 rc.xml에 여러 설정을 먹여서 창을 세밀하게 관리할 수 있으니까, wmctrl으로 차례로 조정하던 속성을 아예 창 관리자 자체에서 한 번에 먹이면 뭔가 다르지 않을까 하는 생각이었다.

대충 아래처럼 rc.xml의 applications 요소 안에 넣어주면 되는데 (mpv --title 옵션을 썼다) 그래도 차도가 없었다. 터미널에 아예 above 속성을 줘봤지만 그래도 fullscreen 상태가 된 mpv 창이 더 위로 올라왔다. 아무래도 openbox가 지정하는 순서가 그런 것 같다.
    <application title="THIS_IS_IT">
      <layer>below</layer>
      <fullscreen>yes</fullscreen>
      <position force="yes">
        <monitor>1</monitor>
      </position>
      <focus>no</focus>
    </application>

혹은 fullscreen 대신 decor 속성을 끄는 방식으로 해봐도 똑같다. man의 설명에 따르면 mpv --no-border 옵션이 decor 속성에 대응한다는데 이건 wmctrl로는 해결이 안 된다.

몇 가지 조합을 해본 바로는, fullscreen 속성이든 decor 속성이든 상관없이 mpv가 해당 스크린 영역을 모두 차지해서 openbox가 뭘 더 그리거나 mpv 외의 남는 영역이 있지 않으면 below 속성은 무시된다. 혹시나 해서 gnome-mpv로도 실행해봤는데 똑같은 방식으로 동작한다. 이건 아마도 openbox가 전체 창을 다루는 방식 때문이지 않을까 싶은데 openbox를 대신할 창 관리자가 없어서 의심만 할 뿐이다.

결과

그렇다면 해결책은 이렇다.

openbox로는 mpv나 wmctrl로 적용이 안 되는 below 속성을 기본으로 주고, 창 크기를 1픽셀 줄여서 전체화면이 아니게 한다. (남은 1픽셀은 적당히 눈에 안 띄게 그 아래에 배경색을 깔아주면 된다)
창 크기가 1픽셀 줄어들었으므로 영상이 찌그러지지 않도록(=불필요한 이미지 재처리가 일어나지 않도록) 가로세로 비율이 창의 영향을 받지 않도록 하고, (이건 openbox에서 설정해도 무방한데) 전체화면이 아니며 창 테두리도 없으며 0번 화면에 표시한다. 소리는 끄고, mpv가 종료하면 다음 재생시에 끝난 부분부터 다시 재생하게 한다. 배경화면이므로 키보드나 마우스로 제어되지 않게 한다. 화면보호기는 평소처럼 작동하고 재생중이던 파일들은 무한 반복한다.
여기에 -vo vaapi 같이 적당한 가속 기능을 줘서 CPU나 GPU 어느 쪽을 쓸지 정해주면 된다. htop과 radeontop으로 확인했을 때 어느 쪽이든 부하가 걸리기는 한다.

rc.xml
    <application title="THIS_IS_IT">
      <layer>below</layer>
      <focus>no</focus>      <skip_pager>yes</skip_pager>
      <skip_taskbar>yes</skip_taskbar>
    </application>

mpv \
 --geometry=1919x1080 \
 --keepaspect-window=no --video-unscaled=yes \
 --fullscreen=no --no-border --screen=0 \
 -ao null --save-position-on-quit \
 --no-input-default-bindings --osc=no --window-dragging=no \
 --stop-screensaver=no --keep-open --loop-playlist