ffmpeg

spring·2023년 12월 12일
0

NVIDIA Encoder/Decoder
https://developer.nvidia.com/video-encode-and-decode-gpu-support-matrix-new

ffmpeg TIPS
https://gist.github.com/leeseomin/1f13cd8a11fc4e772208bedbe67453b8
https://hasu0707.duckdns.org/blog/?p=3494

ffmpeg 옵션 설명
https://wiki.yowu.dev/ko/tips/ffmpeg-honey-command-hands-book

ffmpeg 옵션별 품질 비교
https://scvspace.kr/1509

샤나인코더
https://shana.pe.kr/shanaencoder_tip/80556

기본

# 사용가능한 HW가속기
ffmpeg -hwaccels
  • cuda: NVIDIA의 CUDA를 사용한 가속
  • qsv: Intel의 Quick Sync Video를 사용한 가속
  • dxva2: DirectX Video Acceleration 2를 사용한 가속 (MediaFoundation에 적합)
  • d3d11va: DirectX 11 Video Acceleration을 사용한 가속
  • opencl: OpenCL을 사용한 가속
  • vulkan: Vulkan을 사용한 가속
ffmpeg -encoders
ffmpeg -decoders

Encoder 옵션 확인

ffmpeg -h encoder=h264_nvenc

옵션 우선순위

일반 옵션: -profile, -level, -preset, -tune, -b:v, -crf 등 모든 코덱에 사용이 가능한 옵션
고유 옵션: 인코더별로 다른 옵션

일반옵션이 고유옵션보다 우선순위가 높다.

Windows 탐색기에서 HEVC/AV1 썸네일 표시

HEVC(유료): https://www.microsoft.com/store/productId/9NMZLZ57R3T7?ocid=pdpshare

AV1(무료): https://www.microsoft.com/store/productId/9MVZQVXJBQ9V?ocid=pdpshare

Icaros 설치 후 THUMBNAILING 활성화 하면 AV1 썸네일 보임.

https://www.videohelp.com/software/Icaros

VBR인지 CBR인지 확인1

mediainfo를 다운받고 아래 명령어로 확인가능.

mediainfo <INPUT> | grep -E -i "(^[^:]*$)|bit rate"
General
Overall bit rate mode                    : Variable
Overall bit rate                         : 10.1 Mb/s

Video
Bit rate mode                            : Variable
Bit rate                                 : 10.0 Mb/s

Audio
Bit rate mode                            : Constant
Bit rate                                 : 64.0 kb/s

컨테이너만 변경

ffmpeg -i input.mkv -c copy output.mp4

간단하게 용량 줄이기

ffmpeg -hwaccel cuda -i input.mp4 -c:v h264_nvenc -preset p4 -crf 23 -c:a copy output.mp4

Video concat

우선 ffmpeg을 실행할 디렉토리를 기준으로 이어붙일 파일들의 목록 txt 파일이 필요하다. 아래와 같이 만들어주면 된다.
(파일 목록은 file 이 줄마다 prefix로 붙어야 한다)
(디렉토리 구분자로 반드시 / slash를 사용해야 한다.)

ls "DIRNAME/*F.mp4" | sed "s/\\/\//g" | sed "s/^/file /" > lstf.txt

이제 위에서 생성한 txt파일로 비디오를 붙일 수 있다.

# Video concat
ffmpeg -f concat -i lstf.txt -c copy output.mp4

아래는 오디오를 따로 concat하고 합치는 방법인데 오디오를 제외하면 concat이 빨라진다.

# Video concat without audio
ffmpeg -f concat -i lstf.txt -c copy -an output_video.mp4
# Audio only concat
ffmpeg -f concat -i lstf.txt -c copy -vn output_audio.mp3

# 만약 audio concat이 불가능하다면 아래와 같이 수행
ffmpeg -f concat -i lstf.txt -c:a mp3 -vn output_audio.mp3

# Merge video and audio
ffmpeg -i output_video.mp4 -i output_audio.mp3 -c:v copy -c:a copy output.mp4

mp4 2개로 mkv 만들기

ffmpeg -y -i output_f.mp4 -i output_r.mp4 -c copy -map 0 -map 1 output.mkv

