FFmpeg의 "sameq" 또는 "same_Quant" 옵션은 무엇입니까? "동일한 품질"을 의미합니까?

FFmpeg의 "sameq" 또는 "same_Quant" 옵션은 무엇입니까? "동일한 품질"을 의미합니까?

종종 옵션을 사용하여 FFmpeg 명령을 본 적이 있습니다 sameq. 예를 들면 다음과 같습니다.

ffmpeg -i input.mp4 -sameq output.avi

이것은 무엇을 의미 하는가? "동일한 품질"을 의미합니까? 그렇지 않다면 대신 무엇을 사용해야 합니까?

답변1

sameq"동일한 품질"을 의미하지는 않습니다.

웹의 여러 리소스에서는 sameqor same_quant옵션의 사용을 장려하지만 본질적으로 이는 잘못된 것입니다. 를 사용하면 sameq입력과 동일한 품질의 결과를 얻을 수 없습니다.
절대 사용하지 마세요.

혼란의 원인은 이 옵션을 사용하면 동일한 품질을 제공할 것이라고 암시하는 잘못 작성된 문서였습니다. 다행히 옵션이 제거되었습니다.

다음은 무엇입니까? FFmpeg 문서말했다:

이는 동일한 품질이 아닙니다. 이 옵션이 필요하다고 확신하지 않는 한 이 옵션을 사용하지 마십시오.

실제로 FFmpeg 개발자들은이름을 바꿨다확인하기 위해, sameq그리고 나서same_quant제거됨 sameq/same_quant전부; 이는 이 옵션이 최근 FFmpeg에는 존재하지 않는다는 것을 의미하지만, 이 문서는 이전 FFmpeg 빌드를 사용하는 사람들에게 여전히 유용합니다.


비디오 압축은 어떻게 작동하나요?

이제 이 문제를 해결했으므로 몇 가지 기술적인 세부 사항을 살펴보겠습니다.

안정적으로 작동하지 않는 이유를 이해하려면 일반적인 비디오 인코더에서 "품질"이 의미하는 것과 품질에 영향을 미치는 것이 무엇인지 개념을 파악해야 합니다. 다른 비트 전송률로 압축하면 한 비디오가 다른 비디오보다 더 좋아 보이는 이유는 무엇입니까? 변환 손실이 발생하는 이유는 무엇이며, 인코딩 후 비디오가 원본보다 작은 이유는 무엇입니까?

비디오를 인코딩할 때 먼저 픽셀 블록에 수학적 변환을 적용하여 입력 데이터가 다른 차원으로 변환됩니다. 이 변환은 주로이산 코사인 변환, 예를 들어 비디오의 8×8 픽셀 필드를 설명하는 숫자 행렬을 생성합니다.

따라서 8×8 픽셀과 해당 행렬은 처음에는 다음 과 같습니다.

원본 이미지  

그러나 이것은 너무 많은 데이터입니다! 비디오를 압축하려면 실제로 오른쪽 하단에 있는 숫자를 제거할 수 있습니다. 이것이 정확히 왜 그런지는 설명하지 않겠지만, 그러한 블록을 설명할 때 왼쪽 상단의 숫자가 더 중요하다고만 말씀드리겠습니다. 기본적으로 변환의 전체 아이디어는 중요한 항목을 왼쪽 상단에 배치하는 것입니다.

오른쪽 하단의 숫자를 제거하려면 숫자를 0으로 만들 수 있습니다. 어떤 것이 "아무것도" 아니거나 0s로 반복되는 경우에는 저장할 필요가 없으므로 공간을 절약할 수 있습니다. 수학적으로, 우리는양자화하다이 첫 번째 행렬은 또 다른 행렬인 "양자화 행렬"을 적용하여 수행됩니다.

그러면 이제 훨씬 더 적은 수의 숫자와 많은 0이 포함된 행렬이 생성됩니다.

압축된 이미지  

그 결과 우리는 숫자가 많은 첫 번째 고품질 행렬을 동일한 8×8 픽셀과 유사하지만 해당 픽셀을 설명하는 숫자가 적기 때문에 품질이 떨어지는 행렬로 전환했습니다. 블록을 시각적으로 비교하면 비슷하지만 더 이상 완전히 동일하지는 않습니다.

