종종 sameq옵션을 사용하여 FFmpeg 명령을 보았습니다.
ffmpeg -i input.mp4 -sameq output.avi
이것은 무엇을 의미 하는가? “동일한 품질”을 의미합니까? 그렇지 않은 경우 대신 무엇을 사용해야합니까?
답변
sameq “동일한 품질”을 의미하지 않습니다
웹의 여러 리소스는 sameq또는 same_quant옵션 의 사용을 장려 하지만 본질적으로 잘못되었습니다. 를 사용 sameq하면 입력과 동일한 품질의 결과를 얻지 못합니다.
절대로 사용하지 마십시오.
혼란의 원인은이 옵션을 사용하면 동일한 품질을 제공한다는 것을 암시하는 문서가 잘못 작성된 것입니다. 다행히도 옵션이 제거되었습니다.
FFmpeg 문서가 말한 내용 은 다음과 같습니다 .
이것은 동일한 품질이 아닙니다. 이 옵션이 필요하지 않다면 사용하지 마십시오.
실제로는 FFmpeg 개발자는 한 이름을 변경 에서 sameq에 same_quant확인 만하고 제거 sameq/same_quant 모두; 이 옵션은 최근 FFmpeg에는 존재하지 않지만이 기사는 이전 FFmpeg 빌드를 사용하는 사람들에게 여전히 유용합니다.
비디오 압축은 어떻게 작동합니까?
이제이를 정리 했으므로 기술적 세부 사항을 살펴 보겠습니다.
이것이 왜 안정적으로 작동하지 않는지를 이해하려면 일반적인 비디오 엔코더에서 “품질”의 의미와 품질에 영향을 미치는 개념을 파악해야합니다. 다른 비트 전송률로 압축 할 때 왜 한 비디오가 다른 비디오보다 더 좋아 보입니까? 전환 손실이 발생하는 이유는 무엇이며 인코딩 후 동영상이 원본보다 작은 이유는 무엇입니까?
비디오를 인코딩 할 때는 먼저 픽셀 블록에 수학 변환을 적용하여 입력 데이터를 다른 차원으로 변환합니다. 주로 이산 코사인 변환 (Discrete Cosine Transform) 인 이 변환 은 비디오에서 8 × 8 픽셀의 필드를 설명하는 숫자의 행렬을 생성합니다.
따라서 8×8 픽셀과 해당 행렬은 처음에 다음과 같습니다. 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를 사용하면 여전히 사용할 수 있습니다.
결론 : 자신이하는 일을 구체적으로 알지 않는 한 해당 옵션을 사용하지 마십시오. 비디오를 다른 코덱으로 인코딩하고 품질을 유지하려면 직접 실험하고 품질을 설정해야합니다. 결과가 만족 스러운지 확인하고 그렇지 않은 경우 더 높은 품질을 설정하십시오. 그것은 당신이 할 수있는 한 많은 것입니다.
마지막으로 다시 인코딩 할 때 품질을 유지하는 방법에 대해 읽으려면 다음 게시물을 확인하십시오.
- 최소한의 품질 손실로 H.264 비디오를 어떻게 다시 인코딩 할 수 있습니까?
- 원래 품질을 유지하면서 MKV를 MP4로 변환하는 핸드 브레이크 설정
- 오래된 비디오를 더 작은 크기로 변환
- .MOV 파일의 크기를 줄이기 위해 어떤 매개 변수를 살펴 봐야합니까?
1) 매트릭스는 여기의 이미지와 실제로 일치하지 않습니다. 이것은 단지 예일뿐입니다.
2) 실제로 오늘날 대부분의 인코딩 프로세스는 하나의 행렬 만 사용하지 않습니다 . 특정 비트 전송률을 설정하면 인코더는 다른 행렬을 사용하여 초당 평균 비트 전송률을 얻습니다. 마찬가지로, 특정 품질을 설정할 때 최신 인코더는 내용에 따라 다른 행렬을 사용합니다. 일부 내용은 다른 내용보다 압축하기가 “더 쉬워”서 동일한 압축 계수를 얻기 위해 양자화가 덜 필요하기 때문입니다.
3) 예 : ffmpeg -i input.avi -sameq -c:v libxvid output.avi. 이것을 사용하지 마십시오. 부디.
4) 예 : ffmpeg -i input.avi -sameq -c:v libx264 output.mp4. 이것도 사용하지 마십시오. 나는 진지하다.