비디오 2개를 위,아래로 붙이기

  • forward.mp4 : mp4v, 1920x1080, 60fps, 494MB
  • backward.mp4 : mp4v, 1920x1080, 60fps, 498MB

비디오 품질 점수 계산(VMAF)

ffmpeg -i "orifinal.mp4" -i "output.mp4" -lavfi "libvmaf=n_threads=16" -f null -

TEST 내용

무손실(ffv1)

  • 용량: 22.2GB
  • Video Bit rate: 2.316 Mb/s
  • 프레임 점프 빠름, Decoder CUDA 가능
  • Video Bit rate: 638 Mb/s, Variable
ffmpeg -i forward.mp4 -i backward.mp4 -filter_complex "[0:v][1:v]vstack" -c:v ffv1 -c:a copy output_ffv1.mkv
# 22.2GB

H265(CUDA,cq0)

  • 용량: 81.2MB
  • VMAF score: 82.986923 (ffv1과 비교)
  • Video Bit rate: 2.316 Mb/s
  • 프레임 점프 빠름, Decoder CUDA 가능
  • 시작 화질 안좋음
ffmpeg -hide_banner -y -hwaccel cuda -i forward.mp4 -i backward.mp4 -filter_complex "[0:v][1:v]vstack" -cq 0 -c:v hevc_nvenc -c:a copy output_cuda_nvenc_cq0.mp4

H264(CUDA,cq0)

  • 용량: 59.7MB
  • VMAF score: 82.655709
  • Video Bit rate: 1.704 Mb/s, Variable,
  • Video Maximum bit rate: 6 Mb/s
  • 프레임 점프 빠름, Decoder CUDA 가능
  • 시작 화질 안좋음
ffmpeg -hide_banner -y -hwaccel cuda -i forward.mp4 -i backward.mp4 -filter_complex "[0:v][1:v]vstack" -cq 0 -c:v h264_nvenc -c:a copy output_cuda_h264_cq0.mp4

vp9(Intel QSV,global_quality=0)

  • 용량:
  • VMAF score:
  • Video Bit rate:
ffmpeg -hide_banner -y -hwaccel qsv -qsv_device 1 -i forward.mp4 -i backward.mp4 -filter_complex "[0:v][1:v]vstack" -global_quality 0 -c:v vp9_qsv -c:a copy output_qsv_vp0_gq0.mp4

X264(CPU,cfr0)

  • 용량: 3.8GB
  • VMAF score: 83.527467
  • Video Bit rate: 114 Mb/s
  • 내장 FFmpeg decoder(Thread Frame) 사용
ffmpeg -i forward.mp4 -i backward.mp4 -filter_complex "[0:v][1:v]vstack" -crf 0 -c:v libx264 -c:a copy output_x264_crf0.mp4

x265(CPU,crf0)

  • 용량: 2.97GB
  • VMAF score: 83.516821
  • Video Bit rate: 87.1 Mb/s
  • 프레임 점프 빠름, Decoder CUDA 가능
ffmpeg -i forward.mp4 -i backward.mp4 -filter_complex "[0:v][1:v]vstack" -crf 0 -c:v libx265 -c:a copy output_x265_crf0.mp4

vp9(CPU,crf0)

  • 용량: 5.32GB
  • VMAF score: 83.527230
  • Video Bit rate: 156 Mb/s
  • 프레임 점프 빠름, Decoder CUDA 가능
  • Encoding 매우 느림
ffmpeg -i forward.mp4 -i backward.mp4 -filter_complex "[0:v][1:v]vstack" -crf 0 -c:v libvpx-vp9 -c:a copy output_libvpx-vp9_crf0.mp4

ffprobe

비디오의 모든 스트림 정보 확인

ffprobe -hide_banner -v error -show_streams -of default=noprint_wrappers=1 video.mp4

비디오의 특정 스트림 정보 확인

ffprobe -v error -show_entries stream=codec_name,level -of default=noprint_wrappers=1:nokey=1 video_1080p.mp4

Additional

profile
Researcher & Developer @ NAVER Corp | Designer @ HONGIK Univ.

0개의 댓글