[python] 비디오 화질 유지하기

FSA·2024년 5월 25일
0

video vision

목록 보기
8/10

사전 정보

코덱 (Codec)

  • 코덱은 ‘Compressor-decompressor’의 줄임말로, 데이터를 압축하고 해제하는 기술
  • 동영상 코덱은 비디오 파일의 크기를 줄이기 위해 데이터를 압축하고, 우리가 비디오를 볼 때 다시 압축을 풀어서 원래대로 복원
  • 이 과정을 통해 인터넷 등을 통해 비디오를 보다 빠르고 효율적으로 전송할 수 있음
  • H.264 (또는 AVC), H.265 (HEVC) 등이 있으며, 오디오 코덱으로는 AAC, MP3 등이 있습니다.

비트레이트 (Bitrate)

  • 비트레이트는 데이터 전송량을 나타내는 용어로, 주로 초당 전송되는 비트 수
  • 즉,비트레이트가 높을수록 초당 전송되는 데이터 양이 많아지며, 일반적으로 화질이나 음질이 더 좋아집니다.
  • 하지만 비트레이트가 너무 높으면 파일 크기가 커지고, 데이터 사용량이 많아지므로 적절한 비트레이트를 선택하는 것이 중요합니다.
  • 비트레이트는 ‘kbps’(킬로비트퍼세컨드)나 ‘mbps’(메가비트퍼세컨드)로 표현
  • 예를 들어, 비디오를 저장할 때 높은 비트레이트로 설정하면 화질은 좋아지지만 파일 크기가 커지고, 반대로 낮은 비트레이트로 설정하면 파일 크기는 작아지지만 화질이 떨어질 수 있습니다.
  • 따라서 용도에 맞게 적절한 비트레이트를 선택하는 것이 중요합니다.

bitrate VS fps

  • 결론적으로, 비트레이트는 각 프레임의 '품질'을, 프레임 속도는 비디오의 '부드러움'을 담당합니다

비트레이트 vs 프레임 속도

  • 비트레이트는 각 프레임의 품질을 결정합니다. 높은 비트레이트는 각각의 프레임에 더 많은 정보를 담을 수 있음
  • 프레임 속도는 비디오의 움직임이 얼마나 부드럽게 보이는지 결정합니다. 높은 프레임 속도는 빠르게 움직이는 객체나 빠른 카메라 이동이 자연스럽게 보일 수 있도록 합니다.

비트레이트 (Bitrate)

  • 비트레이트는 비디오의 압축률과 직접적인 관련이 있으며, 비트레이트가 높을수록 초당 전송되는 데이터량이 많아지므로 일반적으로 화질이 더 좋습니다.
  • 높은 비트레이트는 더 세밀하고 정확한 색상 재현, 낮은 압축으로 인한 이미지 왜곡 감소 등을 가능하게 합니다.
    하지만 비트레이트가 너무 높으면 파일 크기가 커지고, 재생을 위한 데이터 처리량도 많아집니다.

프레임 속도 (FPS: Frames Per Second)

  • 프레임 속도, 즉 FPS는 비디오에서 초당 표시되는 이미지(프레임)의 수를 나타냅니다.
  • 프레임 속도가 높을수록 더 많은 이미지가 필요하므로 데이터 처리량이 증가하지만, 이는 비트레이트와는 독립적인 요소입니다.

비트레이트와 해상도의 관계

  • 비트레이트와 해상도는 서로 밀접하게 연관되어 있습니다. 해상도가 높은 비디오는 각 프레임에 더 많은 픽셀 정보를 포함하고 있기 때문에, 이를 효과적으로 처리하려면 충분히 높은 비트레이트가 필요합니다.

  • 만약 해상도는 높지만 비트레이트가 낮다면, 비디오는 충분한 데이터를 받지 못해 픽셀화되거나, 압축 아티팩트(예: 블록 노이즈)가 발생할 수 있습니다.

  • 반대로, 낮은 해상도에서 불필요하게 높은 비트레이트를 사용하면 데이터 사용이 비효율적일 수 있으며, 이는 파일 크기를 쓸데없이 늘리게 됩니다.

  • 따라서, 해상도에 적합한 비트레이트를 선택하는 것이 중요합니다.

  • 예를 들어, 1080p 해상도의 경우 일반적으로 3,000~6,000 kbps의 비트레이트가 적절하다고 여겨집니다.

  • 이를 통해 균형 잡힌 화질과 파일 크기를 유지할 수 있습니다.

  • 결론적으로, 비트레이트와 해상도는 서로 보완적인 관계에 있으며, 비디오의 최종 화질은 이 두 요소가 어떻게 조화를 이루는지에 크게 의존합니다.


코드 점검

import moviepy.editor as mp

