완벽한 솔루션: 반복되는 매우 유사한 프레임을 줄이고 (최대) 가변 프레임 속도로 출력을 저장합니다.

완벽한 솔루션: 반복되는 매우 유사한 프레임을 줄이고 (최대) 가변 프레임 속도로 출력을 저장합니다.

FFMPEG/libx264(-r/-framerate)에 고정 프레임 속도를 제공하는 대신 MAXIMUM 값으로 가변 프레임 속도를 지정하고 libx264가 적절하다고 판단되는 대로 프레임 속도를 낮추도록 허용하고 싶습니다. 여기서 아이디어는 확장된 스틸 프레임(이런 일이 발생함)과 같은 것이 있을 때 추가 압축을 얻는 것입니다.많이내 소스 비디오에서).

예측 또는 양방향 MPEG 프레임이 정말 잘 압축된다는 것을 알고 있지만 소스 프레임 속도가 트랜스코딩하려는 프레임 속도보다 작을 수도 있습니다(아마도 더 큰 스트림이 생성될 수 있습니다!).

답변1

당신도 답을 찾지 못한 것에 실망하여, 나는 적어도 VFR(V가 아닌)을 활성화하는 방법에 대한 다른 사람들의 질문에 대답하려고 했습니다.R) FFMPEG의 출력.

이에 대한 대답은 이상한 이름의 -vsync옵션입니다. 몇 가지 다른 옵션으로 설정할 수 있지만 원하는 옵션은 '2' 또는 입니다 vfr. 매뉴얼 페이지에서:

-vsync 매개변수
비디오 동기화 방법. 호환성상의 이유로 이전 값을 숫자로 지정할 수 있습니다. 새로 추가된 값은 항상 문자열로 지정되어야 합니다.

  • 0, 통과

    • 각 프레임은 타임스탬프와 함께 디먹서에서 멀티플렉서로 전달됩니다.
  • 1, CFR

    • 요청된 일정한 프레임 속도를 정확하게 달성하기 위해 프레임이 복제되고 삭제됩니다.
  • 2, vfr

    • 두 프레임이 동일한 타임스탬프를 갖는 것을 방지하기 위해 프레임은 타임스탬프와 함께 전달되거나 삭제됩니다.
  • 떨어지다

    • 패스스루이지만 모든 타임스탬프를 파괴하여 먹서가 프레임 속도에 따라 새로운 타임스탬프를 생성하도록 합니다.
  • -1, 자동

    • 멀티플렉서 기능에 따라 1과 2 중에서 선택합니다. 이것이 기본 방법입니다.

그 후에 타임스탬프는 먹서에 의해 추가로 수정될 수 있습니다. 예를 들어 형식 옵션의 경우escape_negative_ts사용 가능.

-map을 사용하면 타임스탬프를 가져와야 하는 스트림을 선택할 수 있습니다. 비디오나 오디오를 변경하지 않고 그대로 두고 나머지 스트림을 변경되지 않은 스트림에 동기화할 수 있습니다.

그러나 나는 모든 사람이 갖고 있는 '하위 질문'에 답하기 위해 댓글을 게시할 만큼 충분한 평판을 갖고 있지 않습니다. 하지만 솔직히 그다지 낙관적이지 않은 몇 가지 아이디어가 있었습니다... 하지만 제가 실제로 시도한 첫 번째 아이디어는일했다. 그래서.

-vsync 2옵션과 옵션을 결합하기만 하면 됩니다 -r $maxfps. 물론 $maxfps원하는 최대 프레임 속도로 교체하면 됩니다! 그리고 그것은 작동합니다! 소스 파일에서 프레임을 복제하지는 않지만 파일이 최대 프레임 속도를 초과하게 만드는 프레임을 삭제합니다!

기본적으로 이는 -r $maxfps일정한 프레임 속도를 달성하기 위해 프레임을 복제/삭제하고 -vsync 2PTS 값에 실제로 영향을 주지 않고 직접 프레임을 가져오는 것으로 보입니다.

