Apa opsi "sameq" atau "same_quant" di FFmpeg? Apakah ini berarti "kualitas yang sama"?

29

Seringkali, saya telah melihat perintah FFmpeg menggunakan sameqopsi, misalnya

ffmpeg -i input.mp4 -sameq output.avi

Apa artinya ini? Apakah ini berarti "kualitas yang sama"? Jika tidak, apa yang harus saya gunakan?

slhck
sumber

Jawaban:

57

sameq tidak berarti "kualitas yang sama"

Beberapa sumber daya di web mempromosikan penggunaan opsi sameqatau same_quant, tetapi pada dasarnya, mereka salah. Menggunakan sameqtidak memberi Anda hasil dengan kualitas yang sama dengan input.
Jangan pernah menggunakannya.

Sumber kebingungan adalah dokumentasi yang ditulis dengan buruk yang menyiratkan bahwa menggunakan opsi ini akan memberikan kualitas yang sama. Untungnya, opsi telah dihapus.

Inilah yang dikatakan dokumentasi FFmpeg :

Perhatikan bahwa ini BUKAN KUALITAS SAMA. Jangan gunakan opsi ini kecuali Anda tahu Anda membutuhkannya.

Bahkan para pengembang FFmpeg telah berubah nama dari sameqke same_quanthanya untuk memastikan, dan kemudian dihapus sameq/same_quant sama sekali; artinya opsi ini tidak ada di FFmpeg baru-baru ini, tetapi artikel ini masih berguna bagi mereka yang menggunakan build FFmpeg yang lebih lama.


Bagaimana cara kerja kompresi video?

Sekarang kita sudah menyelesaikan ini, mari kita masuk ke beberapa detail teknis.

Untuk memahami mengapa itu tidak bekerja dengan andal, kita perlu memahami konsep apa arti "kualitas" untuk encoder video umum dan apa yang memengaruhi kualitas. Mengapa satu video terlihat lebih baik daripada yang lain ketika dikompres dengan bit rate yang berbeda? Apa yang membuat kehilangan konversi, dan mengapa video lebih kecil dari aslinya setelah penyandian?

Saat Anda menyandikan video, data input Anda dikonversi ke dimensi yang berbeda dengan terlebih dahulu menerapkan transformasi matematis ke blok piksel. Transformasi ini, kebanyakan Discrete Cosine Transform , menghasilkan matriks angka yang menggambarkan, katakanlah, bidang 8 × 8 piksel dalam video.

Jadi, 8 × 8 piksel Anda dan matriks yang sesuai pada awalnya akan terlihat seperti ini: 1

Gambar asli  

Tapi ini terlalu banyak data! Jika kita ingin mengompresi video, kita sebenarnya bisa menghilangkan angka-angka ke kanan bawah. Saya tidak akan menjelaskan mengapa ini persis, tetapi anggap saja angka-angka di kiri atas lebih penting ketika menggambarkan blok seperti itu. Seluruh ide transformasi pada dasarnya adalah untuk meletakkan hal-hal penting di kiri atas.

Untuk menghapus angka-angka di kanan bawah kita bisa menjadikannya nol. Jika sesuatu "tidak ada", atau hanya berulang sebagai 0s, kita tidak perlu menyimpannya, dan dengan begitu kita akan menghemat ruang. Secara matematis, kita perlu mengukur matriks pertama ini dengan menerapkan matriks lain, "matriks kuantisasi".

Ini akan menghasilkan matriks yang sekarang memiliki jumlah yang jauh lebih sedikit di dalamnya, dan banyak nol:

Gambar Terkompresi  

Hasilnya adalah kita mengubah matriks pertama yang berkualitas tinggi dengan banyak angka menjadi matriks yang masih menyerupai piksel 8 × 8 yang sama, tetapi dengan kualitas yang lebih sedikit karena memiliki lebih sedikit angka untuk menggambarkan piksel tersebut. Jika Anda membandingkan blok secara visual, mereka serupa, tetapi tidak sama lagi.

