ffmpeg.exe를 사용해 비디오 파일을 MPEG1 포맷으로 변경하는 방법
동영상 포맷 정보를 알기 위해 (vcpkg로도 쉽게 빌드해 생성할 수 있는) ffprobe를 실행해 보면 됩니다.
D:\video_sample> ffprobe mp4video_sample2.mp4
ffprobe version 4.4.1 Copyright (c) 2007-2021 the FFmpeg developers
built with Microsoft (R) C/C++ Optimizing Compiler Version 19.30.30705 for x64
configuration: ...[생략]... --extra-cflags='-DHAVE_UNISTD_H=0' --extra-cflags=-MD --extra-cxxflags=-MD
libavutil 56. 70.100 / 56. 70.100
libavcodec 58.134.100 / 58.134.100
libavformat 58. 76.100 / 58. 76.100
libavdevice 58. 13.100 / 58. 13.100
libavfilter 7.110.100 / 7.110.100
libswscale 5. 9.100 / 5. 9.100
libswresample 3. 9.100 / 3. 9.100
libpostproc 55. 9.100 / 55. 9.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'mp4video_sample2.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.45.100
Duration: 00:04:00.98, start: 0.000000, bitrate: 1263 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1920x1080 [SAR 1:1 DAR 16:9], 1130 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc (default)
Metadata:
handler_name : ISO Media file produced by Google Inc.
vendor_id : [0][0][0][0]
Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 127 kb/s (default)
Metadata:
handler_name : ISO Media file produced by Google Inc.
vendor_id : [0][0][0][0]
MPEG4 포맷이군요. ^^ 이것을 MPEG1로 변환하기 위해 ffmpeg를 다음과 같이 사용할 수 있습니다.
D:\video_sample> ffmpeg -i mp4video_sample2.mp4 mp4video_sample2_loss.mpeg
생성된 mpeg 파일을 ffprobe로 확인해 보면,
D:\video_sample> ffprobe mp4video_sample2_loss.mpeg
ffprobe version 4.4.1 Copyright (c) 2007-2021 the FFmpeg developers
built with Microsoft (R) C/C++ Optimizing Compiler Version 19.30.30705 for x64
configuration: ...[생략]... --extra-cflags='-DHAVE_UNISTD_H=0' --extra-cflags=-MD --extra-cxxflags=-MD
libavutil 56. 70.100 / 56. 70.100
libavcodec 58.134.100 / 58.134.100
libavformat 58. 76.100 / 58. 76.100
libavdevice 58. 13.100 / 58. 13.100
libavfilter 7.110.100 / 7.110.100
libswscale 5. 9.100 / 5. 9.100
libswresample 3. 9.100 / 3. 9.100
libpostproc 55. 9.100 / 55. 9.100
Input #0, mpeg, from 'mp4video_sample2_loss.mpeg':
Duration: 00:04:00.95, start: 0.530800, bitrate: 1433 kb/s
Stream #0:0[0x1e0]: Video: mpeg1video, yuv420p(tv), 1920x1080 [SAR 1:1 DAR 16:9], 104857 kb/s, 23.98 fps, 23.98 tbr, 90k tbn, 23.98 tbc
Stream #0:1[0x1c0]: Audio: mp2, 44100 Hz, stereo, s16p, 384 kb/s
"mpeg1video"라는 문자열이 있으니 잘 변환이 되었습니다. 그런데, 저렇게 변환을 하고 나서 보면 영상 이미지가 제법 깨져 있습니다. 원래의 원본 영상과,
(사진은
유튜브 영상 "디에이드"의 "안다은" 님이고 사용을 허락받고 올립니다.)
변환된 영상을 보면 확연한 차이가 있습니다.
왜냐하면, ffmpeg에
qscale 값(범위: 1 ~ 31)을 설정하지 않았기 때문입니다. 이 값을 0으로 주면 손실 변환을 하지 않아 원본 이미지와 유사한 해상도가 나옵니다.
D:\video_sample> ffmpeg -i mp4video_sample2.mp4 -q:v 0 mp4video_sample2_q0.mpeg
ffmpeg version 4.3.2-2021-02-27-full_build-www.gyan.dev Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 10.2.0 (Rev6, Built by MSYS2 project)
configuration: ...[생략]... --enable-libsoxr --enable-chromaprint
libavutil 56. 51.100 / 56. 51.100
libavcodec 58. 91.100 / 58. 91.100
libavformat 58. 45.100 / 58. 45.100
libavdevice 58. 10.100 / 58. 10.100
libavfilter 7. 85.100 / 7. 85.100
libswscale 5. 7.100 / 5. 7.100
libswresample 3. 7.100 / 3. 7.100
libpostproc 55. 7.100 / 55. 7.100
...[생략]...
Output #0, mpeg, to 'mp4video_sample2_q0.mpeg':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.45.100
Stream #0:0(und): Video: mpeg1video, yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 23.98 fps, 90k tbn, 23.98 tbc (default)
Metadata:
handler_name : ISO Media file produced by Google Inc.
encoder : Lavc58.91.100 mpeg1video
Side data:
cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: N/A
Stream #0:1(eng): Audio: mp2, 44100 Hz, stereo, s16, 384 kb/s (default)
Metadata:
handler_name : ISO Media file produced by Google Inc.
encoder : Lavc58.91.100 mp2
[mpeg1video @ 0000020611e6f040] warning, clipping 1 dct coefficients to -255..255
Last message repeated 18 times
[mpeg1video @ 0000020611e6f040] warning, clipping 1 dct coefficients to -255..255speed=32.6x
Last message repeated 17 times
[mpeg1video @ 0000020611e6f040] warning, clipping 1 dct coefficients to -255..255speed=36.2x
Last message repeated 13 times
[mpeg1video @ 0000020611e6f040] warning, clipping 1 dct coefficients to -255..255speed=36.5x
Last message repeated 10 times
[mpeg1video @ 0000020611e6f040] warning, clipping 1 dct coefficients to -255..255speed=36.1x
Last message repeated 23 times
[mpeg1video @ 0000020611e6f040] warning, clipping 1 dct coefficients to -255..255speed=36.9x
Last message repeated 11 times
[mpeg1video @ 0000020611e6f040] warning, clipping 1 dct coefficients to -255..255speed=37.2x
Last message repeated 14 times
[mpeg1video @ 0000020611e6f040] warning, clipping 1 dct coefficients to -255..255speed=37.2x
Last message repeated 10 times
[mpeg1video @ 0000020611e6f040] warning, clipping 1 dct coefficients to -255..255speed=37.6x
Last message repeated 10 times
[mpeg1video @ 0000020611e6f040] warning, clipping 1 dct coefficients to -255..255speed=37.6x
Last message repeated 36 times
[mpeg1video @ 0000020611e6f040] warning, clipping 1 dct coefficients to -255..255speed=37.4x
Last message repeated 25 times
[mpeg1video @ 0000020611e6f040] warning, clipping 1 dct coefficients to -255..255speed=37.5x
Last message repeated 10 times
frame= 5776 fps=912 q=0.0 Lsize= 161002kB time=00:04:00.96 bitrate=5473.4kbits/s speed= 38x
video:148950kB audio:11296kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.471775%
그런데, 이번에는 마지막 즈음에 경고 메시지들이 뜹니다. 아직, 영상 처리에 초보라 이런 경고들의 원인을 모르겠군요. ^^ (혹시 아시는 분은 덧글 부탁드립니다.)
그나저나, 원본 영상이 37MB이고 qscale을 주지 않았을 때는 (손실 압축의 경우) 42MB MPEG1Video가 나왔지만, qscale을 0으로 준 경우에는 160MB 크기의 MPEG1Video 파일이 생성되었습니다. "-q:v 3" 정도로는 113MB에 영상 품질의 차이가 거의 없는 걸로 봐서, 아마도 크기를 감안해 적절한 수치를 찾아내면 될 듯합니다. 바꿔 말하면, 그 정도로 h2464의 압축 효율이 높다는 거겠죠!
참고로, 동영상을 구할 수 있는 Sample Videos라는 사이트가 있군요. ^^
Sample Videos
; https://sample-videos.com/
(2022-04-16 업데이트) 무손실 변환으로 video와 audio에 대해 단순히 복사하라는 명령을 다음과 같이 실행할 수 있습니다.
// How to Convert AVI to MP4 using FFmpeg? Lossy and Lossless Conversion
// ; https://ottverse.com/ffmpeg-convert-avi-to-mp4-lossless/
ffmpeg -i test.avi -c:v copy -c:a copy -y output.mp4
(또는,)
ffmpeg -i test.avi -codec copy output.mp4
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]