답변:
sameq
"동일한 품질"을 의미하지 않습니다웹의 여러 리소스는 sameq
또는 same_quant
옵션 의 사용을 장려 하지만 본질적으로 잘못되었습니다. 를 사용 sameq
하면 입력과 동일한 품질의 결과를 얻지 못합니다.
절대로 사용하지 마십시오.
혼란의 원인은이 옵션을 사용하면 동일한 품질을 제공한다는 것을 암시하는 문서가 잘못 작성된 것입니다. 다행히도 옵션이 제거되었습니다.
FFmpeg 문서가 말한 내용 은 다음과 같습니다 .
이것은 동일한 품질이 아닙니다. 이 옵션이 필요하지 않다면 사용하지 마십시오.
실제로는 FFmpeg 개발자는 한 이름을 변경 에서 sameq
에 same_quant
확인 만하고 제거 sameq
/same_quant
모두; 이 옵션은 최근 FFmpeg에는 존재하지 않지만이 기사는 이전 FFmpeg 빌드를 사용하는 사람들에게 여전히 유용합니다.
이제이를 정리 했으므로 기술적 세부 사항을 살펴 보겠습니다.
이것이 왜 안정적으로 작동하지 않는지를 이해하려면 일반적인 비디오 엔코더에서 "품질"의 의미와 품질에 영향을 미치는 개념을 파악해야합니다. 다른 비트 전송률로 압축 할 때 왜 한 비디오가 다른 비디오보다 더 좋아 보입니까? 전환 손실이 발생하는 이유는 무엇이며 인코딩 후 동영상이 원본보다 작은 이유는 무엇입니까?
비디오를 인코딩 할 때는 먼저 픽셀 블록에 수학 변환을 적용하여 입력 데이터를 다른 차원으로 변환합니다. 주로 이산 코사인 변환 (Discrete Cosine Transform) 인 이 변환 은 비디오에서 8 × 8 픽셀의 필드를 설명하는 숫자의 행렬을 생성합니다.
따라서 8x8 픽셀과 해당 행렬은 처음에 다음과 같습니다. 1
그러나 이것은 너무 많은 데이터입니다! 비디오를 압축하려면 실제로 오른쪽 하단의 숫자를 제거 할 수 있습니다. 나는 이것이 왜 정확한지 설명하지 않을 것이지만, 그러한 블록을 설명 할 때 왼쪽 상단의 숫자가 더 중요하다고 가정 해 봅시다. 변환의 전체 아이디어는 기본적으로 중요한 것을 왼쪽 위에 두는 것입니다.
오른쪽 하단의 숫자를 제거하기 위해 0으로 만들 수 있습니다. 무언가가 "아무것도 없다"거나 그냥 반복 0
하면 저장하지 않아도되므로 공간을 절약 할 수 있습니다. 수학적으로, 우리는 할 필요가 양자화 다른 매트릭스는 "양자화 매트릭스"를 적용하여이 첫 번째 행렬.
결과적으로 행렬의 수가 훨씬 적고 0이 많이 발생합니다.
그 결과 많은 수의 첫 번째 고품질 매트릭스가 여전히 동일한 8 x 8 픽셀과 유사한 매트릭스로 바뀌었지만 그 픽셀을 설명하는 숫자가 적기 때문에 품질이 떨어졌습니다. 블록을 시각적으로 비교하면 블록은 비슷하지만 더 이상 동일하지 않습니다.
여기서, 양자화 행렬은 품질을 결정한다 . 이것은 중요합니다. 우리는 다른 품질에 대해 다른 양자화 매트릭스를 사용할 수 있습니다. 일부 양자화 행렬은 원래의 행렬을 그대로 유지하고 일부는 그렇지 않습니다. 우리가 제거 더 많은 숫자는 더 품질이 얻을 것이다, 그러나 더 우리가 기본적으로 여기에 제로 "를 버리고"할 수 있기 때문에 우리는 비디오를 압축 할 수 있습니다.
sameq
?비디오를 인코딩하고 특정 품질을 설정하려고한다고 가정합니다. 우리가 이미 배웠 듯이, 다른 양자화 행렬은 다른 품질로 이어 지므로 인코더가 quality를 사용하도록 지시 x
하면 적절한 양자화 행렬 y
을 선택하여 그 품질에 상관없이 품질을 얻습니다. 결과는 y
매트릭스를 사용하여 압축 된 비디오입니다 . 2
흥미로운 부분 sameq
은 "동일 양자화 기"를 의미합니다. "동일한 품질"이 아닙니다. 최신 버전의 FFmpeg가없는 경우 여전히 다음 위치에서 찾을 수 있습니다 ffmpeg --help
.
ffmpeg --help 2>&1 | grep sameq
따라서 변환 된 비디오를 가져 와서 다시 인코딩하고 sameq
옵션 을 적용하면 FFmpeg는 간단히 말하면 입력 비디오에 사용 된 것과 동일한 양자화 행렬을 선택합니다.
이것은 다소 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
. 이것도 사용하지 마십시오. 나는 진지하다.
-sameq
옵션은 더 이상 사용되지 않으며 avconv에서 제거되었습니다