Tag Archives: ffmpeg

ffmpeg / mencoder 이용해서 동영상에 로고 넣기

동영상에 이미지로고를 삽입할 일이 있어서 ffmpeg와 mencoder를 이용해서 테스트해봤습니다.

ffmpeg에서는 간단합니다. -vhook 옵션을 사용하면 됩니다. vhook 플러그인중에 imlib2를 사용하면 됩니다. 하지만 최근 SVN에서는 vhook 옵션이 제거되었습니다. libavfilter라는 새로운 필터링 라이브러리로 갈아타기 위해서이지만 아직은 쓸수 있는 플러그인이 없어서 SVN에 있는 버전은 로고를 삽입할수 없습니다. x 좌표, y 좌표 지정하는 곳에 expression을 사용할수 있어서 위치 조절등을 비교적 쉽게 할수 있습니다. 자세한 사용법은 http://windforce.ellil.net/d/ffmpeg/hooks.html 을 참고하세요.

$ ffmpeg -sameq -i input.avi -vhook ‘vhook/imlib2.so -x 10 -y 10 -i logo.png’ output.avi

mencoder에서는 FIFO라는 기술로 개발되었기 때문에 유닉스 계열에서만 정상적으로 동작합니다. png 포멧을 바로 지원하지 않기 때문에 변환을 위해서 ImageMagick이 필요합니다. 웹상에서 찾은 예제들은 RGB24 포맷을 사용하도록 되어 있어서 투명한 로고를 지원하지 않았었는데 ImageMagick에서 변환할때 RGBA로 변환하면 투명한 로고가 지원됩니다. bit depth는 8비트만 지원하므로 16비트로 되어 있으면 제대로 동작하지 않습니다.

$ convert logo.png -depth 8 logo.rgba
$ mkfifo bmovl.fifo
$ echo “RGBA32 80 30 10 10 0 0” > bmovl.fifo; cat logo.rgba > bmovl.fifo

다른 terminal에서 실행
$ mencoder input.avi -o output.avi -vf bmovl=0:0:bmovl.fifo … {encoding options}

위에서 로고의 크기는 80×30이고 10,10 위치에 출력하도록 설정했습니다. logo.rgba포맷은 raw 이미지 포맷으로 Red Greed Blue Alpha 8비트씩 하나의 픽셀이 32비트로 구성되어 있습니다. FIFO를 통해서 인코딩중에 지속적으로 명령을 전달할수 있으므로 로고를 바꾼다던지 위치를 바꾸는게 가능은 합니다. 하지만 프로그래밍이 필요하고 원하는 시간에 동기화하는게 쉬운 일은 아닙니다.

mencoder와 ImageMagick를 이용해서 들어온 동영상에서 screenshot을 여러개 받은후 가장 밝은 이미지를 찾고, 이 이미지를 autocrop한 다음에 인코딩하도록 python으로 작업했습니다. 동영상의 소스가 여러곳이고 크기, 파일포맷도 여러가지이고 결정적으로 상하좌우 공백이 같이 인코딩되어 있는 경우가 있어서 수동인코딩도 고려했었는데… 동영상 인코딩을 완전 자동화할수 있을거라 기대하고 있습니다 🙂

ffmpeg 이용하여 MOV에서 AVI로 변환

Nikon 디카를 사용하는데 동영상을 찍으면 QuickTime으로 저장됩니다. PC에서 보는거야 코덱깔면 문제없지만, 사용중인 디빅 플레이어인 랩소디에서 재생이 안됩니다. 그리고 엑박에서도 재생이 안됐었던거 같네요.

바닥 프로그램에서는 변환은 되지만, 뭐가 문제인지 소리가 안나더군요. 몇가지 변환 프로그램을 구해서 써봤는데 대부분 mencoder나 ffmpeg를 내부엔진으로 사용하는듯하더군요. 바닥이 mencoder 기반이라 ffmpeg로 직접 변환을 해보니 문제 없이 변환이 되네요.

ffmpeg은 http://ffdshow.faireal.net/mirror/ffmpeg/ 에서 최신 버전을 구했으며, python으로 간단히 프로그램을 짜서 여러 파일들을 한꺼번에 변환했습니다. 처음에는 msmpeg4v2, msmpeg4, mpeg4 등의 비디오 코덱으로 변환했는데 랩소디에서 xvid가 가장 무리없이 재생이 되는군요. video bitrate는 1500, audio는 lame mp3로 변환합니다. 640×480, 15 frames/sec QuickTime에서 avi로 변환하면 약 반에서 3분의 1 정도로 줄고 화질은 약간 나빠지는 정도입니다.

변환하는 파일명에 공백등이 포함되면 변환이 안되는 버그가 생겨서 os.system대신 os.spawnv를 사용했습니다. os.system에 여러곳에 “따옴표”를 쓰면 실행파일 경로를 제대로 인식못하는 버그가 있는거 같습니다.

[code type=python]
import os
import glob

ffmpeg_path = ‘C:/Program Files/Free/ffmpeg.rev12665/ffmpeg’

def converted_name(filename):
  filename = filename.replace(“.MOV”, “.AVI”)
  filename = filename.replace(“.mov”, “.avi”)
  return filename

def convert(filename):
  aviname = converted_name(filename)
  if os.path.exists(aviname):
   print “skipping %s” % filename
   return
  args = ‘-i “%s” -g 15 -b 1500k -vcodec libxvid -acodec libmp3lame -ab 64k -ar 22050 “%s”‘ % (filename, aviname)
  os.spawnv(os.P_WAIT, ffmpeg_path, [‘”%s”‘ % ffmpeg_path, args])

def main():
  filelist = glob.glob(“*/*.mov”)
  for filename in filelist:
   convert(filename)

if __name__==’__main__’:
  main()
[/code]