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
- StreamingGuide-FFmpeg
- Re-stream using FFmpeg with Wowza Streaming Engine
- Video streaming with ffmpeg
- Record fragments of 10 seconds using FFMPEG and DSHOW from webcam
- Create a thumbnail image every X seconds of the video