[Dos] windows 용 ffmpeg.exe 로 동영상 썸네일 추출하기 Dos_Network_Security

windows 용 ffmpeg.exe 로 동영상 썸네일 추출하기
2008/02/12(화)
밤샘 테스트와 거의 2일간의 테스트였다.
동영상 관련해서 흥미는 많지만, Dos 에서 동작하는 파일로 무언가를 해본적이 별로 없는터라.
여하튼, ASP 와 ffmpeg.exe 를 이용한 웹작업을 감안할때,
동영상에서 썸네일을 뽑아내는 Dos 실행파일이 있다는 점은 중요하다.
이 파일(ffmpeg.exe) 은 windows 에서 동작하는 파일이며, 여타 Linux 기반이나 혹은 minGW 등을 설치하고 인스톨 하여 사용하는 방식이 아니라, 단지 폴더채로 카피해다 놓고 작업할 수 있는 파일임.(dll 파일이 포함되어 있지만 별도의 레지스트리 등록등의 작업이 필요한것은 아님).
테스트 OS는 windows XP professional 및 windows 2003 server 이며, 똑같은 동작성과를 보여줌.
XP 에서의 테스트인경우, 곰플레이어나 K-Lite 코덱팩 , Sothink FlashVideo Encoder 1.1 이나 Power Video Converter 등의 편집툴이 깔려있기도 했으나, 2003 서버의 경우, 전혀 이런 코덱이나 편집툴이 깔려있지 않았음에도 똑같이 동작하였음을 감안할때,
별다른 외부 코덱이나 유틸리티의 영향이 없음을 확인함.
(기타, ffmpeg 지원용 코덱팩 같은것의 설치 없었음).
주의:
ffmpeg.exe 의 경우 여러 버전이 있는듯 하며, 파일 사이즈 또한 제각각인데,
테스트한 버전은 6.97MB ffmpeg.exe 파일이었으며, 압축해제시 bin 폴더와 doc 폴더가 있고,
bin 폴더안에 4개의 파일이 존재함(ffmpeg.exe , ffplay.exe , pthreadGC2.dll , SDL.dll).
-- 이 압축파일을 이 글에 첨부함 --
ffmpeg 를 이용해 썸네일을 추출하는 옵션은 조사한 바에 의하면 두가지로 압축이 가능하다.
옵션1.
ffmpeg -y -i [videofile] -vframes 1 -ss 00:00:02 -an -vcodec png -f rawvideo -s 320*240 [thumbnailimage.png]
여기서 [videofile] 에는 1.avi 등 썸네일을 추출하려는 원본 파일 이름(경로)을 쓴다.
[thumbnailimage.png] 는 추출되는 이미지의 이름을 지정하는 것으로, 경로로 지정해도 된다.
여기서 보면 알겠지만, 테스트결과 png 파일로만 추출됨을 확인했다.(gif,jpg 등으로 지정하면 오류 발생)
옵션2.
ffmpeg -i video.flv -an -ss 00:00:03 -an -r 2 -vframes 1 -y %d.jpg
이것은 flv 파일에서 썸네일을 추출할때 쓰는 옵션이라며 떠도는 내용인데,
테스트결과, flv 파일만이 아니라 다른 포맷의 파일도 이 옵션으로 썸네일이 추출됨을 확인했음.
(avi,wmv,flv,k3g,sktm 등 모두 됨)
도스 커맨드 상태에서 실행한 것을 직접보면,
옵션1 을 이용해서 png 파일로 썸네일을 추출할때.

flv 파일에서 썸네일을 추출할때.



k3g 파일에서 썸네일을 추출할때.


sktm 파일에서 썸네일을 추출할때.


현재 실행중인 위치가 아닌 다른 경로에 있는 ffmpeg.exe 를 실행시켜, 다른 경로의 원본 파일을 다른 경로의 디렉토리로 저장할때.
windows XP professional 에서 테스트시 이상한 오류들이 발생하여 문제를 찾지 못했는데,
원인은, 이런 저런 유틸리티등으로 만들어진 flv 파일이 유틸리티 오류로 0byte 의 파일인 경우에 발생한 것으로 원인 규명.
처음에는 문제를 몰라 사용자 컴퓨터의 환경에 영향을 받는 것으로 생각하였으나,
결론적으로, 사용자 컴퓨터의 환경과는 별개의 문제였음.
두번째 옵션의 경우, gif,jpg,png 로의 추출이 모두 가능했으며,
곰플레이어의 코덱오류로 영상이 재생되지 않는 상황(TSCC 코덱없음 오류) 에서도 썸네일이 추출되는 결과를 보임.
이제, 두번째 옵션의 세부적인 내용을 살펴보면,
ffmpeg -i video.flv -an -ss 00:00:03 -an -r 2 -vframes 2 -y %d.jpg
로 옵션을 주면, 1.jpg, 2.jpg 두개의 이미지가 생성되는 것을 확인할 수 있다.
다시,
ffmpeg -i video.flv -an -ss 00:00:03 -an -r 2 -vframes 1 -y %d.jpg
이라고 옵션을 주면
1.jpg 파일만 생성되는데 그 사이즈가 약 17.6KB 였다.
즉, 옵션의 두개의 숫자는 파일의 이름과 관련있는 것이 아니라, 다른 옵션임.
다시,
ffmpeg -i video.flv -an -ss 00:00:03 -an -r 1 -vframes 2 -y %d.jpg
이라고 옵션을 주면
다시 두개의 jpg 파일이 생성(1.jpg,2.jpg) 되는데,
즉, 첫번째 1 이라는 숫자는 썸네일의 퀄리티를 지정하며, 두번째 2 라는 숫자는 몇장을 뽑아내는지 지정함을 확인.
1.jpg 와 2.jpg 파일을 살펴보면, 약간의 차이(동작이 변화. 즉 움직였음)가 있는데, 프레임 단위로 2장의 썸네일을 뽑아내는 옵션으로 보아짐.
이를 확인하기 위해 다시,
ffmpeg -i video.flv -an -ss 00:00:03 -an -r 1 -vframes 6 -y %d.jpg
이라고 옵션을 주면,
6장의 jpg 파일이 생성되고, 인물이 움직임을 확인할 수 있다.
그렇다면, 옵션의 마지막에 파일이름을 지정한 %d.jpg 는 무엇인가.
%d 는 C++ 에서 사용하는 변수명 같은 의미로 봐야할것 같다.
즉, 연속적으로 캡쳐(추출,썸네일)되는 이미지들의 이름을 순차적으로 지정하기 위해 변수명으로 선언하는 듯 하며,
따라서, 추출될 이미지의 이름을 지정하기 위해서는
test_%d.jpg 처럼 %d 변수를 유지한채 이름을 붙여주면 된다.
그러면, test_1.jpg 파일이 생성되는것을 확인할 수 있다.
P.S.
사용자가 올린 영상 파일 자체의 오류로 인해 ffmpeg.exe 오류가 발생할 수 있으며,
현재의 도스 버전으로는 이 오류를 감지해 내거나 오류에 대한 메세징 처리가 원만하지 않은데,
이런 불완전함에도 불구하고,
별도의 특별한 설치절차 없이, 간단한 옵션으로 썸네일을 뽑아낼 수 있는 유용한 방법이 될 듯 하다.