video = mp.VideoFileClip(video_dir)
video2 = mp.VideoFileClip(video_dir2)
clips = [video, video2]
edited = mp.CompositeVideoClip(clips)
edited.write_videofile(out_fpath, codec="libx264", audio_codec="aac")
  1. 코덱 설정:
  • codec="libx264"audio_codec="aac"를 사용하면서 기본 설정에 따라 압축이 진행되므로 화질이 다소 저하될 수 있습니다.
  • 특히, 비디오의 bitrate가 자동으로 설정되면 원본보다 낮을 수 있습니다.
  1. 해상도 및 비트레이트:
  • 코드에서 해상도와 비트레이트에 대한 설정이 명시적으로 주어지지 않았기 때문에, VideoFileClip이나 write_videofile 함수의 기본 설정에 따라 처리됩니다.
  • 이 경우 원본 비디오의 품질을 유지하지 못할 가능성이 있습니다.

  • 화질 저하를 최소화하기 위한 해결책:
  1. 비트레이트 설정: (초당 전송되는 비트 수)
  • 원본 비디오의 비트레이트를 유지하거나 적절히 설정하여 출력 비디오의 품질을 높일 수 있습니다.

  • 원본 비디오의 비트레이트를 확인한 후, 이를 write_videofile 함수에 명시적으로 지정합니다.

  • 예를 들어, 원본 비트레이트가 높은 경우, 출력 파일도 높은 비트레이트로 설정해야 합니다.

    edited.write_videofile(out_fpath, codec="libx264", audio_codec="aac", bitrate="5000k")
  1. 프레임 속도 유지:
  • 원본 비디오의 프레임 속도를 확인하고 이를 출력 파일에도 동일하게 설정할 수 있습니다.

  • 프레임 속도가 변경되지 않도록 주의합니다.

    edited.write_videofile(out_fpath, codec="libx264", audio_codec="aac", fps=video.fps)
  1. 고급 인코딩 옵션 사용:
  • x264 코덱에는 화질을 향상시키기 위한 여러 고급 설정이 있습니다.

  • 예를 들어, presettune 옵션을 사용하여 인코딩의 속도와 품질을 조절할 수 있습니다.

    edited.write_videofile(out_fpath, codec="libx264", preset="slow", tune="animation", audio_codec="aac")

고급 인코딩 옵션

  • 비디오 인코딩 시 사용하는 x264 코덱의 고급 설정인 presettune 옵션을 통해 비디오의 인코딩 과정에서 화질과 인코딩 속도를 조절할 수 있습니다.
  • 이 두 옵션을 자세히 이해하고 적절히 사용하면, 필요에 맞게 화질을 최적화하면서도 파일 크기나 인코딩 시간을 효율적으로 관리할 수 있습니다.

Preset

  • preset 옵션은 인코딩 시간 대비 압축 효율성의 균형을 조절합니다.

  • 이 설정은 인코더가 비디오를 압축하는 데 사용하는 시간과 자원을 결정합니다. preset은 다음과 같은 값들로 설정할 수 있습니다:

  • ultrafast

  • superfast

  • veryfast

  • faster

  • fast

  • medium (기본값)

  • slow

  • slower

  • veryslow

  • placebo


  • ultrafast는 인코딩 속도가 가장 빠르지만 압축률이 낮아 파일 크기가 크고 화질이 상대적으로 낮아질 수 있습니다.
  • 반면에, veryslow는 인코딩에 많은 시간이 소요되지만 더 나은 압축률과 화질을 제공합니다.
  • placebo는 거의 사용되지 않으며, 이론상 최상의 화질을 제공하지만 그에 따른 시간 증가는 실질적인 이득에 비해 크지 않습니다.

Tune

  • tune 옵션은 특정 유형의 입력 비디오에 최적화되도록 인코더를 조정
  • 다음과 같은 tune 설정이 가능합니다:

  • film - 영화 또는 다른 고화질 소스용. 약간의 노이즈나 곡물을 자연스럽게 보이게 처리합니다.

  • animation - 애니메이션 비디오에 적합하게 최적화. 일반적으로 더 깨끗한 배경과 선명한 경계를 유지하도록 조정됩니다.

  • grain - 곡물 효과를 유지하는 데 중점을 둡니다.

  • stillimage - 정지 이미지의 긴 장면에 최적화.

  • fastdecode - 빠른 디코딩이 필요한 환경(예: 스트리밍)에 유리합니다.

  • zerolatency - 방송과 같이 지연 시간을 최소화해야 할 때 사용됩니다.

  • psnr, ssim - 화질 측정 기준에 따라 최적화됩니다.

  • 예를 들어, presetslow로 설정하고, tuneanimation으로 설정하면, 영화나 고품질의 비디오 소스 인코딩에 최적화하여 더 나은 화질을 얻을 수 있습니다.

  • 이 설정은 인코딩 시간이 길어지지만, 압축 효율과 화질이 향상됩니다.

profile
모든 의사 결정 과정을 지나칠 정도로 모두 기록하고, 나중에 스스로 피드백 하는 것

0개의 댓글