Di sini, matriks kuantisasi menentukan kualitas . Ini penting. Kita dapat menggunakan matriks kuantifikasi yang berbeda untuk kualitas yang berbeda. Beberapa matriks kuantisasi membuat matriks asli hampir utuh, yang lain tidak. Semakin banyak angka yang kita hapus, semakin buruk kualitasnya, tetapi semakin banyak kita dapat mengompres video, karena pada dasarnya kita dapat "membuang" nol di sini.

Apa hubungannya dengan itu sameq?

Mari kita asumsikan Anda menyandikan video dan Anda ingin menetapkan kualitas tertentu. Seperti yang telah kita pelajari, matriks kuantisasi yang berbeda mengarah pada kualitas yang berbeda, jadi ketika kita memberi tahu pembuat xkode kita untuk menggunakan kualitas , ia akan memilih matriks kuantisasi yang sesuai yuntuk mendapatkan kualitas itu, apa pun itu. Hasilnya adalah video yang dikompresi menggunakan ymatriks. 2

Dan inilah bagian yang menarik: sameqberarti "quantizer yang sama". Bukan "kualitas yang sama". Jika Anda memiliki FFmpeg versi terbaru, Anda masih dapat menemukannya di ffmpeg --help:

ffmpeg --help 2>&1 | grep sameq

Jadi, ketika Anda sekarang mengambil video yang dikonversi dan menyandikannya lagi, dan Anda menerapkan sameqopsi, FFmpeg akan, cukup berbicara, pilih matriks kuantisasi yang sama yang digunakan untuk video input.

Ini agak bekerja ketika Anda menggunakan codec yang sama persis untuk input dan output, misalnya ketika mengkonversi dari video XviD ke video XviD, tetapi Anda masih akan berakhir dengan kualitas yang lebih buruk. 3 Ini karena pengkodean sesuatu yang sudah dikodekan akan membuang lebih banyak informasi. Pada contoh di atas, kita akan membuat angka nol lebih banyak dalam matriks kita dan hasilnya akan terlihat lebih buruk.

Sama sekali tidak bekerja di berbagai codec video. Katakanlah Anda mengonversi video yang disandikan XviD dengan x264. 4 Untuk kedua codec ini, matriks kuantisasi yang digunakan secara internal berbeda - mereka tidak memiliki koefisien yang sama. Jadi opsi ini bahkan tidak masuk akal! Sayangnya, FFmpeg masih memungkinkan Anda untuk menggunakannya.

Intinya: Tolong jangan gunakan opsi itu kecuali Anda secara khusus tahu apa yang Anda lakukan. Jika Anda ingin menyandikan video Anda dengan codec yang berbeda, tetapi mempertahankan kualitasnya, maka Anda harus bereksperimen dan hanya mengatur kualitasnya sendiri. Lihat apakah hasilnya memuaskan, dan jika tidak, atur kualitas yang lebih tinggi. Itu sebanyak yang bisa Anda lakukan.

Terakhir, jika Anda ingin membaca tentang cara menjaga kualitas Anda saat melakukan enkode ulang, lihat posting ini:


1) Matriks tidak sesuai dengan gambar di sini, sungguh. Ini hanya sebuah contoh.
2) Sebenarnya, saat ini, sebagian besar proses pengkodean tidak hanya menggunakan satu matriks. Saat Anda menetapkan bit rate tertentu, encoder akan menggunakan matriks yang berbeda untuk mendapatkan bit rate rata-rata per detik. Demikian pula, ketika menetapkan kualitas tertentu, pembuat enkode modern menggunakan matriks yang berbeda tergantung pada konten. Ini karena beberapa konten "lebih mudah" untuk dikompres daripada yang lain dan memerlukan kuantisasi yang lebih sedikit untuk mendapatkan faktor kompresi yang sama.
3) Contoh: ffmpeg -i input.avi -sameq -c:v libxvid output.avi. Jangan gunakan ini. Silahkan.
4) Contoh: ffmpeg -i input.avi -sameq -c:v libx264 output.mp4. Jangan gunakan ini juga. Aku serius.

slhck
sumber
-sameqopsi telah ditinggalkan dan kemudian dihapus dari avconv
AzizSM