-r $maxfps나는 이것이 일정한 프레임 속도로 진행된다는 것을 이미 알고 있었기 때문에 이에 대해 낙관적이지 않았습니다 . 나는 솔직히 오류가 발생하거나 처음이든 마지막이든 뭐든 순종할 것이라고 예상했습니다. 내가 원했던 것을 정확하게 수행한다는 사실은 FFMPEG 개발자들에게 매우 만족스럽습니다.

이것이 당신에게 도움이 되기를 바라며, 나중에 더 이상 알 필요가 없는 다른 사람에게 도움이 되기를 바랍니다.

답변2

MAXIMUM 값으로 가변 프레임 속도를 지정하고 libx264가 적합하다고 생각되는 프레임 속도를 낮추도록 허용하고 싶습니다. 여기서 아이디어는 확장된 스틸 프레임과 같은 것이 있을 때 추가 압축을 얻는 것입니다.

내 이해에 따르면 이는 비교적 서투른 방식으로 가능할 수 있지만 복잡하고 직관에 반하는 이유로 인해 바람직하지 않습니다.

x264 스트림에 프레임 속도가 있더라도 프레임 속도는 코덱보다는 컨테이너 수준의 문제입니다.

패스스루 VFR 인코딩에는 기본적으로 프레임/시간에 대한 프레임 속도를 자세히 설명하는 텍스트 파일이 있으며, 소스 인코딩에서는 tcfile-in 또는 tcfile-out과 같은 함수가 타임스탬프를 인코딩에 전달합니다. , 속도 위치를 매핑하고 비디오를 소스와 주관적으로 일관되게 유지합니다.

낮은 프레임 속도 아이디어는 논리적이지만 여러 가지 이유로 작동하지 않습니다. x264는 일부 기능을 통해 VFR을 인식하지만 파일 크기를 줄이기 위해(많은 비트 전송률 제어와 유사한 방식으로) 동작과 관련하여 프레임 속도를 변경하는 분석 기능이 없다고 생각합니다.

소스도 문제입니다. VFR 소스는 기본적으로 프레임 가변성을 유지하지만 분명히 가변 비트 전송률로 CFR 파일을 인코딩하는 것은(특히 텔레시네가 필요할 때 좋은 아이디어임) 단순히 동일한 CFR을 생성합니다.

즉, 비트 전송률을 직접 다시 작성해야 하거나(예: 파일에 멀티플렉싱된 느린 장면의 타임스탬프)avisynth에 대한 dup, dedup 및 정확한Dedup과 같은 프레임 소멸 알고리즘. 비디오의 움직임이 극히 적다면 일부 프레임(절반이라도?)이 버려질 수 있습니다. 문제는 이러한 알고리즘이 발전되지 않았으며 최상의 인코딩에 기여할 내용에 대해 "실제" 영상을 사용하여 올바른 선택을 하지 않는다는 것입니다.

또한 I 및 B 프레임과 같은 항목이 포함된 프레임을 제거하면 시간이 지남에 따라 사용 가능한 세부 정보의 양이 줄어들어 모션이 "계단형"으로 보이고 다른 기본 비디오 매개 변수를 방해하고 앨리어싱과 같은 아티팩트가 발생할 수 있습니다.

그리고 양자화기의 작동 방식으로 인해 x264는 움직임이 적은 장면에서 실제로 비트 전송률을 불균형적으로 더욱 감소시킵니다. 동일한 이미지의 슬라이드쇼가 없으면 움직임이 생기고(결 및 기타 아티팩트만 있는 경우) 비트 전송률을 크게 변경하지 않으면 볼 수 없는 품질 손실이 발생합니다.