20080212-ffmpegwindows.zip

덧글

  • 정한수 2008/08/29 20:35 # 삭제 답글

    안녕하세요? 웹사이트를 JSP로 구축중인데, 사용자가 업로드하는 동영상의 프레임을 캡쳐해야하는 일이 저에게 주어졌습니다.
    자세한 설명 너무 감사드리며, 제가 설명해주신 툴을 이용해서 어떻게 하면 웹사이트에 적용을 할 수 있을까요?
    미리 경험하신 경험치를 좀 나누어 주세요...

    부탁드립니다.
  • 1+1=1 2008/08/29 22:50 #

    테스트 해본게 워낙이 오래전이라 기억이 가물가물하네요.
    저의 경우, ffmpeg 를 이용해서, 사용자가 동영상만 올리면 화면캡쳐를 하나 저장하는 게시판을 만들긴 했었는데, 실제로 오픈할때는 그 기능을 잠궈버려서 완벽한 오류테스트는 되지 않았습니다.
    완벽하진 않겠지만(또한 JSP 에 대한 지식이 짧은 관계로) 나름대로 정리해보죠.

    우선 클라이언트 측에서는 원하는 영상파일을 작성폼(에디터)에서 선택해서 업로드를 하게 될텐데요,
    그런점에서 클라이언트 측에서 하는 일은 이게 전부일겁니다.
    사용자가 글을 업로드 하면, 이때부터 서버에서 모든일이 처리될텐데, 우선, 사용자의 글을 DB에 등록한후,
    파일을 업로드 받고(서버측에서) 그 파일에서 캡쳐화면을 뽑아내게 됩니다.
    파일 업로드와 화면캡쳐를 처리하는 부분을 각각 자바빈즈로 처리하면 될것 같네요.
    우선, 파일을 업로드 받고, 그 작업이 끝나면 화면캡쳐를 처리합니다.

    화면을 캡쳐하기 위해서는 업로드된 파일이 있는지부터 확인해야 겠죠?
    만약, DB상에는 업로드 정보가 있는것으로 되어 있는데, 서버 딜레이로 업로드된 파일의 감지가 늦어질 수 있으니,
    업로드된 파일이 있는지 여부를 체크하는(존재하는지) 부분에서는 적어도 1~2초간의 루프가 필요할것 같네요.
    그런다음, 업로드한 파일이 존재한다고 체크되면, 도스 커맨드를 호출하여 ffmpeg 옵션에 의해 원하는 위치로 캡쳐화면을 저장시킵니다.
    (주의: 테스트에 따르면, 거의 오류가 나는 경우가 없었지만, 아주 만약의 경우 ffmpeg 오류나 영상파일을 ffmpeg 가 인식하지 못해서 오류가 발생할 수 있습니다.)
    ffmpeg 를 호출한 커맨드의 경우, 작업이 완료되면 알아서 종료될터이니 종료부분은 신경쓰지 않아도 될것 같군요.
    그러면, 이제 화면캡쳐가 이루어졌으니, 이 정보를 다시 원본 게시물의 DB 레코드에 업로드 해줘야 겠죠?

    처리순서는 편하신대로 뒤바꾸셔도 될것 같구요, 중요한것은, 업로드후 업로드된 게시물을 읽기까지(존재하는지 체크하기까지) 약간의 시간이 필요할 수 있으며, 캡쳐를 위해 ffmpeg 를 동작시켰을때도 오류가 발생할 수 있는 여지가 있으므로, 이에대한 오류처리를 잘하셔야 할것 같습니다.

    서버의 커맨드를 호출하는 부분은, 음... JSP 에서는 어떻게 하는지 모르겠네요.
    ASP 의 경우는 별도의 컴포넌트를 이용해서 동작시킵니다.
댓글 입력 영역
* 비로그인 덧글의 IP 전체보기를 설정한 이글루입니다.

크리에이티브 커먼즈 라이선스 이 저작물은 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 2.0 country.kr 라이선스
따라 이용할 수 있습니다.

통계 위젯 (화이트)

29394305
28292
5671774

google_myblogSearch_side

▷검색어

Flag Counter style2