ffmpeg command line으로 영상 다루기.

ffmpeg command line으로 영상 다루기.

2020, Nov 11    

ffmpeg을 이용해서 인코딩된 영상 저장 및 변환을 위한 명령어를 알아본다.

FFmpeg Windows Builds

Windows용 ffmpeg은 FFmpeg Windows Builds에서 git를 이용하거나 release 링크를 통해 다운로드 받을 수 있다.

영상 다시 생성하기

MP4 영상 vod 스트리밍시 seek 가 안되는 경우 mp4 영상을 ffprobe로 보면 아래와 같이 start 값이 영상의 길이보다 큰 경우가 있다.

이런 경우에 seek를 하여 재생위치를 변경하면 초기 위치부터 재생이 된다.

$ ffprobe filename.mp4
ffprobe version N-77791-g93ac72a Copyright (c) 2007-2016 the FFmpeg developers
  built with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-16)
  . . . (skip build information)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'filename.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf57.21.101
  Duration: 00:21:13.89, start: 2010.203000, bitrate: 2033 kb/s
    Stream #0:0(und): Video: h264 (Baseline) (avc1 / 0x31637661), yuv420p(tv, unknown/bt470bg/unknown), 1280x720, 2031 kb/s, 17.49 fps, 180k tbr, 180k tbn, 360k tbc (default)
    Metadata:
      handler_name    : VideoHandler

아래 ffmpeg으로 영상을 재생성하면 start 값이 0 으로 설정된다.

그냥 실행하면 터미널에 로그를 찍느라 시간이 오래 걸리므로 로그는 /dev/null 로 보내버린다.

for Linux

ffmpeg -i input.mp4 -codec copy output.mp4 > /dev/null 2>&1

for Windows

ffmpeg -i choco_upgrade_all.mp4 -codec copy output.mp4 > $null

CCTV 실시간 영상 보관하기

CCTV와 같은 계속되는 영상을 1시간 단위로 1일동안 보관하고자 할 때 아래와 같이 segment 기능으로 영상을 잘라서 보관할 수 있다.

-f segment : 파일을 분할하여 저장
-segment_list out.list : 파일목록 기록
-segment_time 3600 : 분할단위는 초(3600초, 1시간)
-segment_wrap 24 : 분할단위기준으로 파일 개수(파일개수가 넘으면 000번 파일로 다시 기록된다.)

아래는 약 10분짜리 영상을 60초 단위로 분할한다.

> ffmpeg.exe -i .\BigBuckBunny.mp4 -codec copy -f segment -segment_list out.list -segment_time 60 -segment_wrap 24 out%03d.mp4

ffmpeg version 4.3.1-2020-10-01-full_build-www.gyan.dev Copyright (c) 2000-2020 the FFmpeg developers
  built with gcc 10.2.0 (Rev3, Built by MSYS2 project)
  . . . (skip build information)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '.\BigBuckBunny.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isomavc1mp42
    creation_time   : 2010-01-10T08:29:06.000000Z
  Duration: 00:09:56.47, start: 0.000000, bitrate: 2119 kb/s
    Stream #0:0(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 125 kb/s (default)
    Metadata:
      creation_time   : 2010-01-10T08:29:06.000000Z
      handler_name    : (C) 2007 Google Inc. v08.13.2007.
    Stream #0:1(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1991 kb/s, 24 fps, 24 tbr, 24k tbn, 48 tbc (default)
    Metadata:
      creation_time   : 2010-01-10T08:29:06.000000Z
      handler_name    : (C) 2007 Google Inc. v08.13.2007.
[segment @ 00000172c17a09c0] Opening 'out.list' for writing
[segment @ 00000172c17a09c0] Opening 'out000.mp4' for writing
Output #0, segment, to 'out%03d.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isomavc1mp42
    encoder         : Lavf58.45.100
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 1991 kb/s, 24 fps, 24 tbr, 12288 tbn, 24 tbc (default)
    Metadata:
      creation_time   : 2010-01-10T08:29:06.000000Z
      handler_name    : (C) 2007 Google Inc. v08.13.2007.
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 125 kb/s (default)
    Metadata:
      creation_time   : 2010-01-10T08:29:06.000000Z
      handler_name    : (C) 2007 Google Inc. v08.13.2007.
Stream mapping:
  Stream #0:1 -> #0:0 (copy)
  Stream #0:0 -> #0:1 (copy)
Press [q] to stop, [?] for help
[segment @ 00000172c17a09c0] Opening 'out001.mp4' for writing
[segment @ 00000172c17a09c0] Opening 'out002.mp4' for writing
[segment @ 00000172c17a09c0] Opening 'out003.mp4' for writing
[segment @ 00000172c17a09c0] Opening 'out004.mp4' for writing
[segment @ 00000172c17a09c0] Opening 'out005.mp4' for writing
[segment @ 00000172c17a09c0] Opening 'out006.mp4' for writing
[segment @ 00000172c17a09c0] Opening 'out007.mp4' for writing
[segment @ 00000172c17a09c0] Opening 'out008.mp4' for writing
[segment @ 00000172c17a09c0] Opening 'out009.mp4' for writing
frame=14315 fps=0.0 q=-1.0 Lsize=N/A time=00:09:56.45 bitrate=N/A speed=1.36e+03x
video:144985kB audio:9144kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown

썸네일 이미지 저장

지정된 경로에 주어진 시간 간젹으로 확장자의 이미지 포맷으로 썸네일을 생성한다.

-vf fps=1 : 1초에 한장씩 이미지 출력. -vf fps=1/60 : 1분에 한장씩 이미지 출력.

 ffmpeg.exe -i .\BigBuckBunny.mp4 -vf fps=1 Thumbnails/B3_%02d.png
... skip information 
frame=  596 fps= 16 q=-0.0 Lsize=N/A time=00:09:56.00 bitrate=N/A speed=15.8x

참고 URL