그리고 마지막으로 원하는 작업을 수행할 수 있는 옵션이 많지 않은 이유는 x264가 시간적 압축(부분 프레임의 변경 사항 기록)을 사용하여 비트 전송률을 관리하는 데 정말 뛰어나기 때문입니다. 프레임 속도를 1/2로 설정해도 파일 크기가 절반으로 줄어들지는 않습니다. 10%는 아마도 낮은 모션이나 애니메이션에서 기대할 수 있는 현실적인 이득일 것입니다.

간단히 말해서, 정적 장면의 비트 전송률을 낮추면 파일 크기에는 거의 영향을 미치지 않지만 비디오 편집 소프트웨어와의 비호환성은 말할 것도 없고 품질 및 동기화 문제가 추가됩니다.

데시메이터를 사용해보고 싶다면 다음을 사용하여 최대 새 프레임 속도를 제한할 수 있습니다.레벨 옵션, 각각은 최대 해상도와 프레임 속도를 지정합니다. 불행하게도 프로필을 사용하여 원하는 프레임 속도를 얻으려면 매우 낮은 해상도에서 작업해야 할 수도 있습니다. 전체 속도를 직접 편집하거나 너무 높다고 생각되는 프레임 속도를 수정하는 방법으로 돌아갑니다. 어느 쪽이든, tcfile이 보존될 때 인코딩 프로세스 후에 변경이 이루어지면 사운드를 새 프레임 속도와 동기화하도록 유지하려면 저글링이 필요합니다.

요점은 많은 비트 전송률 설정을 최적화하는 데 시간을 투자하면 파일 크기 관리 방식에서 훨씬 더 많은 결과를 얻을 수 있으며, 약간의 이득으로 인해 문제가 발생하는 대신 비디오 품질이 향상된다는 것입니다. 방송이나 미디어 표준을 목표로 하는 것이 아니라면 원래 FPS를 보존하는 것이 아마도 가장 좋은 아이디어일 것입니다. 플레이어는 NLE와 달리 다양한 비트 전송률을 처리하도록 잘 설계되어 있으며, 비디오에 프레임이 많을수록 프레임 간 동작 변화가 작아지기 때문에 재생이 더 원활해지고 파일 크기도 작아질 수 있습니다.

다음은 인코딩의 혼란스러운 측면을 해결하는 데 도움이 되는 표준 정보 및 포럼 토론에 대한 링크 모음입니다.

-avisynth 학살 도구

-fps 및 -r 스위치
-x264 일반(tcfile, fps)
-타임코드 파일 표준
-레벨 및 프로필
-짧고 명확한 CFR/VFR 설정 요약("프레임 속도" 섹션)

doom9, videohelp, &c 이론적 토론
1 2 4 5 6 7

답변3

완벽한 솔루션: 반복되는 매우 유사한 프레임을 줄이고 (최대) 가변 프레임 속도로 출력을 저장합니다.

  • 긴 정지 장면이 포함된 콘텐츠의 경우 중복 프레임을 삭제하면 프레임 속도를 동적으로 크게 낮추어 코덱 및 프레임 내 압축보다 파일 크기를 더 많이 줄일 수 있습니다!
  • 내 예에서는:
    • 60FPS에서 100% 원본 메자닌 파일 크기
    • 60FPS 고정 프레임 속도에서 15% CR28
    • 60FPS 피크 프레임 속도에서 6% CR28(거의 3배!)

원본 사용 가능

ffmpeg -i screen-recording.mov -movflags faststart -c:v libx264 -vf mpdecimate -vsync vfr -r 120 -preset veryslow -crf 24 screen-recording-vfr.mp4

다시 인코딩하지 않고 이미 압축된 비디오를 동적 프레임 속도로 트랜스코딩

ffmpeg -i video-export-old.mp4 -vf mpdecimate -vsync vfr video-export-mpdecimated-without-reencoding.mp4

상세히

원본 사용 가능

ffmpeg -i screen-recording.mov -movflags faststart -c:v libx264 -vf mpdecimate -vsync vfr -r 120 -preset veryslow -crf 24 "screen-recording-vfr.mp4"