여기,양자화 행렬이 품질을 결정합니다. 이건 중요하다. 다양한 품질에 대해 다양한 양자화 행렬을 사용할 수 있습니다. 일부 양자화 행렬은 원래 행렬을 거의 그대로 유지하지만 다른 행렬은 그렇지 않습니다. 더 많은 숫자를 제거할수록더 나쁜품질은 좋아지겠지만,여기서 기본적으로 0을 "버릴" 수 있기 때문에 비디오를 압축할 수 있습니다.

그게 무슨 관련이 있나요 sameq?

비디오를 인코딩하고 특정 품질을 설정한다고 가정해 보겠습니다. 이미 배웠듯이 양자화 행렬이 다르면 품질도 달라집니다. 따라서 인코더에 quality 를 사용하라고 지시하면 인코더는 품질이 무엇이든 간에 해당 품질을 얻기 위해 x적절한 양자화 행렬을 선택합니다 . y결과는 매트릭스를 사용하여 압축된 비디오입니다 y. 2

흥미로운 부분은 다음과 같습니다.sameq"동일한 양자화기"를 의미합니다. "동일한 품질"이 아닙니다.최신 버전이 아닌 FFmpeg 버전이 있는 경우 다음에서 찾을 수 있습니다 ffmpeg --help.

ffmpeg --help 2>&1 | grep sameq

따라서 이제 변환된 비디오를 가져와 다시 인코딩하고 옵션을 적용하면 sameqFFmpeg는 간단히 말해서 입력 비디오에 사용된 것과 동일한 양자화 행렬을 선택합니다.

이것약간예를 들어 XviD 비디오를 XviD 비디오로 변환할 때와 같이 입력과 출력에 정확히 동일한 코덱을 사용할 때 작동하지만 여전히 품질이 떨어지게 됩니다. 3 이미 인코딩된 내용을 인코딩하면 더 많은 정보가 버려지기 때문입니다. 위의 예에서는 행렬에 0을 더 많이 생성하므로 결과가 더 나빠 보일 것입니다.

그렇습니다~ 아니다다양한 비디오 코덱에서 작업할 수 있습니다. XviD로 인코딩된 비디오를 x264로 변환한다고 가정해 보겠습니다. 4 이 두 코덱의 경우 내부적으로 사용되는 양자화 행렬은 서로 다릅니다. 즉, 동일한 계수를 갖지 않습니다. 따라서 이 옵션은 의미가 없습니다! 불행히도 FFmpeg에서는 여전히 사용할 수 있습니다.

요점: 현재 수행 중인 작업을 구체적으로 알지 않는 한 해당 옵션을 사용하지 마십시오. 다른 코덱으로 비디오를 인코딩하고 싶지만 품질은 유지하려면 실험을 거쳐 품질을 직접 설정해야 합니다. 결과가 만족스러운지 확인하고, 그렇지 않다면 더 높은 품질을 설정하세요. 그것은 당신이 할 수 있는 만큼입니다.

마지막으로, 다시 인코딩할 때 품질을 유지하는 방법에 대해 알아보려면 다음 게시물을 확인하세요.


1) 행렬은 실제로 여기 이미지와 일치하지 않습니다. 이것은 단지 예일 뿐입니다.
2) 실제로 요즘 대부분의 인코딩 프로세스는 단순히하나행렬. 특정 비트 전송률을 설정하면 인코더는 다른 매트릭스를 사용하여 초당 평균 비트 전송률을 얻습니다. 마찬가지로 특정 품질을 설정할 때 최신 인코더는 콘텐츠에 따라 다른 매트릭스를 사용합니다. 이는 일부 콘텐츠가 다른 콘텐츠보다 압축하기가 "더 쉽고" 동일한 압축 계수를 얻기 위해 양자화가 덜 필요하기 때문입니다.
3) 예: ffmpeg -i input.avi -sameq -c:v libxvid output.avi. 이것을 사용하지 마십시오. 제발.
4) 예: ffmpeg -i input.avi -sameq -c:v libx264 output.mp4. 이것도 사용하지 마세요. 나는 진지하다.

관련 정보