-i video-mezzanine.mov   Original or your high quality rendered export as the input file.
-movflags faststart      Streaming ready by putting the moov atom to the file start.
-c:v libx264             H-264 codec
-vf mpdecimate           Drop frames not differing greatly from previous frame to reduce frame rate.
-vsync vfr               Output as variable frame rate (vfr)! Necessary sister option to 'mpdecimate'.
                         - To maintain the playback speed while benefitting from the file size reduction.
-r 30                    If you specify -r then in this combo it serves as the peak framerate!
                         I recommend to omit this option:
                         - Then the peak framerate IS the peak/constant rate of the source.
                         - Which preserves dynamic scenes fully and compresses long still sequences.
                         - So the best of both aspects.
                         - State a peak FPS if loosing FPS in dynamic scenes
                           is acceptable for the reduction in file size.
-crf 24                  - Constant Rate Factor (constant quality at variable bitrate)
-preset veryslow         - Quality effort put into the encoding
screen-recording-vfr.mp4 - Output file

다시 인코딩하지 않고 이미 내보낸 비디오를 동적 프레임 속도로 변환

ffmpeg -i video-export-old.mp4 -vf mpdecimate -vsync vfr video-export-mpdecimated.mp4

  • 이는 무손실 작업입니다. 손실이 있는 재인코딩은 발생하지 않으며 재패킹/재참조만 발생합니다.

  • 가능한 한 많은 중복 프레임을 삭제합니다!

예:

  • 전환 없이 스틸 이미지 3개만으로 구성된 슬라이드쇼 * 각 이미지는 5초 동안 지속됨 * 50FPS = 750프레임

  • ffmpeg실제로 1/5(=0.2) FPS에서 단 3프레임으로 줄어듭니다! 미디어인포로 확인했습니다!

분석 및 학습

  • 긴 정지 이미지 장면이 포함된 동영상의 프레임 양과 파일 크기가 크게 줄어들 수 있습니다!
  • 두 시나리오 모두
    • 동일한 CFR의 메자닌 파일에서 인코딩하면 시각적 품질이 유지됩니다.
      • 그러나 고정 프레임 속도에서 가변 프레임 속도로의 파일 크기 감소는 15%~6%입니다.
    • 다시 인코딩하지 않고 프레임 속도를 줄이면 파일 크기가 줄어들지만 여전히 다음과 같습니다.
      • 파일 크기 감소(15% ~ 10%)
screen-recording.mov
- Frame rate mode: Variable
- Frame rate: 58.628 FPS
- Minimum frame rate: 30.000 FPS
- Maximum frame rate: 60.000 FPS
- Frame count: 732                100 %
- Size: 1675084 bytes             100 %

screen-recording CR24 fps 60.mp4
- Frame rate mode: Constant
- Frame rate: 60.000 FPS
- Frame count: 750                102 %
- Size: 255863 bytes               15 %

screen-recording CR24 mpdecimated vfr.mp4
- Frame rate mode: Variable
- Frame rate: 17.398 FPS
- Minimum frame rate: 1.132 FPS
- Maximum frame rate: 60.000 FPS
- Frame count: 214                 29 %
- Size: 101860 bytes                6 %


screen-recording CR24 mpdecimated fps 30 max.mp4
- Frame rate mode: Variable
- Frame rate: 11.078 FPS
- Minimum frame rate: 1.154 FPS
- Maximum frame rate: 30.000 FPS
- Frame count: 137                 17 %
- Size: 94382 bytes                 5.6

screen-recording CR24 mpdecimated vfr without re-encoding faststart.mp4
- Frame rate mode: Variable
- Frame rate: 19.974 FPS
- Minimum frame rate: 1.132 FPS
- Maximum frame rate: 60.000 FPS  
- Frame count: 247                 33 % 
- Size: 165 KB (164947 bytes)      10 %


관련 정보